From e4fe14d2d51fe28040e5a6df9dce2cb66b8c9e8f Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 10:58:47 -0700 Subject: [PATCH 01/46] feat(briefs): add brief + campaign API and async orchestrator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the brief/campaign service layer on top of the #10 persistence: - Goa design (design/brief.go) + regenerated gen/ for the briefs service - BriefService handlers (create/get/put/refresh/approve/archive; campaigns subordinate to a brief; async job create + poll) - Async Orchestrator (errgroup-bounded multi-platform dispatch, job lifecycle). No platform dispatchers registered yet (LFXV2-2636..2640) — logs a startup warning; the job/persistence flow runs end to end regardless. - Wire briefs into the container + mount in server.go. Also mounts the CONNECTIONS server in server.go — that wiring was missing on main (the connection routes were constructed but never mounted), so this restores reachability for both connections and briefs. Rebuilt on top of reconstructed #10; gen/ regenerated via goa (not copied) so it matches the combined connection+brief design. No merged work reverted. LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 64 +- design/brief.go | 320 ++ gen/http/cli/lfx_v2_campaign_service/cli.go | 405 +- .../client/cli.go | 343 ++ .../client/client.go | 308 ++ .../client/encode_decode.go | 1653 +++++++ .../client/paths.go | 57 + .../client/types.go | 2109 +++++++++ .../server/encode_decode.go | 1281 ++++++ .../server/paths.go | 57 + .../server/server.go | 604 +++ .../server/types.go | 1500 +++++++ .../client/cli.go | 40 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 1581 +++++-- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 3994 ++++++++++++----- gen/lfx_v2_campaign_service_briefs/client.go | 200 + .../endpoints.go | 267 ++ gen/lfx_v2_campaign_service_briefs/service.go | 442 ++ internal/container/container.go | 19 + internal/service/brief.go | 274 ++ internal/service/orchestrator.go | 157 + internal/service/orchestrator_test.go | 170 + 24 files changed, 14350 insertions(+), 1499 deletions(-) create mode 100644 design/brief.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/client/cli.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/client/client.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/client/paths.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/client/types.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/server/paths.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/server/server.go create mode 100644 gen/http/lfx_v2_campaign_service_briefs/server/types.go create mode 100644 gen/lfx_v2_campaign_service_briefs/client.go create mode 100644 gen/lfx_v2_campaign_service_briefs/endpoints.go create mode 100644 gen/lfx_v2_campaign_service_briefs/service.go create mode 100644 internal/service/brief.go create mode 100644 internal/service/orchestrator.go create mode 100644 internal/service/orchestrator_test.go diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 6922ae50..32a8f743 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -15,8 +15,10 @@ import ( "os" "sync" + briefsvcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_briefs/server" connsvcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_connections/server" svcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_svc/server" + briefsvc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" connsvc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_connections" svc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_svc" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/container" @@ -46,25 +48,31 @@ func StartServer(ctx context.Context, cfg *config.Config) error { // debug-level logs elsewhere activate); it decodes no payload. endpoints := svc.NewEndpoints(cont.Service) - // The container always initializes Connections (NewContainer wires it in both - // the DB and no-DB paths), so construct the endpoints unconditionally. Fail - // loudly if it's unexpectedly nil rather than silently skipping the mount — - // a mis-wired container should crash at startup, not serve 404s on the - // connection routes. + // The container always initializes Connections and Briefs (NewContainer wires + // them in both the DB and no-DB paths), so construct the endpoints + // unconditionally. Fail loudly if either is unexpectedly nil rather than + // silently skipping the mount — a mis-wired container should crash at startup, + // not serve 404s on the connection/brief routes. debug.LogPayloads is + // intentionally NOT applied to any endpoint set: connection/brief payloads + // carry BearerTokens and plaintext provider credentials that would leak. if cont.Connections == nil { return fmt.Errorf("container misconfigured: Connections service is nil") } connEndpoints := connsvc.NewEndpoints(cont.Connections) + if cont.Briefs == nil { + return fmt.Errorf("container misconfigured: Briefs service is nil") + } + briefEndpoints := briefsvc.NewEndpoints(cont.Briefs) - return handleHTTPServer(ctx, cfg, endpoints, connEndpoints, cont) + return handleHTTPServer(ctx, cfg, endpoints, connEndpoints, briefEndpoints, cont) } -// buildMux constructs the Goa muxer and mounts BOTH the campaign service and the -// connection service onto it. It is a seam so tests can assert that the -// connection routes are actually reachable (the bug this fixes — routes that -// compile but are never mounted return 404) without standing up a full server. -// It returns an error only for a programmer-level mis-wiring (nil connEndpoints). -func buildMux(ctx context.Context, cfg *config.Config, endpoints *svc.Endpoints, connEndpoints *connsvc.Endpoints) (goahttp.Muxer, error) { +// buildMux constructs the Goa muxer and mounts the campaign, connection, and +// brief services onto it. It is a seam so tests can assert that the routes are +// actually reachable (the bug this fixes — routes that compile but are never +// mounted return 404) without standing up a full server. It returns an error +// only for a programmer-level mis-wiring (nil endpoints). +func buildMux(ctx context.Context, cfg *config.Config, endpoints *svc.Endpoints, connEndpoints *connsvc.Endpoints, briefEndpoints *briefsvc.Endpoints) (goahttp.Muxer, error) { mux := goahttp.NewMuxer() if cfg.Debug { debug.MountPprofHandlers(debug.Adapt(mux)) @@ -92,25 +100,41 @@ func buildMux(ctx context.Context, cfg *config.Config, endpoints *svc.Endpoints, ) svcsvr.Mount(mux, server) - // Mount the connection routes unconditionally. connEndpoints is always - // non-nil (StartServer constructs it and fails loudly if the service is - // mis-wired), and the connection service is wired even without a database - // (with a nil repo) so its routes return the typed 503 rather than a bare - // 404. A nil here would be a programmer error, so fail loudly rather than - // silently skipping the mount and serving 404s. + // Mount the connection and brief routes unconditionally. Both endpoint sets + // are always non-nil (StartServer constructs them and fails loudly if a + // service is mis-wired), and both are wired even without a database (nil repo) + // so their routes return the typed 503 rather than a bare 404. A nil here would + // be a programmer error, so fail loudly rather than silently skipping the mount + // and serving 404s. if connEndpoints == nil { return nil, fmt.Errorf("buildMux: connEndpoints is nil (connection routes would be unmounted)") } connServer := connsvcsvr.New(connEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, eh, nil) connsvcsvr.Mount(mux, connServer) + if briefEndpoints == nil { + return nil, fmt.Errorf("buildMux: briefEndpoints is nil (brief routes would be unmounted)") + } + briefServer := briefsvcsvr.New(briefEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, eh, nil) + briefsvcsvr.Mount(mux, briefServer) + return mux, nil } -func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.Endpoints, connEndpoints *connsvc.Endpoints, cont *container.Container) error { - mux, err := buildMux(ctx, cfg, endpoints, connEndpoints) +func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.Endpoints, connEndpoints *connsvc.Endpoints, briefEndpoints *briefsvc.Endpoints, cont *container.Container) error { + mux, err := buildMux(ctx, cfg, endpoints, connEndpoints, briefEndpoints) if err != nil { return err +======= + if connEndpoints != nil { + connServer := connsvcsvr.New(connEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, eh, nil) + connsvcsvr.Mount(mux, connServer) + } + + if briefEndpoints != nil { + briefServer := briefsvcsvr.New(briefEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, eh, nil) + briefsvcsvr.Mount(mux, briefServer) +>>>>>>> daac45d (feat(briefs): add brief + campaign API and async orchestrator) } var handler http.Handler = mux diff --git a/design/brief.go b/design/brief.go new file mode 100644 index 00000000..e6f2ca0c --- /dev/null +++ b/design/brief.go @@ -0,0 +1,320 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +// Package design — brief and campaign endpoints. +// +// Hierarchy: Project -> Brief -> Campaigns. A brief is the funnel unit +// (carries program_type) and is shared across channels; campaigns are a +// collection subordinate to the brief. Campaign creation is asynchronous: +// POST returns a job to poll. Every endpoint is gated on campaign_manager at +// the gateway. See docs/api-catalog.md. +package design + +import ( + //nolint:staticcheck // ST1001: the recommended way of using the goa DSL package is with the . import + . "goa.design/goa/v3/dsl" +) + +// ─── Brief types ─── + +// BriefInput is the mutable brief payload (create/replace). +var BriefInput = Type("brief-input", func() { + Attribute("program_type", String, "Funnel context", func() { + Enum("events", "education", "membership") + }) + Attribute("event_slug", String, "Event/course slug (unique within the project)") + Attribute("url", String, "Event/course page URL") + Attribute("platforms", ArrayOf(String), "Suggested default platforms (a planning hint; binding selection is on the campaign)") + Attribute("event_details", Any, "Extracted event/course details") + Attribute("copy", Any, "Ad copy") + Attribute("keywords", Any, "Keyword list") + Attribute("targeting", Any, "Targeting recommendation") + Required("program_type", "event_slug") +}) + +// Brief is the brief response view. +var Brief = Type("brief", func() { + Attribute("id", String, "Brief UUID") + Attribute("project_id", String, "Owning project") + Attribute("program_type", String, "Funnel context") + Attribute("event_slug", String, "Event/course slug") + Attribute("url", String, "Event/course page URL") + Attribute("platforms", ArrayOf(String), "Suggested default platforms") + Attribute("status", String, "Lifecycle status", func() { + Enum("draft", "approved", "archived") + }) + Attribute("version", Int64, "Optimistic-concurrency version") + Attribute("etag", String, "ETag header value (mirrors version)") + Required("id", "project_id", "program_type", "event_slug", "status", "version") +}) + +// ─── Campaign / job types ─── + +// CampaignCreateInput selects the platforms to launch on and their config. +var CampaignCreateInput = Type("campaign-create-input", func() { + Attribute("platforms", ArrayOf(String), "Platforms to create campaigns on (binding selection)") + Attribute("config", Any, "Per-platform campaign configuration") + Required("platforms") +}) + +// JobCreateResponse is returned immediately from POST .../campaigns. +var JobCreateResponse = Type("job-create-response", func() { + Attribute("job_id", String, "Poll GET /projects/{projectId}/jobs/{jobId}") + Attribute("status", String, "Initial status (always 'queued' on create)", func() { + Enum("queued") + }) + Attribute("platforms", ArrayOf(String), "Platforms this job will create on") + Required("job_id", "status") +}) + +// JobPollResponse is returned from GET .../jobs/{jobId}. +var JobPollResponse = Type("job-poll-response", func() { + Attribute("job_id", String, "Job UUID") + Attribute("status", String, "Job status", func() { + Enum("queued", "running", "succeeded", "partial", "failed") + }) + Attribute("result", Any, "Per-platform results, populated as each completes") + Attribute("error", String, "Terminal error, if any") + Required("job_id", "status") +}) + +// Campaign is a single platform's campaign under a brief. +var Campaign = Type("campaign", func() { + Attribute("id", String, "Campaign UUID") + Attribute("project_id", String, "Owning project") + Attribute("brief_id", String, "Parent brief") + Attribute("platform", String, "Channel") + Attribute("platform_campaign_id", String, "ID returned by the ad platform") + Attribute("campaign_name", String, "Campaign name") + Attribute("status", String, "Campaign status") + Attribute("version", Int64, "Optimistic-concurrency version") + Attribute("etag", String, "ETag header value (mirrors version)") + Required("id", "project_id", "brief_id", "platform", "campaign_name", "status", "version") +}) + +// CampaignUpdateInput is the mutable campaign payload (replace). +var CampaignUpdateInput = Type("campaign-update-input", func() { + Attribute("campaign_name", String, "Campaign name") + Attribute("status", String, "Campaign status") + Attribute("config", Any, "Campaign configuration snapshot") + Required("campaign_name", "status") +}) + +// ─── Brief + campaign service ─── + +var _ = Service("lfx-v2-campaign-service-briefs", func() { + Description("Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation.") + + Security(JWTAuth) + + Method("create-brief", func() { + Description("Create a brief.") + Payload(func() { + bearerToken() + projectIDAttr() + Attribute("brief", BriefInput) + Required("project_id", "brief") + }) + Result(Brief) + commonBriefErrors(true) + HTTP(func() { + POST("/projects/{project_id}/briefs") + Header("bearer_token:Authorization") + Response(StatusCreated, func() { Header("etag:ETag") }) + briefErrorResponses(true) + }) + }) + + Method("get-brief", func() { + Description("Get a brief; returns ETag.") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + Required("project_id", "brief_id") + }) + Result(Brief) + commonBriefErrors(false) + HTTP(func() { + GET("/projects/{project_id}/briefs/{brief_id}") + Header("bearer_token:Authorization") + Response(StatusOK, func() { Header("etag:ETag") }) + briefErrorResponses(false) + }) + }) + + Method("update-brief", func() { + Description("Replace a brief (requires If-Match).") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + ifMatchAttr() + Attribute("brief", BriefInput) + Required("project_id", "brief_id", "brief") + }) + Result(Brief) + commonBriefErrors(true) + Error("PreconditionFailed", PreconditionFailedError, "ETag mismatch") + Error("PreconditionRequired", PreconditionRequiredError, "If-Match header required") + HTTP(func() { + PUT("/projects/{project_id}/briefs/{brief_id}") + Header("bearer_token:Authorization") + Header("if_match:If-Match") + Response(StatusOK, func() { Header("etag:ETag") }) + briefErrorResponses(true) + Response("PreconditionFailed", StatusPreconditionFailed) + Response("PreconditionRequired", StatusPreconditionRequired) + }) + }) + + Method("approve-brief", func() { + Description("Approve a brief for campaign creation.") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + Required("project_id", "brief_id") + }) + Result(Brief) + commonBriefErrors(false) + HTTP(func() { + POST("/projects/{project_id}/briefs/{brief_id}/approve") + Header("bearer_token:Authorization") + Response(StatusOK, func() { Header("etag:ETag") }) + briefErrorResponses(false) + }) + }) + + Method("delete-brief", func() { + Description("Archive a brief (soft delete).") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + Required("project_id", "brief_id") + }) + commonBriefErrors(false) + HTTP(func() { + DELETE("/projects/{project_id}/briefs/{brief_id}") + Header("bearer_token:Authorization") + Response(StatusNoContent) + briefErrorResponses(false) + }) + }) + + Method("create-campaigns", func() { + Description("Create campaigns across the selected platforms (async -> job).") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + Attribute("input", CampaignCreateInput) + Required("project_id", "brief_id", "input") + }) + Result(JobCreateResponse) + commonBriefErrors(true) + HTTP(func() { + POST("/projects/{project_id}/briefs/{brief_id}/campaigns") + Header("bearer_token:Authorization") + Response(StatusAccepted) + briefErrorResponses(true) + }) + }) + + Method("get-campaign", func() { + Description("Get one campaign under a brief; returns ETag.") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + campaignIDAttr() + Required("project_id", "brief_id", "campaign_id") + }) + Result(Campaign) + commonBriefErrors(false) + HTTP(func() { + GET("/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}") + Header("bearer_token:Authorization") + Response(StatusOK, func() { Header("etag:ETag") }) + briefErrorResponses(false) + }) + }) + + Method("update-campaign", func() { + Description("Replace a campaign (requires If-Match).") + Payload(func() { + bearerToken() + projectIDAttr() + briefIDAttr() + campaignIDAttr() + ifMatchAttr() + Attribute("campaign", CampaignUpdateInput) + Required("project_id", "brief_id", "campaign_id", "campaign") + }) + Result(Campaign) + commonBriefErrors(true) + Error("PreconditionFailed", PreconditionFailedError, "ETag mismatch") + Error("PreconditionRequired", PreconditionRequiredError, "If-Match header required") + HTTP(func() { + PUT("/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}") + Header("bearer_token:Authorization") + Header("if_match:If-Match") + Response(StatusOK, func() { Header("etag:ETag") }) + briefErrorResponses(true) + Response("PreconditionFailed", StatusPreconditionFailed) + Response("PreconditionRequired", StatusPreconditionRequired) + }) + }) + + Method("get-job", func() { + Description("Poll campaign-creation job status.") + Payload(func() { + bearerToken() + projectIDAttr() + Attribute("job_id", String, "Job UUID") + Required("project_id", "job_id") + }) + Result(JobPollResponse) + commonBriefErrors(false) + HTTP(func() { + GET("/projects/{project_id}/jobs/{job_id}") + Header("bearer_token:Authorization") + Response(StatusOK) + briefErrorResponses(false) + }) + }) +}) + +// ─── shared DSL helpers for briefs ─── + +func briefIDAttr() { + Attribute("brief_id", String, "Brief UUID") +} + +func campaignIDAttr() { + Attribute("campaign_id", String, "Campaign UUID") +} + +// commonBriefErrors declares the standard error set for a brief method. +// withBadRequest adds BadRequest for methods that accept a body. +func commonBriefErrors(withBadRequest bool) { + if withBadRequest { + Error("BadRequest", BadRequestError, "Bad request") + } + Error("NotFound", NotFoundError, "Resource not found") + Error("Conflict", ConflictError, "Conflict") + Error("InternalServerError", InternalServerError, "Internal server error") + Error("ServiceUnavailable", ConnServiceUnavailableError, "Service unavailable") +} + +// briefErrorResponses maps the standard errors to HTTP responses. +func briefErrorResponses(withBadRequest bool) { + if withBadRequest { + Response("BadRequest", StatusBadRequest) + } + Response("NotFound", StatusNotFound) + Response("Conflict", StatusConflict) + Response("InternalServerError", StatusInternalServerError) + Response("ServiceUnavailable", StatusServiceUnavailable) +} diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index c1b47439..194c6cb1 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -13,6 +13,7 @@ import ( "net/http" "os" + lfxv2campaignservicebriefsc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_briefs/client" lfxv2campaignserviceconnectionsc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_connections/client" lfxv2campaignservicesvcc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_svc/client" goahttp "goa.design/goa/v3/http" @@ -24,6 +25,7 @@ import ( // command (subcommand1|subcommand2|...) func UsageCommands() []string { return []string{ + "lfx-v2-campaign-service-briefs (create-brief|get-brief|update-brief|approve-brief|delete-brief|create-campaigns|get-campaign|update-campaign|get-job)", "lfx-v2-campaign-service-connections (create-google-ads|get-google-ads|update-google-ads|delete-google-ads|test-google-ads|set-credential-google-ads|create-linkedin-ads|get-linkedin-ads|update-linkedin-ads|delete-linkedin-ads|test-linkedin-ads|set-credential-linkedin-ads|create-meta-ads|get-meta-ads|update-meta-ads|delete-meta-ads|test-meta-ads|set-credential-meta-ads|create-reddit-ads|get-reddit-ads|update-reddit-ads|delete-reddit-ads|test-reddit-ads|set-credential-reddit-ads|create-twitter-ads|get-twitter-ads|update-twitter-ads|delete-twitter-ads|test-twitter-ads|set-credential-twitter-ads|create-microsoft-ads|get-microsoft-ads|update-microsoft-ads|delete-microsoft-ads|test-microsoft-ads|set-credential-microsoft-ads|create-hubspot|get-hubspot|update-hubspot|delete-hubspot|test-hubspot|set-credential-hubspot)", "lfx-v2-campaign-service-svc (readyz|livez)", } @@ -31,7 +33,8 @@ func UsageCommands() []string { // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Recusandae nam autem dicta perspiciatis quod.\",\n \"client_secret\": \"Quo voluptatem quas culpa omnis consequuntur iste.\",\n \"developer_token\": \"Id magnam id nihil fugiat.\",\n \"refresh_token\": \"Inventore quisquam laudantium velit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + os.Args[0] + " " + "lfx-v2-campaign-service-svc readyz" + "\n" + "" } @@ -46,6 +49,60 @@ func ParseEndpoint( restore bool, ) (goa.Endpoint, any, error) { var ( + lfxV2CampaignServiceBriefsFlags = flag.NewFlagSet("lfx-v2-campaign-service-briefs", flag.ContinueOnError) + + lfxV2CampaignServiceBriefsCreateBriefFlags = flag.NewFlagSet("create-brief", flag.ExitOnError) + lfxV2CampaignServiceBriefsCreateBriefBodyFlag = lfxV2CampaignServiceBriefsCreateBriefFlags.String("body", "REQUIRED", "") + lfxV2CampaignServiceBriefsCreateBriefProjectIDFlag = lfxV2CampaignServiceBriefsCreateBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsCreateBriefBearerTokenFlag = lfxV2CampaignServiceBriefsCreateBriefFlags.String("bearer-token", "", "") + + lfxV2CampaignServiceBriefsGetBriefFlags = flag.NewFlagSet("get-brief", flag.ExitOnError) + lfxV2CampaignServiceBriefsGetBriefProjectIDFlag = lfxV2CampaignServiceBriefsGetBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsGetBriefBriefIDFlag = lfxV2CampaignServiceBriefsGetBriefFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsGetBriefBearerTokenFlag = lfxV2CampaignServiceBriefsGetBriefFlags.String("bearer-token", "", "") + + lfxV2CampaignServiceBriefsUpdateBriefFlags = flag.NewFlagSet("update-brief", flag.ExitOnError) + lfxV2CampaignServiceBriefsUpdateBriefBodyFlag = lfxV2CampaignServiceBriefsUpdateBriefFlags.String("body", "REQUIRED", "") + lfxV2CampaignServiceBriefsUpdateBriefProjectIDFlag = lfxV2CampaignServiceBriefsUpdateBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsUpdateBriefBriefIDFlag = lfxV2CampaignServiceBriefsUpdateBriefFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsUpdateBriefBearerTokenFlag = lfxV2CampaignServiceBriefsUpdateBriefFlags.String("bearer-token", "", "") + lfxV2CampaignServiceBriefsUpdateBriefIfMatchFlag = lfxV2CampaignServiceBriefsUpdateBriefFlags.String("if-match", "", "") + + lfxV2CampaignServiceBriefsApproveBriefFlags = flag.NewFlagSet("approve-brief", flag.ExitOnError) + lfxV2CampaignServiceBriefsApproveBriefProjectIDFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsApproveBriefBriefIDFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsApproveBriefBearerTokenFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("bearer-token", "", "") + + lfxV2CampaignServiceBriefsDeleteBriefFlags = flag.NewFlagSet("delete-brief", flag.ExitOnError) + lfxV2CampaignServiceBriefsDeleteBriefProjectIDFlag = lfxV2CampaignServiceBriefsDeleteBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsDeleteBriefBriefIDFlag = lfxV2CampaignServiceBriefsDeleteBriefFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsDeleteBriefBearerTokenFlag = lfxV2CampaignServiceBriefsDeleteBriefFlags.String("bearer-token", "", "") + + lfxV2CampaignServiceBriefsCreateCampaignsFlags = flag.NewFlagSet("create-campaigns", flag.ExitOnError) + lfxV2CampaignServiceBriefsCreateCampaignsBodyFlag = lfxV2CampaignServiceBriefsCreateCampaignsFlags.String("body", "REQUIRED", "") + lfxV2CampaignServiceBriefsCreateCampaignsProjectIDFlag = lfxV2CampaignServiceBriefsCreateCampaignsFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsCreateCampaignsBriefIDFlag = lfxV2CampaignServiceBriefsCreateCampaignsFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsCreateCampaignsBearerTokenFlag = lfxV2CampaignServiceBriefsCreateCampaignsFlags.String("bearer-token", "", "") + + lfxV2CampaignServiceBriefsGetCampaignFlags = flag.NewFlagSet("get-campaign", flag.ExitOnError) + lfxV2CampaignServiceBriefsGetCampaignProjectIDFlag = lfxV2CampaignServiceBriefsGetCampaignFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsGetCampaignBriefIDFlag = lfxV2CampaignServiceBriefsGetCampaignFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsGetCampaignCampaignIDFlag = lfxV2CampaignServiceBriefsGetCampaignFlags.String("campaign-id", "REQUIRED", "Campaign UUID") + lfxV2CampaignServiceBriefsGetCampaignBearerTokenFlag = lfxV2CampaignServiceBriefsGetCampaignFlags.String("bearer-token", "", "") + + lfxV2CampaignServiceBriefsUpdateCampaignFlags = flag.NewFlagSet("update-campaign", flag.ExitOnError) + lfxV2CampaignServiceBriefsUpdateCampaignBodyFlag = lfxV2CampaignServiceBriefsUpdateCampaignFlags.String("body", "REQUIRED", "") + lfxV2CampaignServiceBriefsUpdateCampaignProjectIDFlag = lfxV2CampaignServiceBriefsUpdateCampaignFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsUpdateCampaignBriefIDFlag = lfxV2CampaignServiceBriefsUpdateCampaignFlags.String("brief-id", "REQUIRED", "Brief UUID") + lfxV2CampaignServiceBriefsUpdateCampaignCampaignIDFlag = lfxV2CampaignServiceBriefsUpdateCampaignFlags.String("campaign-id", "REQUIRED", "Campaign UUID") + lfxV2CampaignServiceBriefsUpdateCampaignBearerTokenFlag = lfxV2CampaignServiceBriefsUpdateCampaignFlags.String("bearer-token", "", "") + lfxV2CampaignServiceBriefsUpdateCampaignIfMatchFlag = lfxV2CampaignServiceBriefsUpdateCampaignFlags.String("if-match", "", "") + + lfxV2CampaignServiceBriefsGetJobFlags = flag.NewFlagSet("get-job", flag.ExitOnError) + lfxV2CampaignServiceBriefsGetJobProjectIDFlag = lfxV2CampaignServiceBriefsGetJobFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") + lfxV2CampaignServiceBriefsGetJobJobIDFlag = lfxV2CampaignServiceBriefsGetJobFlags.String("job-id", "REQUIRED", "Job UUID") + lfxV2CampaignServiceBriefsGetJobBearerTokenFlag = lfxV2CampaignServiceBriefsGetJobFlags.String("bearer-token", "", "") + lfxV2CampaignServiceConnectionsFlags = flag.NewFlagSet("lfx-v2-campaign-service-connections", flag.ContinueOnError) lfxV2CampaignServiceConnectionsCreateGoogleAdsFlags = flag.NewFlagSet("create-google-ads", flag.ExitOnError) @@ -250,6 +307,17 @@ func ParseEndpoint( lfxV2CampaignServiceSvcLivezFlags = flag.NewFlagSet("livez", flag.ExitOnError) ) + lfxV2CampaignServiceBriefsFlags.Usage = lfxV2CampaignServiceBriefsUsage + lfxV2CampaignServiceBriefsCreateBriefFlags.Usage = lfxV2CampaignServiceBriefsCreateBriefUsage + lfxV2CampaignServiceBriefsGetBriefFlags.Usage = lfxV2CampaignServiceBriefsGetBriefUsage + lfxV2CampaignServiceBriefsUpdateBriefFlags.Usage = lfxV2CampaignServiceBriefsUpdateBriefUsage + lfxV2CampaignServiceBriefsApproveBriefFlags.Usage = lfxV2CampaignServiceBriefsApproveBriefUsage + lfxV2CampaignServiceBriefsDeleteBriefFlags.Usage = lfxV2CampaignServiceBriefsDeleteBriefUsage + lfxV2CampaignServiceBriefsCreateCampaignsFlags.Usage = lfxV2CampaignServiceBriefsCreateCampaignsUsage + lfxV2CampaignServiceBriefsGetCampaignFlags.Usage = lfxV2CampaignServiceBriefsGetCampaignUsage + lfxV2CampaignServiceBriefsUpdateCampaignFlags.Usage = lfxV2CampaignServiceBriefsUpdateCampaignUsage + lfxV2CampaignServiceBriefsGetJobFlags.Usage = lfxV2CampaignServiceBriefsGetJobUsage + lfxV2CampaignServiceConnectionsFlags.Usage = lfxV2CampaignServiceConnectionsUsage lfxV2CampaignServiceConnectionsCreateGoogleAdsFlags.Usage = lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage lfxV2CampaignServiceConnectionsGetGoogleAdsFlags.Usage = lfxV2CampaignServiceConnectionsGetGoogleAdsUsage @@ -313,6 +381,8 @@ func ParseEndpoint( { svcn = flag.Arg(0) switch svcn { + case "lfx-v2-campaign-service-briefs": + svcf = lfxV2CampaignServiceBriefsFlags case "lfx-v2-campaign-service-connections": svcf = lfxV2CampaignServiceConnectionsFlags case "lfx-v2-campaign-service-svc": @@ -332,6 +402,37 @@ func ParseEndpoint( { epn = svcf.Arg(0) switch svcn { + case "lfx-v2-campaign-service-briefs": + switch epn { + case "create-brief": + epf = lfxV2CampaignServiceBriefsCreateBriefFlags + + case "get-brief": + epf = lfxV2CampaignServiceBriefsGetBriefFlags + + case "update-brief": + epf = lfxV2CampaignServiceBriefsUpdateBriefFlags + + case "approve-brief": + epf = lfxV2CampaignServiceBriefsApproveBriefFlags + + case "delete-brief": + epf = lfxV2CampaignServiceBriefsDeleteBriefFlags + + case "create-campaigns": + epf = lfxV2CampaignServiceBriefsCreateCampaignsFlags + + case "get-campaign": + epf = lfxV2CampaignServiceBriefsGetCampaignFlags + + case "update-campaign": + epf = lfxV2CampaignServiceBriefsUpdateCampaignFlags + + case "get-job": + epf = lfxV2CampaignServiceBriefsGetJobFlags + + } + case "lfx-v2-campaign-service-connections": switch epn { case "create-google-ads": @@ -492,6 +593,37 @@ func ParseEndpoint( ) { switch svcn { + case "lfx-v2-campaign-service-briefs": + c := lfxv2campaignservicebriefsc.NewClient(scheme, host, doer, enc, dec, restore) + switch epn { + case "create-brief": + endpoint = c.CreateBrief() + data, err = lfxv2campaignservicebriefsc.BuildCreateBriefPayload(*lfxV2CampaignServiceBriefsCreateBriefBodyFlag, *lfxV2CampaignServiceBriefsCreateBriefProjectIDFlag, *lfxV2CampaignServiceBriefsCreateBriefBearerTokenFlag) + case "get-brief": + endpoint = c.GetBrief() + data, err = lfxv2campaignservicebriefsc.BuildGetBriefPayload(*lfxV2CampaignServiceBriefsGetBriefProjectIDFlag, *lfxV2CampaignServiceBriefsGetBriefBriefIDFlag, *lfxV2CampaignServiceBriefsGetBriefBearerTokenFlag) + case "update-brief": + endpoint = c.UpdateBrief() + data, err = lfxv2campaignservicebriefsc.BuildUpdateBriefPayload(*lfxV2CampaignServiceBriefsUpdateBriefBodyFlag, *lfxV2CampaignServiceBriefsUpdateBriefProjectIDFlag, *lfxV2CampaignServiceBriefsUpdateBriefBriefIDFlag, *lfxV2CampaignServiceBriefsUpdateBriefBearerTokenFlag, *lfxV2CampaignServiceBriefsUpdateBriefIfMatchFlag) + case "approve-brief": + endpoint = c.ApproveBrief() + data, err = lfxv2campaignservicebriefsc.BuildApproveBriefPayload(*lfxV2CampaignServiceBriefsApproveBriefProjectIDFlag, *lfxV2CampaignServiceBriefsApproveBriefBriefIDFlag, *lfxV2CampaignServiceBriefsApproveBriefBearerTokenFlag) + case "delete-brief": + endpoint = c.DeleteBrief() + data, err = lfxv2campaignservicebriefsc.BuildDeleteBriefPayload(*lfxV2CampaignServiceBriefsDeleteBriefProjectIDFlag, *lfxV2CampaignServiceBriefsDeleteBriefBriefIDFlag, *lfxV2CampaignServiceBriefsDeleteBriefBearerTokenFlag) + case "create-campaigns": + endpoint = c.CreateCampaigns() + data, err = lfxv2campaignservicebriefsc.BuildCreateCampaignsPayload(*lfxV2CampaignServiceBriefsCreateCampaignsBodyFlag, *lfxV2CampaignServiceBriefsCreateCampaignsProjectIDFlag, *lfxV2CampaignServiceBriefsCreateCampaignsBriefIDFlag, *lfxV2CampaignServiceBriefsCreateCampaignsBearerTokenFlag) + case "get-campaign": + endpoint = c.GetCampaign() + data, err = lfxv2campaignservicebriefsc.BuildGetCampaignPayload(*lfxV2CampaignServiceBriefsGetCampaignProjectIDFlag, *lfxV2CampaignServiceBriefsGetCampaignBriefIDFlag, *lfxV2CampaignServiceBriefsGetCampaignCampaignIDFlag, *lfxV2CampaignServiceBriefsGetCampaignBearerTokenFlag) + case "update-campaign": + endpoint = c.UpdateCampaign() + data, err = lfxv2campaignservicebriefsc.BuildUpdateCampaignPayload(*lfxV2CampaignServiceBriefsUpdateCampaignBodyFlag, *lfxV2CampaignServiceBriefsUpdateCampaignProjectIDFlag, *lfxV2CampaignServiceBriefsUpdateCampaignBriefIDFlag, *lfxV2CampaignServiceBriefsUpdateCampaignCampaignIDFlag, *lfxV2CampaignServiceBriefsUpdateCampaignBearerTokenFlag, *lfxV2CampaignServiceBriefsUpdateCampaignIfMatchFlag) + case "get-job": + endpoint = c.GetJob() + data, err = lfxv2campaignservicebriefsc.BuildGetJobPayload(*lfxV2CampaignServiceBriefsGetJobProjectIDFlag, *lfxV2CampaignServiceBriefsGetJobJobIDFlag, *lfxV2CampaignServiceBriefsGetJobBearerTokenFlag) + } case "lfx-v2-campaign-service-connections": c := lfxv2campaignserviceconnectionsc.NewClient(scheme, host, doer, enc, dec, restore) switch epn { @@ -639,6 +771,237 @@ func ParseEndpoint( return endpoint, data, nil } +// lfxV2CampaignServiceBriefsUsage displays the usage of the +// lfx-v2-campaign-service-briefs command and its subcommands. +func lfxV2CampaignServiceBriefsUsage() { + fmt.Fprintln(os.Stderr, `Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation.`) + fmt.Fprintf(os.Stderr, "Usage:\n %s [globalflags] lfx-v2-campaign-service-briefs COMMAND [flags]\n\n", os.Args[0]) + fmt.Fprintln(os.Stderr, "COMMAND:") + fmt.Fprintln(os.Stderr, ` create-brief: Create a brief.`) + fmt.Fprintln(os.Stderr, ` get-brief: Get a brief; returns ETag.`) + fmt.Fprintln(os.Stderr, ` update-brief: Replace a brief (requires If-Match).`) + fmt.Fprintln(os.Stderr, ` approve-brief: Approve a brief for campaign creation.`) + fmt.Fprintln(os.Stderr, ` delete-brief: Archive a brief (soft delete).`) + fmt.Fprintln(os.Stderr, ` create-campaigns: Create campaigns across the selected platforms (async -> job).`) + fmt.Fprintln(os.Stderr, ` get-campaign: Get one campaign under a brief; returns ETag.`) + fmt.Fprintln(os.Stderr, ` update-campaign: Replace a campaign (requires If-Match).`) + fmt.Fprintln(os.Stderr, ` get-job: Poll campaign-creation job status.`) + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Additional help:") + fmt.Fprintf(os.Stderr, " %s lfx-v2-campaign-service-briefs COMMAND --help\n", os.Args[0]) +} +func lfxV2CampaignServiceBriefsCreateBriefUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs create-brief", os.Args[0]) + fmt.Fprint(os.Stderr, " -body JSON") + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Create a brief.`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -body JSON: `) + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") +} + +func lfxV2CampaignServiceBriefsGetBriefUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs get-brief", os.Args[0]) + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Get a brief; returns ETag.`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"Et architecto voluptas ratione delectus ut.\" --bearer-token \"eyJhbGci...\"") +} + +func lfxV2CampaignServiceBriefsUpdateBriefUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs update-brief", os.Args[0]) + fmt.Fprint(os.Stderr, " -body JSON") + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprint(os.Stderr, " -if-match STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Replace a brief (requires If-Match).`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -body JSON: `) + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + fmt.Fprintln(os.Stderr, ` -if-match STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }' --project-id \"cncf\" --brief-id \"Eligendi voluptas non.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") +} + +func lfxV2CampaignServiceBriefsApproveBriefUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs approve-brief", os.Args[0]) + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Approve a brief for campaign creation.`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"Sint eveniet dicta numquam doloremque ab cumque.\" --bearer-token \"eyJhbGci...\"") +} + +func lfxV2CampaignServiceBriefsDeleteBriefUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs delete-brief", os.Args[0]) + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Archive a brief (soft delete).`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"Dolores omnis rem non natus.\" --bearer-token \"eyJhbGci...\"") +} + +func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs create-campaigns", os.Args[0]) + fmt.Fprint(os.Stderr, " -body JSON") + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Create campaigns across the selected platforms (async -> job).`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -body JSON: `) + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Eligendi earum qui est et id laudantium.\",\n \"platforms\": [\n \"Ea magnam ut nihil quo tenetur.\",\n \"Fugiat natus.\",\n \"Et tempore.\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"Ratione incidunt est saepe.\" --bearer-token \"eyJhbGci...\"") +} + +func lfxV2CampaignServiceBriefsGetCampaignUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs get-campaign", os.Args[0]) + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -campaign-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Get one campaign under a brief; returns ETag.`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -campaign-id STRING: Campaign UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"Qui praesentium ea praesentium.\" --campaign-id \"Asperiores iure dolore et et aut nam.\" --bearer-token \"eyJhbGci...\"") +} + +func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs update-campaign", os.Args[0]) + fmt.Fprint(os.Stderr, " -body JSON") + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -brief-id STRING") + fmt.Fprint(os.Stderr, " -campaign-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprint(os.Stderr, " -if-match STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Replace a campaign (requires If-Match).`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -body JSON: `) + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) + fmt.Fprintln(os.Stderr, ` -campaign-id STRING: Campaign UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + fmt.Fprintln(os.Stderr, ` -if-match STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Hic voluptas debitis error.\",\n \"config\": \"Ut consectetur.\",\n \"status\": \"Veniam eum ut libero quibusdam debitis.\"\n }\n }' --project-id \"cncf\" --brief-id \"Commodi quam voluptates.\" --campaign-id \"Optio dolorem omnis.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") +} + +func lfxV2CampaignServiceBriefsGetJobUsage() { + // Header with flags + fmt.Fprintf(os.Stderr, "%s [flags] lfx-v2-campaign-service-briefs get-job", os.Args[0]) + fmt.Fprint(os.Stderr, " -project-id STRING") + fmt.Fprint(os.Stderr, " -job-id STRING") + fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprintln(os.Stderr) + + // Description + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, `Poll campaign-creation job status.`) + + // Flags list + fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) + fmt.Fprintln(os.Stderr, ` -job-id STRING: Job UUID`) + fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + + fmt.Fprintln(os.Stderr) + fmt.Fprintln(os.Stderr, "Example:") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"Placeat enim.\" --bearer-token \"eyJhbGci...\"") +} + // lfxV2CampaignServiceConnectionsUsage displays the usage of the // lfx-v2-campaign-service-connections command and its subcommands. func lfxV2CampaignServiceConnectionsUsage() { @@ -710,7 +1073,7 @@ func lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Recusandae nam autem dicta perspiciatis quod.\",\n \"client_secret\": \"Quo voluptatem quas culpa omnis consequuntur iste.\",\n \"developer_token\": \"Id magnam id nihil fugiat.\",\n \"refresh_token\": \"Inventore quisquam laudantium velit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetGoogleAdsUsage() { @@ -816,7 +1179,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Recusandae nam autem dicta perspiciatis quod.\",\n \"client_secret\": \"Quo voluptatem quas culpa omnis consequuntur iste.\",\n \"developer_token\": \"Id magnam id nihil fugiat.\",\n \"refresh_token\": \"Inventore quisquam laudantium velit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { @@ -838,7 +1201,7 @@ func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Fugit voluptatem.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Amet necessitatibus corrupti quaerat molestiae maiores.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetLinkedinAdsUsage() { @@ -882,7 +1245,7 @@ func lfxV2CampaignServiceConnectionsUpdateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Fugit voluptatem.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteLinkedinAdsUsage() { @@ -944,7 +1307,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Amet necessitatibus corrupti quaerat molestiae maiores.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { @@ -966,7 +1329,7 @@ func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Eligendi vero temporibus.\",\n \"label\": \"Non maiores quae sed quia.\",\n \"page_id\": \"Facilis eum ipsam.\"\n },\n \"credentials\": {\n \"access_token\": \"Soluta quas voluptas minus possimus quos praesentium.\",\n \"app_secret\": \"Repudiandae consequatur fuga dolores.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMetaAdsUsage() { @@ -1010,7 +1373,7 @@ func lfxV2CampaignServiceConnectionsUpdateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Eligendi vero temporibus.\",\n \"label\": \"Non maiores quae sed quia.\",\n \"page_id\": \"Facilis eum ipsam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMetaAdsUsage() { @@ -1072,7 +1435,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Soluta quas voluptas minus possimus quos praesentium.\",\n \"app_secret\": \"Repudiandae consequatur fuga dolores.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { @@ -1094,7 +1457,7 @@ func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Ut est nobis aspernatur.\"\n },\n \"credentials\": {\n \"client_id\": \"Fugit qui tempora commodi reiciendis sit alias.\",\n \"client_secret\": \"Ea enim quidem odio et sequi consequatur.\",\n \"refresh_token\": \"Provident itaque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n },\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetRedditAdsUsage() { @@ -1138,7 +1501,7 @@ func lfxV2CampaignServiceConnectionsUpdateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Ut est nobis aspernatur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteRedditAdsUsage() { @@ -1200,7 +1563,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Fugit qui tempora commodi reiciendis sit alias.\",\n \"client_secret\": \"Ea enim quidem odio et sequi consequatur.\",\n \"refresh_token\": \"Provident itaque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { @@ -1222,7 +1585,7 @@ func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Eveniet dicta numquam doloremque.\",\n \"label\": \"Ea velit et assumenda recusandae enim.\"\n },\n \"credentials\": {\n \"access_token\": \"Ipsum quia ad a.\",\n \"access_token_secret\": \"Veritatis omnis excepturi.\",\n \"consumer_key\": \"Cumque libero.\",\n \"consumer_secret\": \"Id incidunt qui et ratione sit quaerat.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n },\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetTwitterAdsUsage() { @@ -1266,7 +1629,7 @@ func lfxV2CampaignServiceConnectionsUpdateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Eveniet dicta numquam doloremque.\",\n \"label\": \"Ea velit et assumenda recusandae enim.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteTwitterAdsUsage() { @@ -1328,7 +1691,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Ipsum quia ad a.\",\n \"access_token_secret\": \"Veritatis omnis excepturi.\",\n \"consumer_key\": \"Cumque libero.\",\n \"consumer_secret\": \"Id incidunt qui et ratione sit quaerat.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { @@ -1350,7 +1713,7 @@ func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Sint qui praesentium ea praesentium magni.\",\n \"customer_id\": \"Iure dolore et et aut nam.\",\n \"label\": \"Consequuntur neque mollitia quia.\"\n },\n \"credentials\": {\n \"client_id\": \"Voluptates odit consequatur quis.\",\n \"client_secret\": \"Est voluptatum enim earum et doloribus.\",\n \"developer_token\": \"Id ducimus eius et laboriosam omnis vitae.\",\n \"refresh_token\": \"Ea consequatur et ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n },\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMicrosoftAdsUsage() { @@ -1394,7 +1757,7 @@ func lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Sint qui praesentium ea praesentium magni.\",\n \"customer_id\": \"Iure dolore et et aut nam.\",\n \"label\": \"Consequuntur neque mollitia quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMicrosoftAdsUsage() { @@ -1456,7 +1819,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Voluptates odit consequatur quis.\",\n \"client_secret\": \"Est voluptatum enim earum et doloribus.\",\n \"developer_token\": \"Id ducimus eius et laboriosam omnis vitae.\",\n \"refresh_token\": \"Ea consequatur et ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { @@ -1478,7 +1841,7 @@ func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Temporibus voluptas inventore sit omnis.\",\n \"brand_kit\": \"Quis facere sint totam sapiente.\",\n \"label\": \"Sint nihil.\",\n \"portal_id\": \"Expedita veniam beatae autem.\",\n \"sender_email\": \"Placeat enim.\",\n \"sender_name\": \"Nesciunt asperiores et est.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Numquam ut nesciunt voluptas.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetHubspotUsage() { @@ -1522,7 +1885,7 @@ func lfxV2CampaignServiceConnectionsUpdateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Temporibus voluptas inventore sit omnis.\",\n \"brand_kit\": \"Quis facere sint totam sapiente.\",\n \"label\": \"Sint nihil.\",\n \"portal_id\": \"Expedita veniam beatae autem.\",\n \"sender_email\": \"Placeat enim.\",\n \"sender_name\": \"Nesciunt asperiores et est.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteHubspotUsage() { @@ -1584,7 +1947,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Numquam ut nesciunt voluptas.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceSvcUsage displays the usage of the diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go new file mode 100644 index 00000000..dbc29cfd --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -0,0 +1,343 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs HTTP client CLI support package +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package client + +import ( + "encoding/json" + "fmt" + + lfxv2campaignservicebriefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + goa "goa.design/goa/v3/pkg" +) + +// BuildCreateBriefPayload builds the payload for the +// lfx-v2-campaign-service-briefs create-brief endpoint from CLI flags. +func BuildCreateBriefPayload(lfxV2CampaignServiceBriefsCreateBriefBody string, lfxV2CampaignServiceBriefsCreateBriefProjectID string, lfxV2CampaignServiceBriefsCreateBriefBearerToken string) (*lfxv2campaignservicebriefs.CreateBriefPayload, error) { + var err error + var body CreateBriefRequestBody + { + err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateBriefBody), &body) + if err != nil { + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }'") + } + if body.Brief == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) + } + if body.Brief != nil { + if err2 := ValidateBriefInputRequestBody(body.Brief); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + if err != nil { + return nil, err + } + } + var projectID string + { + projectID = lfxV2CampaignServiceBriefsCreateBriefProjectID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsCreateBriefBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsCreateBriefBearerToken + } + } + v := &lfxv2campaignservicebriefs.CreateBriefPayload{} + if body.Brief != nil { + v.Brief = marshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput(body.Brief) + } + v.ProjectID = projectID + v.BearerToken = bearerToken + + return v, nil +} + +// BuildGetBriefPayload builds the payload for the +// lfx-v2-campaign-service-briefs get-brief endpoint from CLI flags. +func BuildGetBriefPayload(lfxV2CampaignServiceBriefsGetBriefProjectID string, lfxV2CampaignServiceBriefsGetBriefBriefID string, lfxV2CampaignServiceBriefsGetBriefBearerToken string) (*lfxv2campaignservicebriefs.GetBriefPayload, error) { + var projectID string + { + projectID = lfxV2CampaignServiceBriefsGetBriefProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsGetBriefBriefID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsGetBriefBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsGetBriefBearerToken + } + } + v := &lfxv2campaignservicebriefs.GetBriefPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v, nil +} + +// BuildUpdateBriefPayload builds the payload for the +// lfx-v2-campaign-service-briefs update-brief endpoint from CLI flags. +func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, lfxV2CampaignServiceBriefsUpdateBriefProjectID string, lfxV2CampaignServiceBriefsUpdateBriefBriefID string, lfxV2CampaignServiceBriefsUpdateBriefBearerToken string, lfxV2CampaignServiceBriefsUpdateBriefIfMatch string) (*lfxv2campaignservicebriefs.UpdateBriefPayload, error) { + var err error + var body UpdateBriefRequestBody + { + err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateBriefBody), &body) + if err != nil { + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }'") + } + if body.Brief == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) + } + if body.Brief != nil { + if err2 := ValidateBriefInputRequestBody(body.Brief); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + if err != nil { + return nil, err + } + } + var projectID string + { + projectID = lfxV2CampaignServiceBriefsUpdateBriefProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsUpdateBriefBriefID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsUpdateBriefBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsUpdateBriefBearerToken + } + } + var ifMatch *string + { + if lfxV2CampaignServiceBriefsUpdateBriefIfMatch != "" { + ifMatch = &lfxV2CampaignServiceBriefsUpdateBriefIfMatch + } + } + v := &lfxv2campaignservicebriefs.UpdateBriefPayload{} + if body.Brief != nil { + v.Brief = marshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput(body.Brief) + } + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + v.IfMatch = ifMatch + + return v, nil +} + +// BuildApproveBriefPayload builds the payload for the +// lfx-v2-campaign-service-briefs approve-brief endpoint from CLI flags. +func BuildApproveBriefPayload(lfxV2CampaignServiceBriefsApproveBriefProjectID string, lfxV2CampaignServiceBriefsApproveBriefBriefID string, lfxV2CampaignServiceBriefsApproveBriefBearerToken string) (*lfxv2campaignservicebriefs.ApproveBriefPayload, error) { + var projectID string + { + projectID = lfxV2CampaignServiceBriefsApproveBriefProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsApproveBriefBriefID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsApproveBriefBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsApproveBriefBearerToken + } + } + v := &lfxv2campaignservicebriefs.ApproveBriefPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v, nil +} + +// BuildDeleteBriefPayload builds the payload for the +// lfx-v2-campaign-service-briefs delete-brief endpoint from CLI flags. +func BuildDeleteBriefPayload(lfxV2CampaignServiceBriefsDeleteBriefProjectID string, lfxV2CampaignServiceBriefsDeleteBriefBriefID string, lfxV2CampaignServiceBriefsDeleteBriefBearerToken string) (*lfxv2campaignservicebriefs.DeleteBriefPayload, error) { + var projectID string + { + projectID = lfxV2CampaignServiceBriefsDeleteBriefProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsDeleteBriefBriefID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsDeleteBriefBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsDeleteBriefBearerToken + } + } + v := &lfxv2campaignservicebriefs.DeleteBriefPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v, nil +} + +// BuildCreateCampaignsPayload builds the payload for the +// lfx-v2-campaign-service-briefs create-campaigns endpoint from CLI flags. +func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody string, lfxV2CampaignServiceBriefsCreateCampaignsProjectID string, lfxV2CampaignServiceBriefsCreateCampaignsBriefID string, lfxV2CampaignServiceBriefsCreateCampaignsBearerToken string) (*lfxv2campaignservicebriefs.CreateCampaignsPayload, error) { + var err error + var body CreateCampaignsRequestBody + { + err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) + if err != nil { + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Eligendi earum qui est et id laudantium.\",\n \"platforms\": [\n \"Ea magnam ut nihil quo tenetur.\",\n \"Fugiat natus.\",\n \"Et tempore.\"\n ]\n }\n }'") + } + if body.Input == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) + } + if body.Input != nil { + if err2 := ValidateCampaignCreateInputRequestBody(body.Input); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + if err != nil { + return nil, err + } + } + var projectID string + { + projectID = lfxV2CampaignServiceBriefsCreateCampaignsProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsCreateCampaignsBriefID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsCreateCampaignsBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsCreateCampaignsBearerToken + } + } + v := &lfxv2campaignservicebriefs.CreateCampaignsPayload{} + if body.Input != nil { + v.Input = marshalCampaignCreateInputRequestBodyToLfxv2campaignservicebriefsCampaignCreateInput(body.Input) + } + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v, nil +} + +// BuildGetCampaignPayload builds the payload for the +// lfx-v2-campaign-service-briefs get-campaign endpoint from CLI flags. +func BuildGetCampaignPayload(lfxV2CampaignServiceBriefsGetCampaignProjectID string, lfxV2CampaignServiceBriefsGetCampaignBriefID string, lfxV2CampaignServiceBriefsGetCampaignCampaignID string, lfxV2CampaignServiceBriefsGetCampaignBearerToken string) (*lfxv2campaignservicebriefs.GetCampaignPayload, error) { + var projectID string + { + projectID = lfxV2CampaignServiceBriefsGetCampaignProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsGetCampaignBriefID + } + var campaignID string + { + campaignID = lfxV2CampaignServiceBriefsGetCampaignCampaignID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsGetCampaignBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsGetCampaignBearerToken + } + } + v := &lfxv2campaignservicebriefs.GetCampaignPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.CampaignID = campaignID + v.BearerToken = bearerToken + + return v, nil +} + +// BuildUpdateCampaignPayload builds the payload for the +// lfx-v2-campaign-service-briefs update-campaign endpoint from CLI flags. +func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody string, lfxV2CampaignServiceBriefsUpdateCampaignProjectID string, lfxV2CampaignServiceBriefsUpdateCampaignBriefID string, lfxV2CampaignServiceBriefsUpdateCampaignCampaignID string, lfxV2CampaignServiceBriefsUpdateCampaignBearerToken string, lfxV2CampaignServiceBriefsUpdateCampaignIfMatch string) (*lfxv2campaignservicebriefs.UpdateCampaignPayload, error) { + var err error + var body UpdateCampaignRequestBody + { + err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateCampaignBody), &body) + if err != nil { + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Hic voluptas debitis error.\",\n \"config\": \"Ut consectetur.\",\n \"status\": \"Veniam eum ut libero quibusdam debitis.\"\n }\n }'") + } + if body.Campaign == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) + } + if err != nil { + return nil, err + } + } + var projectID string + { + projectID = lfxV2CampaignServiceBriefsUpdateCampaignProjectID + } + var briefID string + { + briefID = lfxV2CampaignServiceBriefsUpdateCampaignBriefID + } + var campaignID string + { + campaignID = lfxV2CampaignServiceBriefsUpdateCampaignCampaignID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsUpdateCampaignBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsUpdateCampaignBearerToken + } + } + var ifMatch *string + { + if lfxV2CampaignServiceBriefsUpdateCampaignIfMatch != "" { + ifMatch = &lfxV2CampaignServiceBriefsUpdateCampaignIfMatch + } + } + v := &lfxv2campaignservicebriefs.UpdateCampaignPayload{} + if body.Campaign != nil { + v.Campaign = marshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUpdateInput(body.Campaign) + } + v.ProjectID = projectID + v.BriefID = briefID + v.CampaignID = campaignID + v.BearerToken = bearerToken + v.IfMatch = ifMatch + + return v, nil +} + +// BuildGetJobPayload builds the payload for the lfx-v2-campaign-service-briefs +// get-job endpoint from CLI flags. +func BuildGetJobPayload(lfxV2CampaignServiceBriefsGetJobProjectID string, lfxV2CampaignServiceBriefsGetJobJobID string, lfxV2CampaignServiceBriefsGetJobBearerToken string) (*lfxv2campaignservicebriefs.GetJobPayload, error) { + var projectID string + { + projectID = lfxV2CampaignServiceBriefsGetJobProjectID + } + var jobID string + { + jobID = lfxV2CampaignServiceBriefsGetJobJobID + } + var bearerToken *string + { + if lfxV2CampaignServiceBriefsGetJobBearerToken != "" { + bearerToken = &lfxV2CampaignServiceBriefsGetJobBearerToken + } + } + v := &lfxv2campaignservicebriefs.GetJobPayload{} + v.ProjectID = projectID + v.JobID = jobID + v.BearerToken = bearerToken + + return v, nil +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/client.go b/gen/http/lfx_v2_campaign_service_briefs/client/client.go new file mode 100644 index 00000000..5c8d1a80 --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/client/client.go @@ -0,0 +1,308 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs client HTTP transport +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package client + +import ( + "context" + "net/http" + + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" +) + +// Client lists the lfx-v2-campaign-service-briefs service endpoint HTTP +// clients. +type Client struct { + // CreateBrief Doer is the HTTP client used to make requests to the + // create-brief endpoint. + CreateBriefDoer goahttp.Doer + + // GetBrief Doer is the HTTP client used to make requests to the get-brief + // endpoint. + GetBriefDoer goahttp.Doer + + // UpdateBrief Doer is the HTTP client used to make requests to the + // update-brief endpoint. + UpdateBriefDoer goahttp.Doer + + // ApproveBrief Doer is the HTTP client used to make requests to the + // approve-brief endpoint. + ApproveBriefDoer goahttp.Doer + + // DeleteBrief Doer is the HTTP client used to make requests to the + // delete-brief endpoint. + DeleteBriefDoer goahttp.Doer + + // CreateCampaigns Doer is the HTTP client used to make requests to the + // create-campaigns endpoint. + CreateCampaignsDoer goahttp.Doer + + // GetCampaign Doer is the HTTP client used to make requests to the + // get-campaign endpoint. + GetCampaignDoer goahttp.Doer + + // UpdateCampaign Doer is the HTTP client used to make requests to the + // update-campaign endpoint. + UpdateCampaignDoer goahttp.Doer + + // GetJob Doer is the HTTP client used to make requests to the get-job endpoint. + GetJobDoer goahttp.Doer + + // RestoreResponseBody controls whether the response bodies are reset after + // decoding so they can be read again. + RestoreResponseBody bool + + scheme string + host string + encoder func(*http.Request) goahttp.Encoder + decoder func(*http.Response) goahttp.Decoder +} + +// NewClient instantiates HTTP clients for all the +// lfx-v2-campaign-service-briefs service servers. +func NewClient( + scheme string, + host string, + doer goahttp.Doer, + enc func(*http.Request) goahttp.Encoder, + dec func(*http.Response) goahttp.Decoder, + restoreBody bool, +) *Client { + return &Client{ + CreateBriefDoer: doer, + GetBriefDoer: doer, + UpdateBriefDoer: doer, + ApproveBriefDoer: doer, + DeleteBriefDoer: doer, + CreateCampaignsDoer: doer, + GetCampaignDoer: doer, + UpdateCampaignDoer: doer, + GetJobDoer: doer, + RestoreResponseBody: restoreBody, + scheme: scheme, + host: host, + decoder: dec, + encoder: enc, + } +} + +// CreateBrief returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service create-brief server. +func (c *Client) CreateBrief() goa.Endpoint { + var ( + encodeRequest = EncodeCreateBriefRequest(c.encoder) + decodeResponse = DecodeCreateBriefResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildCreateBriefRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.CreateBriefDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return decodeResponse(resp) + } +} + +// GetBrief returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service get-brief server. +func (c *Client) GetBrief() goa.Endpoint { + var ( + encodeRequest = EncodeGetBriefRequest(c.encoder) + decodeResponse = DecodeGetBriefResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildGetBriefRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.GetBriefDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + return decodeResponse(resp) + } +} + +// UpdateBrief returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service update-brief server. +func (c *Client) UpdateBrief() goa.Endpoint { + var ( + encodeRequest = EncodeUpdateBriefRequest(c.encoder) + decodeResponse = DecodeUpdateBriefResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildUpdateBriefRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.UpdateBriefDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return decodeResponse(resp) + } +} + +// ApproveBrief returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service approve-brief server. +func (c *Client) ApproveBrief() goa.Endpoint { + var ( + encodeRequest = EncodeApproveBriefRequest(c.encoder) + decodeResponse = DecodeApproveBriefResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildApproveBriefRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.ApproveBriefDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return decodeResponse(resp) + } +} + +// DeleteBrief returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service delete-brief server. +func (c *Client) DeleteBrief() goa.Endpoint { + var ( + encodeRequest = EncodeDeleteBriefRequest(c.encoder) + decodeResponse = DecodeDeleteBriefResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildDeleteBriefRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.DeleteBriefDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + return decodeResponse(resp) + } +} + +// CreateCampaigns returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service create-campaigns server. +func (c *Client) CreateCampaigns() goa.Endpoint { + var ( + encodeRequest = EncodeCreateCampaignsRequest(c.encoder) + decodeResponse = DecodeCreateCampaignsResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildCreateCampaignsRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.CreateCampaignsDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return decodeResponse(resp) + } +} + +// GetCampaign returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service get-campaign server. +func (c *Client) GetCampaign() goa.Endpoint { + var ( + encodeRequest = EncodeGetCampaignRequest(c.encoder) + decodeResponse = DecodeGetCampaignResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildGetCampaignRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.GetCampaignDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + return decodeResponse(resp) + } +} + +// UpdateCampaign returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service update-campaign server. +func (c *Client) UpdateCampaign() goa.Endpoint { + var ( + encodeRequest = EncodeUpdateCampaignRequest(c.encoder) + decodeResponse = DecodeUpdateCampaignResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildUpdateCampaignRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.UpdateCampaignDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return decodeResponse(resp) + } +} + +// GetJob returns an endpoint that makes HTTP requests to the +// lfx-v2-campaign-service-briefs service get-job server. +func (c *Client) GetJob() goa.Endpoint { + var ( + encodeRequest = EncodeGetJobRequest(c.encoder) + decodeResponse = DecodeGetJobResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildGetJobRequest(ctx, v) + if err != nil { + return nil, err + } + err = encodeRequest(req, v) + if err != nil { + return nil, err + } + resp, err := c.GetJobDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("lfx-v2-campaign-service-briefs", "get-job", err) + } + return decodeResponse(resp) + } +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go new file mode 100644 index 00000000..a96bf192 --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go @@ -0,0 +1,1653 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs HTTP client encoders and decoders +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package client + +import ( + "bytes" + "context" + "io" + "net/http" + "net/url" + "strings" + + lfxv2campaignservicebriefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + goahttp "goa.design/goa/v3/http" +) + +// BuildCreateBriefRequest instantiates a HTTP request object with method and +// path set to call the "lfx-v2-campaign-service-briefs" service "create-brief" +// endpoint +func (c *Client) BuildCreateBriefRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.CreateBriefPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "create-brief", "*lfxv2campaignservicebriefs.CreateBriefPayload", v) + } + projectID = p.ProjectID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: CreateBriefLfxV2CampaignServiceBriefsPath(projectID)} + req, err := http.NewRequest("POST", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "create-brief", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeCreateBriefRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs create-brief server. +func EncodeCreateBriefRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.CreateBriefPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "create-brief", "*lfxv2campaignservicebriefs.CreateBriefPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + body := NewCreateBriefRequestBody(p) + if err := encoder(req).Encode(&body); err != nil { + return goahttp.ErrEncodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return nil + } +} + +// DecodeCreateBriefResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs create-brief endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeCreateBriefResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeCreateBriefResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusCreated: + var ( + body CreateBriefResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + err = ValidateCreateBriefResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + var ( + etag *string + ) + etagRaw := resp.Header.Get("Etag") + if etagRaw != "" { + etag = &etagRaw + } + res := NewCreateBriefBriefCreated(&body, etag) + return res, nil + case http.StatusBadRequest: + var ( + body CreateBriefBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + err = ValidateCreateBriefBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return nil, NewCreateBriefBadRequest(&body) + case http.StatusConflict: + var ( + body CreateBriefConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + err = ValidateCreateBriefConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return nil, NewCreateBriefConflict(&body) + case http.StatusServiceUnavailable: + var ( + body CreateBriefServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + err = ValidateCreateBriefServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return nil, NewCreateBriefServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body CreateBriefInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + err = ValidateCreateBriefInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return nil, NewCreateBriefInternalServerError(&body) + case http.StatusNotFound: + var ( + body CreateBriefNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + err = ValidateCreateBriefNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-brief", err) + } + return nil, NewCreateBriefNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "create-brief", resp.StatusCode, string(body)) + } + } +} + +// BuildGetBriefRequest instantiates a HTTP request object with method and path +// set to call the "lfx-v2-campaign-service-briefs" service "get-brief" endpoint +func (c *Client) BuildGetBriefRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.GetBriefPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "get-brief", "*lfxv2campaignservicebriefs.GetBriefPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: GetBriefLfxV2CampaignServiceBriefsPath(projectID, briefID)} + req, err := http.NewRequest("GET", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "get-brief", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeGetBriefRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs get-brief server. +func EncodeGetBriefRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.GetBriefPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "get-brief", "*lfxv2campaignservicebriefs.GetBriefPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + return nil + } +} + +// DecodeGetBriefResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs get-brief endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeGetBriefResponse may return the following errors: +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeGetBriefResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + var ( + body GetBriefResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + err = ValidateGetBriefResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + var ( + etag *string + ) + etagRaw := resp.Header.Get("Etag") + if etagRaw != "" { + etag = &etagRaw + } + res := NewGetBriefBriefOK(&body, etag) + return res, nil + case http.StatusConflict: + var ( + body GetBriefConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + err = ValidateGetBriefConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + return nil, NewGetBriefConflict(&body) + case http.StatusServiceUnavailable: + var ( + body GetBriefServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + err = ValidateGetBriefServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + return nil, NewGetBriefServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body GetBriefInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + err = ValidateGetBriefInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + return nil, NewGetBriefInternalServerError(&body) + case http.StatusNotFound: + var ( + body GetBriefNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + err = ValidateGetBriefNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + return nil, NewGetBriefNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "get-brief", resp.StatusCode, string(body)) + } + } +} + +// BuildUpdateBriefRequest instantiates a HTTP request object with method and +// path set to call the "lfx-v2-campaign-service-briefs" service "update-brief" +// endpoint +func (c *Client) BuildUpdateBriefRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.UpdateBriefPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "update-brief", "*lfxv2campaignservicebriefs.UpdateBriefPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: UpdateBriefLfxV2CampaignServiceBriefsPath(projectID, briefID)} + req, err := http.NewRequest("PUT", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "update-brief", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeUpdateBriefRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs update-brief server. +func EncodeUpdateBriefRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.UpdateBriefPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "update-brief", "*lfxv2campaignservicebriefs.UpdateBriefPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + if p.IfMatch != nil { + head := *p.IfMatch + req.Header.Set("If-Match", head) + } + body := NewUpdateBriefRequestBody(p) + if err := encoder(req).Encode(&body); err != nil { + return goahttp.ErrEncodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil + } +} + +// DecodeUpdateBriefResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs update-brief endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeUpdateBriefResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - "PreconditionFailed" (type *lfxv2campaignservicebriefs.PreconditionFailedError): http.StatusPreconditionFailed +// - "PreconditionRequired" (type *lfxv2campaignservicebriefs.PreconditionRequiredError): http.StatusPreconditionRequired +// - error: internal error +func DecodeUpdateBriefResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + var ( + body UpdateBriefResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + var ( + etag *string + ) + etagRaw := resp.Header.Get("Etag") + if etagRaw != "" { + etag = &etagRaw + } + res := NewUpdateBriefBriefOK(&body, etag) + return res, nil + case http.StatusBadRequest: + var ( + body UpdateBriefBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefBadRequest(&body) + case http.StatusConflict: + var ( + body UpdateBriefConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefConflict(&body) + case http.StatusServiceUnavailable: + var ( + body UpdateBriefServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body UpdateBriefInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefInternalServerError(&body) + case http.StatusNotFound: + var ( + body UpdateBriefNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefNotFound(&body) + case http.StatusPreconditionFailed: + var ( + body UpdateBriefPreconditionFailedResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefPreconditionFailedResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefPreconditionFailed(&body) + case http.StatusPreconditionRequired: + var ( + body UpdateBriefPreconditionRequiredResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + err = ValidateUpdateBriefPreconditionRequiredResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-brief", err) + } + return nil, NewUpdateBriefPreconditionRequired(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "update-brief", resp.StatusCode, string(body)) + } + } +} + +// BuildApproveBriefRequest instantiates a HTTP request object with method and +// path set to call the "lfx-v2-campaign-service-briefs" service +// "approve-brief" endpoint +func (c *Client) BuildApproveBriefRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.ApproveBriefPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "approve-brief", "*lfxv2campaignservicebriefs.ApproveBriefPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: ApproveBriefLfxV2CampaignServiceBriefsPath(projectID, briefID)} + req, err := http.NewRequest("POST", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "approve-brief", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeApproveBriefRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs approve-brief server. +func EncodeApproveBriefRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.ApproveBriefPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "approve-brief", "*lfxv2campaignservicebriefs.ApproveBriefPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + return nil + } +} + +// DecodeApproveBriefResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs approve-brief endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeApproveBriefResponse may return the following errors: +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeApproveBriefResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + var ( + body ApproveBriefResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + var ( + etag *string + ) + etagRaw := resp.Header.Get("Etag") + if etagRaw != "" { + etag = &etagRaw + } + res := NewApproveBriefBriefOK(&body, etag) + return res, nil + case http.StatusConflict: + var ( + body ApproveBriefConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefConflict(&body) + case http.StatusServiceUnavailable: + var ( + body ApproveBriefServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body ApproveBriefInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefInternalServerError(&body) + case http.StatusNotFound: + var ( + body ApproveBriefNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "approve-brief", resp.StatusCode, string(body)) + } + } +} + +// BuildDeleteBriefRequest instantiates a HTTP request object with method and +// path set to call the "lfx-v2-campaign-service-briefs" service "delete-brief" +// endpoint +func (c *Client) BuildDeleteBriefRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.DeleteBriefPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "delete-brief", "*lfxv2campaignservicebriefs.DeleteBriefPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: DeleteBriefLfxV2CampaignServiceBriefsPath(projectID, briefID)} + req, err := http.NewRequest("DELETE", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "delete-brief", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeDeleteBriefRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs delete-brief server. +func EncodeDeleteBriefRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.DeleteBriefPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "delete-brief", "*lfxv2campaignservicebriefs.DeleteBriefPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + return nil + } +} + +// DecodeDeleteBriefResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs delete-brief endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeDeleteBriefResponse may return the following errors: +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeDeleteBriefResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusNoContent: + return nil, nil + case http.StatusConflict: + var ( + body DeleteBriefConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + err = ValidateDeleteBriefConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + return nil, NewDeleteBriefConflict(&body) + case http.StatusServiceUnavailable: + var ( + body DeleteBriefServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + err = ValidateDeleteBriefServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + return nil, NewDeleteBriefServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body DeleteBriefInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + err = ValidateDeleteBriefInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + return nil, NewDeleteBriefInternalServerError(&body) + case http.StatusNotFound: + var ( + body DeleteBriefNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + err = ValidateDeleteBriefNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + return nil, NewDeleteBriefNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "delete-brief", resp.StatusCode, string(body)) + } + } +} + +// BuildCreateCampaignsRequest instantiates a HTTP request object with method +// and path set to call the "lfx-v2-campaign-service-briefs" service +// "create-campaigns" endpoint +func (c *Client) BuildCreateCampaignsRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.CreateCampaignsPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "create-campaigns", "*lfxv2campaignservicebriefs.CreateCampaignsPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: CreateCampaignsLfxV2CampaignServiceBriefsPath(projectID, briefID)} + req, err := http.NewRequest("POST", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "create-campaigns", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeCreateCampaignsRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs create-campaigns server. +func EncodeCreateCampaignsRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.CreateCampaignsPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "create-campaigns", "*lfxv2campaignservicebriefs.CreateCampaignsPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + body := NewCreateCampaignsRequestBody(p) + if err := encoder(req).Encode(&body); err != nil { + return goahttp.ErrEncodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return nil + } +} + +// DecodeCreateCampaignsResponse returns a decoder for responses returned by +// the lfx-v2-campaign-service-briefs create-campaigns endpoint. restoreBody +// controls whether the response body should be restored after having been read. +// DecodeCreateCampaignsResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeCreateCampaignsResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusAccepted: + var ( + body CreateCampaignsResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + err = ValidateCreateCampaignsResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + res := NewCreateCampaignsJobCreateResponseAccepted(&body) + return res, nil + case http.StatusBadRequest: + var ( + body CreateCampaignsBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + err = ValidateCreateCampaignsBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return nil, NewCreateCampaignsBadRequest(&body) + case http.StatusConflict: + var ( + body CreateCampaignsConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + err = ValidateCreateCampaignsConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return nil, NewCreateCampaignsConflict(&body) + case http.StatusServiceUnavailable: + var ( + body CreateCampaignsServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + err = ValidateCreateCampaignsServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return nil, NewCreateCampaignsServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body CreateCampaignsInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + err = ValidateCreateCampaignsInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return nil, NewCreateCampaignsInternalServerError(&body) + case http.StatusNotFound: + var ( + body CreateCampaignsNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + err = ValidateCreateCampaignsNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "create-campaigns", err) + } + return nil, NewCreateCampaignsNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "create-campaigns", resp.StatusCode, string(body)) + } + } +} + +// BuildGetCampaignRequest instantiates a HTTP request object with method and +// path set to call the "lfx-v2-campaign-service-briefs" service "get-campaign" +// endpoint +func (c *Client) BuildGetCampaignRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + campaignID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.GetCampaignPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "get-campaign", "*lfxv2campaignservicebriefs.GetCampaignPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + campaignID = p.CampaignID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: GetCampaignLfxV2CampaignServiceBriefsPath(projectID, briefID, campaignID)} + req, err := http.NewRequest("GET", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "get-campaign", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeGetCampaignRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs get-campaign server. +func EncodeGetCampaignRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.GetCampaignPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "get-campaign", "*lfxv2campaignservicebriefs.GetCampaignPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + return nil + } +} + +// DecodeGetCampaignResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs get-campaign endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeGetCampaignResponse may return the following errors: +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeGetCampaignResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + var ( + body GetCampaignResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + err = ValidateGetCampaignResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + var ( + etag *string + ) + etagRaw := resp.Header.Get("Etag") + if etagRaw != "" { + etag = &etagRaw + } + res := NewGetCampaignCampaignOK(&body, etag) + return res, nil + case http.StatusConflict: + var ( + body GetCampaignConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + err = ValidateGetCampaignConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + return nil, NewGetCampaignConflict(&body) + case http.StatusServiceUnavailable: + var ( + body GetCampaignServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + err = ValidateGetCampaignServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + return nil, NewGetCampaignServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body GetCampaignInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + err = ValidateGetCampaignInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + return nil, NewGetCampaignInternalServerError(&body) + case http.StatusNotFound: + var ( + body GetCampaignNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + err = ValidateGetCampaignNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + return nil, NewGetCampaignNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "get-campaign", resp.StatusCode, string(body)) + } + } +} + +// BuildUpdateCampaignRequest instantiates a HTTP request object with method +// and path set to call the "lfx-v2-campaign-service-briefs" service +// "update-campaign" endpoint +func (c *Client) BuildUpdateCampaignRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + briefID string + campaignID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.UpdateCampaignPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "update-campaign", "*lfxv2campaignservicebriefs.UpdateCampaignPayload", v) + } + projectID = p.ProjectID + briefID = p.BriefID + campaignID = p.CampaignID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: UpdateCampaignLfxV2CampaignServiceBriefsPath(projectID, briefID, campaignID)} + req, err := http.NewRequest("PUT", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "update-campaign", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeUpdateCampaignRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs update-campaign server. +func EncodeUpdateCampaignRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.UpdateCampaignPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "update-campaign", "*lfxv2campaignservicebriefs.UpdateCampaignPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + if p.IfMatch != nil { + head := *p.IfMatch + req.Header.Set("If-Match", head) + } + body := NewUpdateCampaignRequestBody(p) + if err := encoder(req).Encode(&body); err != nil { + return goahttp.ErrEncodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil + } +} + +// DecodeUpdateCampaignResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs update-campaign endpoint. restoreBody +// controls whether the response body should be restored after having been read. +// DecodeUpdateCampaignResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - "PreconditionFailed" (type *lfxv2campaignservicebriefs.PreconditionFailedError): http.StatusPreconditionFailed +// - "PreconditionRequired" (type *lfxv2campaignservicebriefs.PreconditionRequiredError): http.StatusPreconditionRequired +// - error: internal error +func DecodeUpdateCampaignResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + var ( + body UpdateCampaignResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + var ( + etag *string + ) + etagRaw := resp.Header.Get("Etag") + if etagRaw != "" { + etag = &etagRaw + } + res := NewUpdateCampaignCampaignOK(&body, etag) + return res, nil + case http.StatusBadRequest: + var ( + body UpdateCampaignBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignBadRequest(&body) + case http.StatusConflict: + var ( + body UpdateCampaignConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignConflict(&body) + case http.StatusServiceUnavailable: + var ( + body UpdateCampaignServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body UpdateCampaignInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignInternalServerError(&body) + case http.StatusNotFound: + var ( + body UpdateCampaignNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignNotFound(&body) + case http.StatusPreconditionFailed: + var ( + body UpdateCampaignPreconditionFailedResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignPreconditionFailedResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignPreconditionFailed(&body) + case http.StatusPreconditionRequired: + var ( + body UpdateCampaignPreconditionRequiredResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + err = ValidateUpdateCampaignPreconditionRequiredResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "update-campaign", err) + } + return nil, NewUpdateCampaignPreconditionRequired(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "update-campaign", resp.StatusCode, string(body)) + } + } +} + +// BuildGetJobRequest instantiates a HTTP request object with method and path +// set to call the "lfx-v2-campaign-service-briefs" service "get-job" endpoint +func (c *Client) BuildGetJobRequest(ctx context.Context, v any) (*http.Request, error) { + var ( + projectID string + jobID string + ) + { + p, ok := v.(*lfxv2campaignservicebriefs.GetJobPayload) + if !ok { + return nil, goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "get-job", "*lfxv2campaignservicebriefs.GetJobPayload", v) + } + projectID = p.ProjectID + jobID = p.JobID + } + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: GetJobLfxV2CampaignServiceBriefsPath(projectID, jobID)} + req, err := http.NewRequest("GET", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("lfx-v2-campaign-service-briefs", "get-job", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// EncodeGetJobRequest returns an encoder for requests sent to the +// lfx-v2-campaign-service-briefs get-job server. +func EncodeGetJobRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { + p, ok := v.(*lfxv2campaignservicebriefs.GetJobPayload) + if !ok { + return goahttp.ErrInvalidType("lfx-v2-campaign-service-briefs", "get-job", "*lfxv2campaignservicebriefs.GetJobPayload", v) + } + if p.BearerToken != nil { + head := *p.BearerToken + if !strings.Contains(head, " ") { + req.Header.Set("Authorization", "Bearer "+head) + } else { + req.Header.Set("Authorization", head) + } + } + return nil + } +} + +// DecodeGetJobResponse returns a decoder for responses returned by the +// lfx-v2-campaign-service-briefs get-job endpoint. restoreBody controls +// whether the response body should be restored after having been read. +// DecodeGetJobResponse may return the following errors: +// - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict +// - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable +// - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError +// - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - error: internal error +func DecodeGetJobResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + var ( + body GetJobResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-job", err) + } + err = ValidateGetJobResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-job", err) + } + res := NewGetJobJobPollResponseOK(&body) + return res, nil + case http.StatusConflict: + var ( + body GetJobConflictResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-job", err) + } + err = ValidateGetJobConflictResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-job", err) + } + return nil, NewGetJobConflict(&body) + case http.StatusServiceUnavailable: + var ( + body GetJobServiceUnavailableResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-job", err) + } + err = ValidateGetJobServiceUnavailableResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-job", err) + } + return nil, NewGetJobServiceUnavailable(&body) + case http.StatusInternalServerError: + var ( + body GetJobInternalServerErrorResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-job", err) + } + err = ValidateGetJobInternalServerErrorResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-job", err) + } + return nil, NewGetJobInternalServerError(&body) + case http.StatusNotFound: + var ( + body GetJobNotFoundResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-job", err) + } + err = ValidateGetJobNotFoundResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-job", err) + } + return nil, NewGetJobNotFound(&body) + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "get-job", resp.StatusCode, string(body)) + } + } +} + +// marshalLfxv2campaignservicebriefsBriefInputToBriefInputRequestBody builds a +// value of type *BriefInputRequestBody from a value of type +// *lfxv2campaignservicebriefs.BriefInput. +func marshalLfxv2campaignservicebriefsBriefInputToBriefInputRequestBody(v *lfxv2campaignservicebriefs.BriefInput) *BriefInputRequestBody { + res := &BriefInputRequestBody{ + ProgramType: v.ProgramType, + EventSlug: v.EventSlug, + URL: v.URL, + EventDetails: v.EventDetails, + Copy: v.Copy, + Keywords: v.Keywords, + Targeting: v.Targeting, + } + if v.Platforms != nil { + res.Platforms = make([]string, len(v.Platforms)) + for i, val := range v.Platforms { + res.Platforms[i] = val + } + } + + return res +} + +// marshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput builds a +// value of type *lfxv2campaignservicebriefs.BriefInput from a value of type +// *BriefInputRequestBody. +func marshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput(v *BriefInputRequestBody) *lfxv2campaignservicebriefs.BriefInput { + res := &lfxv2campaignservicebriefs.BriefInput{ + ProgramType: v.ProgramType, + EventSlug: v.EventSlug, + URL: v.URL, + EventDetails: v.EventDetails, + Copy: v.Copy, + Keywords: v.Keywords, + Targeting: v.Targeting, + } + if v.Platforms != nil { + res.Platforms = make([]string, len(v.Platforms)) + for i, val := range v.Platforms { + res.Platforms[i] = val + } + } + + return res +} + +// marshalLfxv2campaignservicebriefsCampaignCreateInputToCampaignCreateInputRequestBody +// builds a value of type *CampaignCreateInputRequestBody from a value of type +// *lfxv2campaignservicebriefs.CampaignCreateInput. +func marshalLfxv2campaignservicebriefsCampaignCreateInputToCampaignCreateInputRequestBody(v *lfxv2campaignservicebriefs.CampaignCreateInput) *CampaignCreateInputRequestBody { + res := &CampaignCreateInputRequestBody{ + Config: v.Config, + } + if v.Platforms != nil { + res.Platforms = make([]string, len(v.Platforms)) + for i, val := range v.Platforms { + res.Platforms[i] = val + } + } else { + res.Platforms = []string{} + } + + return res +} + +// marshalCampaignCreateInputRequestBodyToLfxv2campaignservicebriefsCampaignCreateInput +// builds a value of type *lfxv2campaignservicebriefs.CampaignCreateInput from +// a value of type *CampaignCreateInputRequestBody. +func marshalCampaignCreateInputRequestBodyToLfxv2campaignservicebriefsCampaignCreateInput(v *CampaignCreateInputRequestBody) *lfxv2campaignservicebriefs.CampaignCreateInput { + res := &lfxv2campaignservicebriefs.CampaignCreateInput{ + Config: v.Config, + } + if v.Platforms != nil { + res.Platforms = make([]string, len(v.Platforms)) + for i, val := range v.Platforms { + res.Platforms[i] = val + } + } else { + res.Platforms = []string{} + } + + return res +} + +// marshalLfxv2campaignservicebriefsCampaignUpdateInputToCampaignUpdateInputRequestBody +// builds a value of type *CampaignUpdateInputRequestBody from a value of type +// *lfxv2campaignservicebriefs.CampaignUpdateInput. +func marshalLfxv2campaignservicebriefsCampaignUpdateInputToCampaignUpdateInputRequestBody(v *lfxv2campaignservicebriefs.CampaignUpdateInput) *CampaignUpdateInputRequestBody { + res := &CampaignUpdateInputRequestBody{ + CampaignName: v.CampaignName, + Status: v.Status, + Config: v.Config, + } + + return res +} + +// marshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUpdateInput +// builds a value of type *lfxv2campaignservicebriefs.CampaignUpdateInput from +// a value of type *CampaignUpdateInputRequestBody. +func marshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUpdateInput(v *CampaignUpdateInputRequestBody) *lfxv2campaignservicebriefs.CampaignUpdateInput { + res := &lfxv2campaignservicebriefs.CampaignUpdateInput{ + CampaignName: v.CampaignName, + Status: v.Status, + Config: v.Config, + } + + return res +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/paths.go b/gen/http/lfx_v2_campaign_service_briefs/client/paths.go new file mode 100644 index 00000000..72344e32 --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/client/paths.go @@ -0,0 +1,57 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// HTTP request path constructors for the lfx-v2-campaign-service-briefs service. +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package client + +import ( + "fmt" +) + +// CreateBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service create-brief HTTP endpoint. +func CreateBriefLfxV2CampaignServiceBriefsPath(projectID string) string { + return fmt.Sprintf("/projects/%v/briefs", projectID) +} + +// GetBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service get-brief HTTP endpoint. +func GetBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v", projectID, briefID) +} + +// UpdateBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service update-brief HTTP endpoint. +func UpdateBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v", projectID, briefID) +} + +// ApproveBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service approve-brief HTTP endpoint. +func ApproveBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/approve", projectID, briefID) +} + +// DeleteBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service delete-brief HTTP endpoint. +func DeleteBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v", projectID, briefID) +} + +// CreateCampaignsLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service create-campaigns HTTP endpoint. +func CreateCampaignsLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/campaigns", projectID, briefID) +} + +// GetCampaignLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service get-campaign HTTP endpoint. +func GetCampaignLfxV2CampaignServiceBriefsPath(projectID string, briefID string, campaignID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/campaigns/%v", projectID, briefID, campaignID) +} + +// UpdateCampaignLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service update-campaign HTTP endpoint. +func UpdateCampaignLfxV2CampaignServiceBriefsPath(projectID string, briefID string, campaignID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/campaigns/%v", projectID, briefID, campaignID) +} + +// GetJobLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service get-job HTTP endpoint. +func GetJobLfxV2CampaignServiceBriefsPath(projectID string, jobID string) string { + return fmt.Sprintf("/projects/%v/jobs/%v", projectID, jobID) +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go new file mode 100644 index 00000000..426abd50 --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -0,0 +1,2109 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs HTTP client types +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package client + +import ( + lfxv2campaignservicebriefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + goa "goa.design/goa/v3/pkg" +) + +// CreateBriefRequestBody is the type of the "lfx-v2-campaign-service-briefs" +// service "create-brief" endpoint HTTP request body. +type CreateBriefRequestBody struct { + Brief *BriefInputRequestBody `form:"brief" json:"brief" xml:"brief"` +} + +// UpdateBriefRequestBody is the type of the "lfx-v2-campaign-service-briefs" +// service "update-brief" endpoint HTTP request body. +type UpdateBriefRequestBody struct { + Brief *BriefInputRequestBody `form:"brief" json:"brief" xml:"brief"` +} + +// CreateCampaignsRequestBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// request body. +type CreateCampaignsRequestBody struct { + Input *CampaignCreateInputRequestBody `form:"input" json:"input" xml:"input"` +} + +// UpdateCampaignRequestBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// request body. +type UpdateCampaignRequestBody struct { + Campaign *CampaignUpdateInputRequestBody `form:"campaign" json:"campaign" xml:"campaign"` +} + +// CreateBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "create-brief" endpoint HTTP response body. +type CreateBriefResponseBody struct { + // Brief UUID + ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` + // Owning project + ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` + // Funnel context + ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` + // Event/course slug + EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Optimistic-concurrency version + Version *int64 `form:"version,omitempty" json:"version,omitempty" xml:"version,omitempty"` +} + +// GetBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "get-brief" endpoint HTTP response body. +type GetBriefResponseBody struct { + // Brief UUID + ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` + // Owning project + ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` + // Funnel context + ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` + // Event/course slug + EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Optimistic-concurrency version + Version *int64 `form:"version,omitempty" json:"version,omitempty" xml:"version,omitempty"` +} + +// UpdateBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "update-brief" endpoint HTTP response body. +type UpdateBriefResponseBody struct { + // Brief UUID + ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` + // Owning project + ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` + // Funnel context + ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` + // Event/course slug + EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Optimistic-concurrency version + Version *int64 `form:"version,omitempty" json:"version,omitempty" xml:"version,omitempty"` +} + +// ApproveBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "approve-brief" endpoint HTTP response body. +type ApproveBriefResponseBody struct { + // Brief UUID + ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` + // Owning project + ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` + // Funnel context + ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` + // Event/course slug + EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Optimistic-concurrency version + Version *int64 `form:"version,omitempty" json:"version,omitempty" xml:"version,omitempty"` +} + +// CreateCampaignsResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body. +type CreateCampaignsResponseBody struct { + // Poll GET /projects/{projectId}/jobs/{jobId} + JobID *string `form:"job_id,omitempty" json:"job_id,omitempty" xml:"job_id,omitempty"` + // Initial status (always 'queued' on create) + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Platforms this job will create on + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` +} + +// GetCampaignResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "get-campaign" endpoint HTTP response body. +type GetCampaignResponseBody struct { + // Campaign UUID + ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` + // Owning project + ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` + // Parent brief + BriefID *string `form:"brief_id,omitempty" json:"brief_id,omitempty" xml:"brief_id,omitempty"` + // Channel + Platform *string `form:"platform,omitempty" json:"platform,omitempty" xml:"platform,omitempty"` + // ID returned by the ad platform + PlatformCampaignID *string `form:"platform_campaign_id,omitempty" json:"platform_campaign_id,omitempty" xml:"platform_campaign_id,omitempty"` + // Campaign name + CampaignName *string `form:"campaign_name,omitempty" json:"campaign_name,omitempty" xml:"campaign_name,omitempty"` + // Campaign status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Optimistic-concurrency version + Version *int64 `form:"version,omitempty" json:"version,omitempty" xml:"version,omitempty"` +} + +// UpdateCampaignResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body. +type UpdateCampaignResponseBody struct { + // Campaign UUID + ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` + // Owning project + ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` + // Parent brief + BriefID *string `form:"brief_id,omitempty" json:"brief_id,omitempty" xml:"brief_id,omitempty"` + // Channel + Platform *string `form:"platform,omitempty" json:"platform,omitempty" xml:"platform,omitempty"` + // ID returned by the ad platform + PlatformCampaignID *string `form:"platform_campaign_id,omitempty" json:"platform_campaign_id,omitempty" xml:"platform_campaign_id,omitempty"` + // Campaign name + CampaignName *string `form:"campaign_name,omitempty" json:"campaign_name,omitempty" xml:"campaign_name,omitempty"` + // Campaign status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Optimistic-concurrency version + Version *int64 `form:"version,omitempty" json:"version,omitempty" xml:"version,omitempty"` +} + +// GetJobResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "get-job" endpoint HTTP response body. +type GetJobResponseBody struct { + // Job UUID + JobID *string `form:"job_id,omitempty" json:"job_id,omitempty" xml:"job_id,omitempty"` + // Job status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Per-platform results, populated as each completes + Result any `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` + // Terminal error, if any + Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` +} + +// CreateBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "BadRequest" error. +type CreateBriefBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "Conflict" error. +type CreateBriefConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type CreateBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type CreateBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "NotFound" error. +type CreateBriefNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "Conflict" error. +type GetBriefConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "ServiceUnavailable" error. +type GetBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "InternalServerError" error. +type GetBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "NotFound" error. +type GetBriefNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "BadRequest" error. +type UpdateBriefBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "Conflict" error. +type UpdateBriefConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type UpdateBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type UpdateBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "NotFound" error. +type UpdateBriefNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefPreconditionFailedResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "PreconditionFailed" error. +type UpdateBriefPreconditionFailedResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateBriefPreconditionRequiredResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "PreconditionRequired" error. +type UpdateBriefPreconditionRequiredResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// ApproveBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "Conflict" error. +type ApproveBriefConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// ApproveBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type ApproveBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// ApproveBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type ApproveBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// ApproveBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "NotFound" error. +type ApproveBriefNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// DeleteBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "Conflict" error. +type DeleteBriefConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// DeleteBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type DeleteBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// DeleteBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type DeleteBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// DeleteBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "NotFound" error. +type DeleteBriefNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateCampaignsBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "BadRequest" error. +type CreateCampaignsBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateCampaignsConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "Conflict" error. +type CreateCampaignsConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateCampaignsServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type CreateCampaignsServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateCampaignsInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "InternalServerError" error. +type CreateCampaignsInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// CreateCampaignsNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "NotFound" error. +type CreateCampaignsNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetCampaignConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "Conflict" error. +type GetCampaignConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetCampaignServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type GetCampaignServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetCampaignInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "InternalServerError" error. +type GetCampaignInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetCampaignNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "NotFound" error. +type GetCampaignNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "BadRequest" error. +type UpdateCampaignBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "Conflict" error. +type UpdateCampaignConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type UpdateCampaignServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "InternalServerError" error. +type UpdateCampaignInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "NotFound" error. +type UpdateCampaignNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignPreconditionFailedResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "PreconditionFailed" error. +type UpdateCampaignPreconditionFailedResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// UpdateCampaignPreconditionRequiredResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "PreconditionRequired" error. +type UpdateCampaignPreconditionRequiredResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetJobConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "Conflict" error. +type GetJobConflictResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetJobServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "ServiceUnavailable" error. +type GetJobServiceUnavailableResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetJobInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "InternalServerError" error. +type GetJobInternalServerErrorResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// GetJobNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "NotFound" error. +type GetJobNotFoundResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// BriefInputRequestBody is used to define fields on request body types. +type BriefInputRequestBody struct { + // Funnel context + ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` + // Event/course slug (unique within the project) + EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` +} + +// CampaignCreateInputRequestBody is used to define fields on request body +// types. +type CampaignCreateInputRequestBody struct { + // Platforms to create campaigns on (binding selection) + Platforms []string `form:"platforms" json:"platforms" xml:"platforms"` + // Per-platform campaign configuration + Config any `form:"config,omitempty" json:"config,omitempty" xml:"config,omitempty"` +} + +// CampaignUpdateInputRequestBody is used to define fields on request body +// types. +type CampaignUpdateInputRequestBody struct { + // Campaign name + CampaignName string `form:"campaign_name" json:"campaign_name" xml:"campaign_name"` + // Campaign status + Status string `form:"status" json:"status" xml:"status"` + // Campaign configuration snapshot + Config any `form:"config,omitempty" json:"config,omitempty" xml:"config,omitempty"` +} + +// NewCreateBriefRequestBody builds the HTTP request body from the payload of +// the "create-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefRequestBody(p *lfxv2campaignservicebriefs.CreateBriefPayload) *CreateBriefRequestBody { + body := &CreateBriefRequestBody{} + if p.Brief != nil { + body.Brief = marshalLfxv2campaignservicebriefsBriefInputToBriefInputRequestBody(p.Brief) + } + return body +} + +// NewUpdateBriefRequestBody builds the HTTP request body from the payload of +// the "update-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefRequestBody(p *lfxv2campaignservicebriefs.UpdateBriefPayload) *UpdateBriefRequestBody { + body := &UpdateBriefRequestBody{} + if p.Brief != nil { + body.Brief = marshalLfxv2campaignservicebriefsBriefInputToBriefInputRequestBody(p.Brief) + } + return body +} + +// NewCreateCampaignsRequestBody builds the HTTP request body from the payload +// of the "create-campaigns" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewCreateCampaignsRequestBody(p *lfxv2campaignservicebriefs.CreateCampaignsPayload) *CreateCampaignsRequestBody { + body := &CreateCampaignsRequestBody{} + if p.Input != nil { + body.Input = marshalLfxv2campaignservicebriefsCampaignCreateInputToCampaignCreateInputRequestBody(p.Input) + } + return body +} + +// NewUpdateCampaignRequestBody builds the HTTP request body from the payload +// of the "update-campaign" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewUpdateCampaignRequestBody(p *lfxv2campaignservicebriefs.UpdateCampaignPayload) *UpdateCampaignRequestBody { + body := &UpdateCampaignRequestBody{} + if p.Campaign != nil { + body.Campaign = marshalLfxv2campaignservicebriefsCampaignUpdateInputToCampaignUpdateInputRequestBody(p.Campaign) + } + return body +} + +// NewCreateBriefBriefCreated builds a "lfx-v2-campaign-service-briefs" service +// "create-brief" endpoint result from a HTTP "Created" response. +func NewCreateBriefBriefCreated(body *CreateBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { + v := &lfxv2campaignservicebriefs.Brief{ + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + Status: *body.Status, + Version: *body.Version, + } + if body.Platforms != nil { + v.Platforms = make([]string, len(body.Platforms)) + for i, val := range body.Platforms { + v.Platforms[i] = val + } + } + v.Etag = etag + + return v +} + +// NewCreateBriefBadRequest builds a lfx-v2-campaign-service-briefs service +// create-brief endpoint BadRequest error. +func NewCreateBriefBadRequest(body *CreateBriefBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateBriefConflict builds a lfx-v2-campaign-service-briefs service +// create-brief endpoint Conflict error. +func NewCreateBriefConflict(body *CreateBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateBriefServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service create-brief endpoint ServiceUnavailable error. +func NewCreateBriefServiceUnavailable(body *CreateBriefServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateBriefInternalServerError builds a lfx-v2-campaign-service-briefs +// service create-brief endpoint InternalServerError error. +func NewCreateBriefInternalServerError(body *CreateBriefInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateBriefNotFound builds a lfx-v2-campaign-service-briefs service +// create-brief endpoint NotFound error. +func NewCreateBriefNotFound(body *CreateBriefNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetBriefBriefOK builds a "lfx-v2-campaign-service-briefs" service +// "get-brief" endpoint result from a HTTP "OK" response. +func NewGetBriefBriefOK(body *GetBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { + v := &lfxv2campaignservicebriefs.Brief{ + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + Status: *body.Status, + Version: *body.Version, + } + if body.Platforms != nil { + v.Platforms = make([]string, len(body.Platforms)) + for i, val := range body.Platforms { + v.Platforms[i] = val + } + } + v.Etag = etag + + return v +} + +// NewGetBriefConflict builds a lfx-v2-campaign-service-briefs service +// get-brief endpoint Conflict error. +func NewGetBriefConflict(body *GetBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetBriefServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service get-brief endpoint ServiceUnavailable error. +func NewGetBriefServiceUnavailable(body *GetBriefServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetBriefInternalServerError builds a lfx-v2-campaign-service-briefs +// service get-brief endpoint InternalServerError error. +func NewGetBriefInternalServerError(body *GetBriefInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetBriefNotFound builds a lfx-v2-campaign-service-briefs service +// get-brief endpoint NotFound error. +func NewGetBriefNotFound(body *GetBriefNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefBriefOK builds a "lfx-v2-campaign-service-briefs" service +// "update-brief" endpoint result from a HTTP "OK" response. +func NewUpdateBriefBriefOK(body *UpdateBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { + v := &lfxv2campaignservicebriefs.Brief{ + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + Status: *body.Status, + Version: *body.Version, + } + if body.Platforms != nil { + v.Platforms = make([]string, len(body.Platforms)) + for i, val := range body.Platforms { + v.Platforms[i] = val + } + } + v.Etag = etag + + return v +} + +// NewUpdateBriefBadRequest builds a lfx-v2-campaign-service-briefs service +// update-brief endpoint BadRequest error. +func NewUpdateBriefBadRequest(body *UpdateBriefBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefConflict builds a lfx-v2-campaign-service-briefs service +// update-brief endpoint Conflict error. +func NewUpdateBriefConflict(body *UpdateBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service update-brief endpoint ServiceUnavailable error. +func NewUpdateBriefServiceUnavailable(body *UpdateBriefServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefInternalServerError builds a lfx-v2-campaign-service-briefs +// service update-brief endpoint InternalServerError error. +func NewUpdateBriefInternalServerError(body *UpdateBriefInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefNotFound builds a lfx-v2-campaign-service-briefs service +// update-brief endpoint NotFound error. +func NewUpdateBriefNotFound(body *UpdateBriefNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefPreconditionFailed builds a lfx-v2-campaign-service-briefs +// service update-brief endpoint PreconditionFailed error. +func NewUpdateBriefPreconditionFailed(body *UpdateBriefPreconditionFailedResponseBody) *lfxv2campaignservicebriefs.PreconditionFailedError { + v := &lfxv2campaignservicebriefs.PreconditionFailedError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateBriefPreconditionRequired builds a lfx-v2-campaign-service-briefs +// service update-brief endpoint PreconditionRequired error. +func NewUpdateBriefPreconditionRequired(body *UpdateBriefPreconditionRequiredResponseBody) *lfxv2campaignservicebriefs.PreconditionRequiredError { + v := &lfxv2campaignservicebriefs.PreconditionRequiredError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewApproveBriefBriefOK builds a "lfx-v2-campaign-service-briefs" service +// "approve-brief" endpoint result from a HTTP "OK" response. +func NewApproveBriefBriefOK(body *ApproveBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { + v := &lfxv2campaignservicebriefs.Brief{ + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + Status: *body.Status, + Version: *body.Version, + } + if body.Platforms != nil { + v.Platforms = make([]string, len(body.Platforms)) + for i, val := range body.Platforms { + v.Platforms[i] = val + } + } + v.Etag = etag + + return v +} + +// NewApproveBriefConflict builds a lfx-v2-campaign-service-briefs service +// approve-brief endpoint Conflict error. +func NewApproveBriefConflict(body *ApproveBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewApproveBriefServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service approve-brief endpoint ServiceUnavailable error. +func NewApproveBriefServiceUnavailable(body *ApproveBriefServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewApproveBriefInternalServerError builds a lfx-v2-campaign-service-briefs +// service approve-brief endpoint InternalServerError error. +func NewApproveBriefInternalServerError(body *ApproveBriefInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewApproveBriefNotFound builds a lfx-v2-campaign-service-briefs service +// approve-brief endpoint NotFound error. +func NewApproveBriefNotFound(body *ApproveBriefNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewDeleteBriefConflict builds a lfx-v2-campaign-service-briefs service +// delete-brief endpoint Conflict error. +func NewDeleteBriefConflict(body *DeleteBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewDeleteBriefServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service delete-brief endpoint ServiceUnavailable error. +func NewDeleteBriefServiceUnavailable(body *DeleteBriefServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewDeleteBriefInternalServerError builds a lfx-v2-campaign-service-briefs +// service delete-brief endpoint InternalServerError error. +func NewDeleteBriefInternalServerError(body *DeleteBriefInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewDeleteBriefNotFound builds a lfx-v2-campaign-service-briefs service +// delete-brief endpoint NotFound error. +func NewDeleteBriefNotFound(body *DeleteBriefNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateCampaignsJobCreateResponseAccepted builds a +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint result +// from a HTTP "Accepted" response. +func NewCreateCampaignsJobCreateResponseAccepted(body *CreateCampaignsResponseBody) *lfxv2campaignservicebriefs.JobCreateResponse { + v := &lfxv2campaignservicebriefs.JobCreateResponse{ + JobID: *body.JobID, + Status: *body.Status, + } + if body.Platforms != nil { + v.Platforms = make([]string, len(body.Platforms)) + for i, val := range body.Platforms { + v.Platforms[i] = val + } + } + + return v +} + +// NewCreateCampaignsBadRequest builds a lfx-v2-campaign-service-briefs service +// create-campaigns endpoint BadRequest error. +func NewCreateCampaignsBadRequest(body *CreateCampaignsBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateCampaignsConflict builds a lfx-v2-campaign-service-briefs service +// create-campaigns endpoint Conflict error. +func NewCreateCampaignsConflict(body *CreateCampaignsConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateCampaignsServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service create-campaigns endpoint ServiceUnavailable error. +func NewCreateCampaignsServiceUnavailable(body *CreateCampaignsServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateCampaignsInternalServerError builds a +// lfx-v2-campaign-service-briefs service create-campaigns endpoint +// InternalServerError error. +func NewCreateCampaignsInternalServerError(body *CreateCampaignsInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewCreateCampaignsNotFound builds a lfx-v2-campaign-service-briefs service +// create-campaigns endpoint NotFound error. +func NewCreateCampaignsNotFound(body *CreateCampaignsNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetCampaignCampaignOK builds a "lfx-v2-campaign-service-briefs" service +// "get-campaign" endpoint result from a HTTP "OK" response. +func NewGetCampaignCampaignOK(body *GetCampaignResponseBody, etag *string) *lfxv2campaignservicebriefs.Campaign { + v := &lfxv2campaignservicebriefs.Campaign{ + ID: *body.ID, + ProjectID: *body.ProjectID, + BriefID: *body.BriefID, + Platform: *body.Platform, + PlatformCampaignID: body.PlatformCampaignID, + CampaignName: *body.CampaignName, + Status: *body.Status, + Version: *body.Version, + } + v.Etag = etag + + return v +} + +// NewGetCampaignConflict builds a lfx-v2-campaign-service-briefs service +// get-campaign endpoint Conflict error. +func NewGetCampaignConflict(body *GetCampaignConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetCampaignServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service get-campaign endpoint ServiceUnavailable error. +func NewGetCampaignServiceUnavailable(body *GetCampaignServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetCampaignInternalServerError builds a lfx-v2-campaign-service-briefs +// service get-campaign endpoint InternalServerError error. +func NewGetCampaignInternalServerError(body *GetCampaignInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetCampaignNotFound builds a lfx-v2-campaign-service-briefs service +// get-campaign endpoint NotFound error. +func NewGetCampaignNotFound(body *GetCampaignNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignCampaignOK builds a "lfx-v2-campaign-service-briefs" +// service "update-campaign" endpoint result from a HTTP "OK" response. +func NewUpdateCampaignCampaignOK(body *UpdateCampaignResponseBody, etag *string) *lfxv2campaignservicebriefs.Campaign { + v := &lfxv2campaignservicebriefs.Campaign{ + ID: *body.ID, + ProjectID: *body.ProjectID, + BriefID: *body.BriefID, + Platform: *body.Platform, + PlatformCampaignID: body.PlatformCampaignID, + CampaignName: *body.CampaignName, + Status: *body.Status, + Version: *body.Version, + } + v.Etag = etag + + return v +} + +// NewUpdateCampaignBadRequest builds a lfx-v2-campaign-service-briefs service +// update-campaign endpoint BadRequest error. +func NewUpdateCampaignBadRequest(body *UpdateCampaignBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignConflict builds a lfx-v2-campaign-service-briefs service +// update-campaign endpoint Conflict error. +func NewUpdateCampaignConflict(body *UpdateCampaignConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignServiceUnavailable builds a lfx-v2-campaign-service-briefs +// service update-campaign endpoint ServiceUnavailable error. +func NewUpdateCampaignServiceUnavailable(body *UpdateCampaignServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignInternalServerError builds a lfx-v2-campaign-service-briefs +// service update-campaign endpoint InternalServerError error. +func NewUpdateCampaignInternalServerError(body *UpdateCampaignInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignNotFound builds a lfx-v2-campaign-service-briefs service +// update-campaign endpoint NotFound error. +func NewUpdateCampaignNotFound(body *UpdateCampaignNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignPreconditionFailed builds a lfx-v2-campaign-service-briefs +// service update-campaign endpoint PreconditionFailed error. +func NewUpdateCampaignPreconditionFailed(body *UpdateCampaignPreconditionFailedResponseBody) *lfxv2campaignservicebriefs.PreconditionFailedError { + v := &lfxv2campaignservicebriefs.PreconditionFailedError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewUpdateCampaignPreconditionRequired builds a +// lfx-v2-campaign-service-briefs service update-campaign endpoint +// PreconditionRequired error. +func NewUpdateCampaignPreconditionRequired(body *UpdateCampaignPreconditionRequiredResponseBody) *lfxv2campaignservicebriefs.PreconditionRequiredError { + v := &lfxv2campaignservicebriefs.PreconditionRequiredError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetJobJobPollResponseOK builds a "lfx-v2-campaign-service-briefs" service +// "get-job" endpoint result from a HTTP "OK" response. +func NewGetJobJobPollResponseOK(body *GetJobResponseBody) *lfxv2campaignservicebriefs.JobPollResponse { + v := &lfxv2campaignservicebriefs.JobPollResponse{ + JobID: *body.JobID, + Status: *body.Status, + Result: body.Result, + Error: body.Error, + } + + return v +} + +// NewGetJobConflict builds a lfx-v2-campaign-service-briefs service get-job +// endpoint Conflict error. +func NewGetJobConflict(body *GetJobConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { + v := &lfxv2campaignservicebriefs.ConflictError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetJobServiceUnavailable builds a lfx-v2-campaign-service-briefs service +// get-job endpoint ServiceUnavailable error. +func NewGetJobServiceUnavailable(body *GetJobServiceUnavailableResponseBody) *lfxv2campaignservicebriefs.ConnServiceUnavailableError { + v := &lfxv2campaignservicebriefs.ConnServiceUnavailableError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetJobInternalServerError builds a lfx-v2-campaign-service-briefs service +// get-job endpoint InternalServerError error. +func NewGetJobInternalServerError(body *GetJobInternalServerErrorResponseBody) *lfxv2campaignservicebriefs.InternalServerError { + v := &lfxv2campaignservicebriefs.InternalServerError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewGetJobNotFound builds a lfx-v2-campaign-service-briefs service get-job +// endpoint NotFound error. +func NewGetJobNotFound(body *GetJobNotFoundResponseBody) *lfxv2campaignservicebriefs.NotFoundError { + v := &lfxv2campaignservicebriefs.NotFoundError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// ValidateCreateBriefResponseBody runs the validations defined on +// Create-BriefResponseBody +func ValidateCreateBriefResponseBody(body *CreateBriefResponseBody) (err error) { + if body.ID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) + } + if body.ProjectID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("project_id", "body")) + } + if body.ProgramType == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("program_type", "body")) + } + if body.EventSlug == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("event_slug", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Version == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) + } + if body.Status != nil { + if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) + } + } + return +} + +// ValidateGetBriefResponseBody runs the validations defined on +// Get-BriefResponseBody +func ValidateGetBriefResponseBody(body *GetBriefResponseBody) (err error) { + if body.ID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) + } + if body.ProjectID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("project_id", "body")) + } + if body.ProgramType == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("program_type", "body")) + } + if body.EventSlug == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("event_slug", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Version == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) + } + if body.Status != nil { + if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) + } + } + return +} + +// ValidateUpdateBriefResponseBody runs the validations defined on +// Update-BriefResponseBody +func ValidateUpdateBriefResponseBody(body *UpdateBriefResponseBody) (err error) { + if body.ID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) + } + if body.ProjectID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("project_id", "body")) + } + if body.ProgramType == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("program_type", "body")) + } + if body.EventSlug == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("event_slug", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Version == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) + } + if body.Status != nil { + if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) + } + } + return +} + +// ValidateApproveBriefResponseBody runs the validations defined on +// Approve-BriefResponseBody +func ValidateApproveBriefResponseBody(body *ApproveBriefResponseBody) (err error) { + if body.ID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) + } + if body.ProjectID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("project_id", "body")) + } + if body.ProgramType == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("program_type", "body")) + } + if body.EventSlug == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("event_slug", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Version == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) + } + if body.Status != nil { + if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) + } + } + return +} + +// ValidateCreateCampaignsResponseBody runs the validations defined on +// Create-CampaignsResponseBody +func ValidateCreateCampaignsResponseBody(body *CreateCampaignsResponseBody) (err error) { + if body.JobID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("job_id", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Status != nil { + if !(*body.Status == "queued") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"queued"})) + } + } + return +} + +// ValidateGetCampaignResponseBody runs the validations defined on +// Get-CampaignResponseBody +func ValidateGetCampaignResponseBody(body *GetCampaignResponseBody) (err error) { + if body.ID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) + } + if body.ProjectID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("project_id", "body")) + } + if body.BriefID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("brief_id", "body")) + } + if body.Platform == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("platform", "body")) + } + if body.CampaignName == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("campaign_name", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Version == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) + } + return +} + +// ValidateUpdateCampaignResponseBody runs the validations defined on +// Update-CampaignResponseBody +func ValidateUpdateCampaignResponseBody(body *UpdateCampaignResponseBody) (err error) { + if body.ID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) + } + if body.ProjectID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("project_id", "body")) + } + if body.BriefID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("brief_id", "body")) + } + if body.Platform == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("platform", "body")) + } + if body.CampaignName == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("campaign_name", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Version == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) + } + return +} + +// ValidateGetJobResponseBody runs the validations defined on +// Get-JobResponseBody +func ValidateGetJobResponseBody(body *GetJobResponseBody) (err error) { + if body.JobID == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("job_id", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + if body.Status != nil { + if !(*body.Status == "queued" || *body.Status == "running" || *body.Status == "succeeded" || *body.Status == "partial" || *body.Status == "failed") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"queued", "running", "succeeded", "partial", "failed"})) + } + } + return +} + +// ValidateCreateBriefBadRequestResponseBody runs the validations defined on +// create-brief_BadRequest_response_body +func ValidateCreateBriefBadRequestResponseBody(body *CreateBriefBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateBriefConflictResponseBody runs the validations defined on +// create-brief_Conflict_response_body +func ValidateCreateBriefConflictResponseBody(body *CreateBriefConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateBriefServiceUnavailableResponseBody runs the validations +// defined on create-brief_ServiceUnavailable_response_body +func ValidateCreateBriefServiceUnavailableResponseBody(body *CreateBriefServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateBriefInternalServerErrorResponseBody runs the validations +// defined on create-brief_InternalServerError_response_body +func ValidateCreateBriefInternalServerErrorResponseBody(body *CreateBriefInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateBriefNotFoundResponseBody runs the validations defined on +// create-brief_NotFound_response_body +func ValidateCreateBriefNotFoundResponseBody(body *CreateBriefNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetBriefConflictResponseBody runs the validations defined on +// get-brief_Conflict_response_body +func ValidateGetBriefConflictResponseBody(body *GetBriefConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetBriefServiceUnavailableResponseBody runs the validations defined +// on get-brief_ServiceUnavailable_response_body +func ValidateGetBriefServiceUnavailableResponseBody(body *GetBriefServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetBriefInternalServerErrorResponseBody runs the validations defined +// on get-brief_InternalServerError_response_body +func ValidateGetBriefInternalServerErrorResponseBody(body *GetBriefInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetBriefNotFoundResponseBody runs the validations defined on +// get-brief_NotFound_response_body +func ValidateGetBriefNotFoundResponseBody(body *GetBriefNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefBadRequestResponseBody runs the validations defined on +// update-brief_BadRequest_response_body +func ValidateUpdateBriefBadRequestResponseBody(body *UpdateBriefBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefConflictResponseBody runs the validations defined on +// update-brief_Conflict_response_body +func ValidateUpdateBriefConflictResponseBody(body *UpdateBriefConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefServiceUnavailableResponseBody runs the validations +// defined on update-brief_ServiceUnavailable_response_body +func ValidateUpdateBriefServiceUnavailableResponseBody(body *UpdateBriefServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefInternalServerErrorResponseBody runs the validations +// defined on update-brief_InternalServerError_response_body +func ValidateUpdateBriefInternalServerErrorResponseBody(body *UpdateBriefInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefNotFoundResponseBody runs the validations defined on +// update-brief_NotFound_response_body +func ValidateUpdateBriefNotFoundResponseBody(body *UpdateBriefNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefPreconditionFailedResponseBody runs the validations +// defined on update-brief_PreconditionFailed_response_body +func ValidateUpdateBriefPreconditionFailedResponseBody(body *UpdateBriefPreconditionFailedResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateBriefPreconditionRequiredResponseBody runs the validations +// defined on update-brief_PreconditionRequired_response_body +func ValidateUpdateBriefPreconditionRequiredResponseBody(body *UpdateBriefPreconditionRequiredResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateApproveBriefConflictResponseBody runs the validations defined on +// approve-brief_Conflict_response_body +func ValidateApproveBriefConflictResponseBody(body *ApproveBriefConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateApproveBriefServiceUnavailableResponseBody runs the validations +// defined on approve-brief_ServiceUnavailable_response_body +func ValidateApproveBriefServiceUnavailableResponseBody(body *ApproveBriefServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateApproveBriefInternalServerErrorResponseBody runs the validations +// defined on approve-brief_InternalServerError_response_body +func ValidateApproveBriefInternalServerErrorResponseBody(body *ApproveBriefInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateApproveBriefNotFoundResponseBody runs the validations defined on +// approve-brief_NotFound_response_body +func ValidateApproveBriefNotFoundResponseBody(body *ApproveBriefNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateDeleteBriefConflictResponseBody runs the validations defined on +// delete-brief_Conflict_response_body +func ValidateDeleteBriefConflictResponseBody(body *DeleteBriefConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateDeleteBriefServiceUnavailableResponseBody runs the validations +// defined on delete-brief_ServiceUnavailable_response_body +func ValidateDeleteBriefServiceUnavailableResponseBody(body *DeleteBriefServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateDeleteBriefInternalServerErrorResponseBody runs the validations +// defined on delete-brief_InternalServerError_response_body +func ValidateDeleteBriefInternalServerErrorResponseBody(body *DeleteBriefInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateDeleteBriefNotFoundResponseBody runs the validations defined on +// delete-brief_NotFound_response_body +func ValidateDeleteBriefNotFoundResponseBody(body *DeleteBriefNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateCampaignsBadRequestResponseBody runs the validations defined +// on create-campaigns_BadRequest_response_body +func ValidateCreateCampaignsBadRequestResponseBody(body *CreateCampaignsBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateCampaignsConflictResponseBody runs the validations defined on +// create-campaigns_Conflict_response_body +func ValidateCreateCampaignsConflictResponseBody(body *CreateCampaignsConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateCampaignsServiceUnavailableResponseBody runs the validations +// defined on create-campaigns_ServiceUnavailable_response_body +func ValidateCreateCampaignsServiceUnavailableResponseBody(body *CreateCampaignsServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateCampaignsInternalServerErrorResponseBody runs the validations +// defined on create-campaigns_InternalServerError_response_body +func ValidateCreateCampaignsInternalServerErrorResponseBody(body *CreateCampaignsInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateCreateCampaignsNotFoundResponseBody runs the validations defined on +// create-campaigns_NotFound_response_body +func ValidateCreateCampaignsNotFoundResponseBody(body *CreateCampaignsNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetCampaignConflictResponseBody runs the validations defined on +// get-campaign_Conflict_response_body +func ValidateGetCampaignConflictResponseBody(body *GetCampaignConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetCampaignServiceUnavailableResponseBody runs the validations +// defined on get-campaign_ServiceUnavailable_response_body +func ValidateGetCampaignServiceUnavailableResponseBody(body *GetCampaignServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetCampaignInternalServerErrorResponseBody runs the validations +// defined on get-campaign_InternalServerError_response_body +func ValidateGetCampaignInternalServerErrorResponseBody(body *GetCampaignInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetCampaignNotFoundResponseBody runs the validations defined on +// get-campaign_NotFound_response_body +func ValidateGetCampaignNotFoundResponseBody(body *GetCampaignNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignBadRequestResponseBody runs the validations defined on +// update-campaign_BadRequest_response_body +func ValidateUpdateCampaignBadRequestResponseBody(body *UpdateCampaignBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignConflictResponseBody runs the validations defined on +// update-campaign_Conflict_response_body +func ValidateUpdateCampaignConflictResponseBody(body *UpdateCampaignConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignServiceUnavailableResponseBody runs the validations +// defined on update-campaign_ServiceUnavailable_response_body +func ValidateUpdateCampaignServiceUnavailableResponseBody(body *UpdateCampaignServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignInternalServerErrorResponseBody runs the validations +// defined on update-campaign_InternalServerError_response_body +func ValidateUpdateCampaignInternalServerErrorResponseBody(body *UpdateCampaignInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignNotFoundResponseBody runs the validations defined on +// update-campaign_NotFound_response_body +func ValidateUpdateCampaignNotFoundResponseBody(body *UpdateCampaignNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignPreconditionFailedResponseBody runs the validations +// defined on update-campaign_PreconditionFailed_response_body +func ValidateUpdateCampaignPreconditionFailedResponseBody(body *UpdateCampaignPreconditionFailedResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateUpdateCampaignPreconditionRequiredResponseBody runs the validations +// defined on update-campaign_PreconditionRequired_response_body +func ValidateUpdateCampaignPreconditionRequiredResponseBody(body *UpdateCampaignPreconditionRequiredResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetJobConflictResponseBody runs the validations defined on +// get-job_Conflict_response_body +func ValidateGetJobConflictResponseBody(body *GetJobConflictResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetJobServiceUnavailableResponseBody runs the validations defined on +// get-job_ServiceUnavailable_response_body +func ValidateGetJobServiceUnavailableResponseBody(body *GetJobServiceUnavailableResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetJobInternalServerErrorResponseBody runs the validations defined +// on get-job_InternalServerError_response_body +func ValidateGetJobInternalServerErrorResponseBody(body *GetJobInternalServerErrorResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateGetJobNotFoundResponseBody runs the validations defined on +// get-job_NotFound_response_body +func ValidateGetJobNotFoundResponseBody(body *GetJobNotFoundResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateBriefInputRequestBody runs the validations defined on +// brief-inputRequestBody +func ValidateBriefInputRequestBody(body *BriefInputRequestBody) (err error) { + if !(body.ProgramType == "events" || body.ProgramType == "education" || body.ProgramType == "membership") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.program_type", body.ProgramType, []any{"events", "education", "membership"})) + } + return +} + +// ValidateCampaignCreateInputRequestBody runs the validations defined on +// campaign-create-inputRequestBody +func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody) (err error) { + if body.Platforms == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) + } + return +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go new file mode 100644 index 00000000..4caaee02 --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go @@ -0,0 +1,1281 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs HTTP server encoders and decoders +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package server + +import ( + "context" + "errors" + "io" + "net/http" + "strings" + + lfxv2campaignservicebriefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" +) + +// EncodeCreateBriefResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs create-brief endpoint. +func EncodeCreateBriefResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.Brief) + enc := encoder(ctx, w) + body := NewCreateBriefResponseBody(res) + if res.Etag != nil { + w.Header().Set("Etag", *res.Etag) + } + w.WriteHeader(http.StatusCreated) + return enc.Encode(body) + } +} + +// DecodeCreateBriefRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs create-brief endpoint. +func DecodeCreateBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.CreateBriefPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.CreateBriefPayload, error) { + var payload *lfxv2campaignservicebriefs.CreateBriefPayload + var ( + body CreateBriefRequestBody + err error + ) + err = decoder(r).Decode(&body) + if err != nil { + if errors.Is(err, io.EOF) { + return payload, goa.MissingPayloadError() + } + var gerr *goa.ServiceError + if errors.As(err, &gerr) { + return payload, gerr + } + return payload, goa.DecodePayloadError(err.Error()) + } + err = ValidateCreateBriefRequestBody(&body) + if err != nil { + return payload, err + } + + var ( + projectID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewCreateBriefPayload(&body, projectID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeCreateBriefError returns an encoder for errors returned by the +// create-brief lfx-v2-campaign-service-briefs endpoint. +func EncodeCreateBriefError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateBriefBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateBriefConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateBriefServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateBriefInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateBriefNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeGetBriefResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs get-brief endpoint. +func EncodeGetBriefResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.Brief) + enc := encoder(ctx, w) + body := NewGetBriefResponseBody(res) + if res.Etag != nil { + w.Header().Set("Etag", *res.Etag) + } + w.WriteHeader(http.StatusOK) + return enc.Encode(body) + } +} + +// DecodeGetBriefRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs get-brief endpoint. +func DecodeGetBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.GetBriefPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.GetBriefPayload, error) { + var payload *lfxv2campaignservicebriefs.GetBriefPayload + var ( + projectID string + briefID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewGetBriefPayload(projectID, briefID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeGetBriefError returns an encoder for errors returned by the get-brief +// lfx-v2-campaign-service-briefs endpoint. +func EncodeGetBriefError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetBriefConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetBriefServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetBriefInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetBriefNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeUpdateBriefResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs update-brief endpoint. +func EncodeUpdateBriefResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.Brief) + enc := encoder(ctx, w) + body := NewUpdateBriefResponseBody(res) + if res.Etag != nil { + w.Header().Set("Etag", *res.Etag) + } + w.WriteHeader(http.StatusOK) + return enc.Encode(body) + } +} + +// DecodeUpdateBriefRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs update-brief endpoint. +func DecodeUpdateBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.UpdateBriefPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.UpdateBriefPayload, error) { + var payload *lfxv2campaignservicebriefs.UpdateBriefPayload + var ( + body UpdateBriefRequestBody + err error + ) + err = decoder(r).Decode(&body) + if err != nil { + if errors.Is(err, io.EOF) { + return payload, goa.MissingPayloadError() + } + var gerr *goa.ServiceError + if errors.As(err, &gerr) { + return payload, gerr + } + return payload, goa.DecodePayloadError(err.Error()) + } + err = ValidateUpdateBriefRequestBody(&body) + if err != nil { + return payload, err + } + + var ( + projectID string + briefID string + bearerToken *string + ifMatch *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + ifMatchRaw := r.Header.Get("If-Match") + if ifMatchRaw != "" { + ifMatch = &ifMatchRaw + } + payload = NewUpdateBriefPayload(&body, projectID, briefID, bearerToken, ifMatch) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeUpdateBriefError returns an encoder for errors returned by the +// update-brief lfx-v2-campaign-service-briefs endpoint. +func EncodeUpdateBriefError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + case "PreconditionFailed": + var res *lfxv2campaignservicebriefs.PreconditionFailedError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefPreconditionFailedResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusPreconditionFailed) + return enc.Encode(body) + case "PreconditionRequired": + var res *lfxv2campaignservicebriefs.PreconditionRequiredError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateBriefPreconditionRequiredResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusPreconditionRequired) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeApproveBriefResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs approve-brief endpoint. +func EncodeApproveBriefResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.Brief) + enc := encoder(ctx, w) + body := NewApproveBriefResponseBody(res) + if res.Etag != nil { + w.Header().Set("Etag", *res.Etag) + } + w.WriteHeader(http.StatusOK) + return enc.Encode(body) + } +} + +// DecodeApproveBriefRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs approve-brief endpoint. +func DecodeApproveBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.ApproveBriefPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.ApproveBriefPayload, error) { + var payload *lfxv2campaignservicebriefs.ApproveBriefPayload + var ( + projectID string + briefID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewApproveBriefPayload(projectID, briefID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeApproveBriefError returns an encoder for errors returned by the +// approve-brief lfx-v2-campaign-service-briefs endpoint. +func EncodeApproveBriefError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeDeleteBriefResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs delete-brief endpoint. +func EncodeDeleteBriefResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + w.WriteHeader(http.StatusNoContent) + return nil + } +} + +// DecodeDeleteBriefRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs delete-brief endpoint. +func DecodeDeleteBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.DeleteBriefPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.DeleteBriefPayload, error) { + var payload *lfxv2campaignservicebriefs.DeleteBriefPayload + var ( + projectID string + briefID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewDeleteBriefPayload(projectID, briefID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeDeleteBriefError returns an encoder for errors returned by the +// delete-brief lfx-v2-campaign-service-briefs endpoint. +func EncodeDeleteBriefError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewDeleteBriefConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewDeleteBriefServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewDeleteBriefInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewDeleteBriefNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeCreateCampaignsResponse returns an encoder for responses returned by +// the lfx-v2-campaign-service-briefs create-campaigns endpoint. +func EncodeCreateCampaignsResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.JobCreateResponse) + enc := encoder(ctx, w) + body := NewCreateCampaignsResponseBody(res) + w.WriteHeader(http.StatusAccepted) + return enc.Encode(body) + } +} + +// DecodeCreateCampaignsRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs create-campaigns endpoint. +func DecodeCreateCampaignsRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.CreateCampaignsPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.CreateCampaignsPayload, error) { + var payload *lfxv2campaignservicebriefs.CreateCampaignsPayload + var ( + body CreateCampaignsRequestBody + err error + ) + err = decoder(r).Decode(&body) + if err != nil { + if errors.Is(err, io.EOF) { + return payload, goa.MissingPayloadError() + } + var gerr *goa.ServiceError + if errors.As(err, &gerr) { + return payload, gerr + } + return payload, goa.DecodePayloadError(err.Error()) + } + err = ValidateCreateCampaignsRequestBody(&body) + if err != nil { + return payload, err + } + + var ( + projectID string + briefID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewCreateCampaignsPayload(&body, projectID, briefID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeCreateCampaignsError returns an encoder for errors returned by the +// create-campaigns lfx-v2-campaign-service-briefs endpoint. +func EncodeCreateCampaignsError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateCampaignsBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateCampaignsConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateCampaignsServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateCampaignsInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewCreateCampaignsNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeGetCampaignResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs get-campaign endpoint. +func EncodeGetCampaignResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.Campaign) + enc := encoder(ctx, w) + body := NewGetCampaignResponseBody(res) + if res.Etag != nil { + w.Header().Set("Etag", *res.Etag) + } + w.WriteHeader(http.StatusOK) + return enc.Encode(body) + } +} + +// DecodeGetCampaignRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs get-campaign endpoint. +func DecodeGetCampaignRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.GetCampaignPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.GetCampaignPayload, error) { + var payload *lfxv2campaignservicebriefs.GetCampaignPayload + var ( + projectID string + briefID string + campaignID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + campaignID = params["campaign_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewGetCampaignPayload(projectID, briefID, campaignID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeGetCampaignError returns an encoder for errors returned by the +// get-campaign lfx-v2-campaign-service-briefs endpoint. +func EncodeGetCampaignError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetCampaignConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetCampaignServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetCampaignInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetCampaignNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeUpdateCampaignResponse returns an encoder for responses returned by +// the lfx-v2-campaign-service-briefs update-campaign endpoint. +func EncodeUpdateCampaignResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.Campaign) + enc := encoder(ctx, w) + body := NewUpdateCampaignResponseBody(res) + if res.Etag != nil { + w.Header().Set("Etag", *res.Etag) + } + w.WriteHeader(http.StatusOK) + return enc.Encode(body) + } +} + +// DecodeUpdateCampaignRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs update-campaign endpoint. +func DecodeUpdateCampaignRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.UpdateCampaignPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.UpdateCampaignPayload, error) { + var payload *lfxv2campaignservicebriefs.UpdateCampaignPayload + var ( + body UpdateCampaignRequestBody + err error + ) + err = decoder(r).Decode(&body) + if err != nil { + if errors.Is(err, io.EOF) { + return payload, goa.MissingPayloadError() + } + var gerr *goa.ServiceError + if errors.As(err, &gerr) { + return payload, gerr + } + return payload, goa.DecodePayloadError(err.Error()) + } + err = ValidateUpdateCampaignRequestBody(&body) + if err != nil { + return payload, err + } + + var ( + projectID string + briefID string + campaignID string + bearerToken *string + ifMatch *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + briefID = params["brief_id"] + campaignID = params["campaign_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + ifMatchRaw := r.Header.Get("If-Match") + if ifMatchRaw != "" { + ifMatch = &ifMatchRaw + } + payload = NewUpdateCampaignPayload(&body, projectID, briefID, campaignID, bearerToken, ifMatch) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeUpdateCampaignError returns an encoder for errors returned by the +// update-campaign lfx-v2-campaign-service-briefs endpoint. +func EncodeUpdateCampaignError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + case "PreconditionFailed": + var res *lfxv2campaignservicebriefs.PreconditionFailedError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignPreconditionFailedResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusPreconditionFailed) + return enc.Encode(body) + case "PreconditionRequired": + var res *lfxv2campaignservicebriefs.PreconditionRequiredError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewUpdateCampaignPreconditionRequiredResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusPreconditionRequired) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// EncodeGetJobResponse returns an encoder for responses returned by the +// lfx-v2-campaign-service-briefs get-job endpoint. +func EncodeGetJobResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + res, _ := v.(*lfxv2campaignservicebriefs.JobPollResponse) + enc := encoder(ctx, w) + body := NewGetJobResponseBody(res) + w.WriteHeader(http.StatusOK) + return enc.Encode(body) + } +} + +// DecodeGetJobRequest returns a decoder for requests sent to the +// lfx-v2-campaign-service-briefs get-job endpoint. +func DecodeGetJobRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (*lfxv2campaignservicebriefs.GetJobPayload, error) { + return func(r *http.Request) (*lfxv2campaignservicebriefs.GetJobPayload, error) { + var payload *lfxv2campaignservicebriefs.GetJobPayload + var ( + projectID string + jobID string + bearerToken *string + + params = mux.Vars(r) + ) + projectID = params["project_id"] + jobID = params["job_id"] + bearerTokenRaw := r.Header.Get("Authorization") + if bearerTokenRaw != "" { + bearerToken = &bearerTokenRaw + } + payload = NewGetJobPayload(projectID, jobID, bearerToken) + if payload.BearerToken != nil { + if strings.Contains(*payload.BearerToken, " ") { + // Remove authorization scheme prefix (e.g. "Bearer") + cred := strings.SplitN(*payload.BearerToken, " ", 2)[1] + payload.BearerToken = &cred + } + } + + return payload, nil + } +} + +// EncodeGetJobError returns an encoder for errors returned by the get-job +// lfx-v2-campaign-service-briefs endpoint. +func EncodeGetJobError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, formatter func(ctx context.Context, err error) goahttp.Statuser) func(context.Context, http.ResponseWriter, error) error { + encodeError := goahttp.ErrorEncoder(encoder, formatter) + return func(ctx context.Context, w http.ResponseWriter, v error) error { + var en goa.GoaErrorNamer + if !errors.As(v, &en) { + return encodeError(ctx, w, v) + } + switch en.GoaErrorName() { + case "Conflict": + var res *lfxv2campaignservicebriefs.ConflictError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetJobConflictResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusConflict) + return enc.Encode(body) + case "ServiceUnavailable": + var res *lfxv2campaignservicebriefs.ConnServiceUnavailableError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetJobServiceUnavailableResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusServiceUnavailable) + return enc.Encode(body) + case "InternalServerError": + var res *lfxv2campaignservicebriefs.InternalServerError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetJobInternalServerErrorResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusInternalServerError) + return enc.Encode(body) + case "NotFound": + var res *lfxv2campaignservicebriefs.NotFoundError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetJobNotFoundResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusNotFound) + return enc.Encode(body) + default: + return encodeError(ctx, w, v) + } + } +} + +// unmarshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput builds +// a value of type *lfxv2campaignservicebriefs.BriefInput from a value of type +// *BriefInputRequestBody. +func unmarshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput(v *BriefInputRequestBody) *lfxv2campaignservicebriefs.BriefInput { + res := &lfxv2campaignservicebriefs.BriefInput{ + ProgramType: *v.ProgramType, + EventSlug: *v.EventSlug, + URL: v.URL, + EventDetails: v.EventDetails, + Copy: v.Copy, + Keywords: v.Keywords, + Targeting: v.Targeting, + } + if v.Platforms != nil { + res.Platforms = make([]string, len(v.Platforms)) + for i, val := range v.Platforms { + res.Platforms[i] = val + } + } + + return res +} + +// unmarshalCampaignCreateInputRequestBodyToLfxv2campaignservicebriefsCampaignCreateInput +// builds a value of type *lfxv2campaignservicebriefs.CampaignCreateInput from +// a value of type *CampaignCreateInputRequestBody. +func unmarshalCampaignCreateInputRequestBodyToLfxv2campaignservicebriefsCampaignCreateInput(v *CampaignCreateInputRequestBody) *lfxv2campaignservicebriefs.CampaignCreateInput { + res := &lfxv2campaignservicebriefs.CampaignCreateInput{ + Config: v.Config, + } + res.Platforms = make([]string, len(v.Platforms)) + for i, val := range v.Platforms { + res.Platforms[i] = val + } + + return res +} + +// unmarshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUpdateInput +// builds a value of type *lfxv2campaignservicebriefs.CampaignUpdateInput from +// a value of type *CampaignUpdateInputRequestBody. +func unmarshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUpdateInput(v *CampaignUpdateInputRequestBody) *lfxv2campaignservicebriefs.CampaignUpdateInput { + res := &lfxv2campaignservicebriefs.CampaignUpdateInput{ + CampaignName: *v.CampaignName, + Status: *v.Status, + Config: v.Config, + } + + return res +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/paths.go b/gen/http/lfx_v2_campaign_service_briefs/server/paths.go new file mode 100644 index 00000000..352e66ae --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/server/paths.go @@ -0,0 +1,57 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// HTTP request path constructors for the lfx-v2-campaign-service-briefs service. +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package server + +import ( + "fmt" +) + +// CreateBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service create-brief HTTP endpoint. +func CreateBriefLfxV2CampaignServiceBriefsPath(projectID string) string { + return fmt.Sprintf("/projects/%v/briefs", projectID) +} + +// GetBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service get-brief HTTP endpoint. +func GetBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v", projectID, briefID) +} + +// UpdateBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service update-brief HTTP endpoint. +func UpdateBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v", projectID, briefID) +} + +// ApproveBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service approve-brief HTTP endpoint. +func ApproveBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/approve", projectID, briefID) +} + +// DeleteBriefLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service delete-brief HTTP endpoint. +func DeleteBriefLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v", projectID, briefID) +} + +// CreateCampaignsLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service create-campaigns HTTP endpoint. +func CreateCampaignsLfxV2CampaignServiceBriefsPath(projectID string, briefID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/campaigns", projectID, briefID) +} + +// GetCampaignLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service get-campaign HTTP endpoint. +func GetCampaignLfxV2CampaignServiceBriefsPath(projectID string, briefID string, campaignID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/campaigns/%v", projectID, briefID, campaignID) +} + +// UpdateCampaignLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service update-campaign HTTP endpoint. +func UpdateCampaignLfxV2CampaignServiceBriefsPath(projectID string, briefID string, campaignID string) string { + return fmt.Sprintf("/projects/%v/briefs/%v/campaigns/%v", projectID, briefID, campaignID) +} + +// GetJobLfxV2CampaignServiceBriefsPath returns the URL path to the lfx-v2-campaign-service-briefs service get-job HTTP endpoint. +func GetJobLfxV2CampaignServiceBriefsPath(projectID string, jobID string) string { + return fmt.Sprintf("/projects/%v/jobs/%v", projectID, jobID) +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/server.go b/gen/http/lfx_v2_campaign_service_briefs/server/server.go new file mode 100644 index 00000000..f839b3cb --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/server/server.go @@ -0,0 +1,604 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs HTTP server +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package server + +import ( + "context" + "net/http" + + lfxv2campaignservicebriefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" +) + +// Server lists the lfx-v2-campaign-service-briefs service endpoint HTTP +// handlers. +type Server struct { + Mounts []*MountPoint + CreateBrief http.Handler + GetBrief http.Handler + UpdateBrief http.Handler + ApproveBrief http.Handler + DeleteBrief http.Handler + CreateCampaigns http.Handler + GetCampaign http.Handler + UpdateCampaign http.Handler + GetJob http.Handler +} + +// MountPoint holds information about the mounted endpoints. +type MountPoint struct { + // Method is the name of the service method served by the mounted HTTP handler. + Method string + // Verb is the HTTP method used to match requests to the mounted handler. + Verb string + // Pattern is the HTTP request path pattern used to match requests to the + // mounted handler. + Pattern string +} + +// New instantiates HTTP handlers for all the lfx-v2-campaign-service-briefs +// service endpoints using the provided encoder and decoder. The handlers are +// mounted on the given mux using the HTTP verb and path defined in the design. +// errhandler is called whenever a response fails to be encoded. formatter is +// used to format errors returned by the service methods prior to encoding. +// Both errhandler and formatter are optional and can be nil. +func New( + e *lfxv2campaignservicebriefs.Endpoints, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) *Server { + return &Server{ + Mounts: []*MountPoint{ + {"CreateBrief", "POST", "/projects/{project_id}/briefs"}, + {"GetBrief", "GET", "/projects/{project_id}/briefs/{brief_id}"}, + {"UpdateBrief", "PUT", "/projects/{project_id}/briefs/{brief_id}"}, + {"ApproveBrief", "POST", "/projects/{project_id}/briefs/{brief_id}/approve"}, + {"DeleteBrief", "DELETE", "/projects/{project_id}/briefs/{brief_id}"}, + {"CreateCampaigns", "POST", "/projects/{project_id}/briefs/{brief_id}/campaigns"}, + {"GetCampaign", "GET", "/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}"}, + {"UpdateCampaign", "PUT", "/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}"}, + {"GetJob", "GET", "/projects/{project_id}/jobs/{job_id}"}, + }, + CreateBrief: NewCreateBriefHandler(e.CreateBrief, mux, decoder, encoder, errhandler, formatter), + GetBrief: NewGetBriefHandler(e.GetBrief, mux, decoder, encoder, errhandler, formatter), + UpdateBrief: NewUpdateBriefHandler(e.UpdateBrief, mux, decoder, encoder, errhandler, formatter), + ApproveBrief: NewApproveBriefHandler(e.ApproveBrief, mux, decoder, encoder, errhandler, formatter), + DeleteBrief: NewDeleteBriefHandler(e.DeleteBrief, mux, decoder, encoder, errhandler, formatter), + CreateCampaigns: NewCreateCampaignsHandler(e.CreateCampaigns, mux, decoder, encoder, errhandler, formatter), + GetCampaign: NewGetCampaignHandler(e.GetCampaign, mux, decoder, encoder, errhandler, formatter), + UpdateCampaign: NewUpdateCampaignHandler(e.UpdateCampaign, mux, decoder, encoder, errhandler, formatter), + GetJob: NewGetJobHandler(e.GetJob, mux, decoder, encoder, errhandler, formatter), + } +} + +// Service returns the name of the service served. +func (s *Server) Service() string { return "lfx-v2-campaign-service-briefs" } + +// Use wraps the server handlers with the given middleware. +func (s *Server) Use(m func(http.Handler) http.Handler) { + s.CreateBrief = m(s.CreateBrief) + s.GetBrief = m(s.GetBrief) + s.UpdateBrief = m(s.UpdateBrief) + s.ApproveBrief = m(s.ApproveBrief) + s.DeleteBrief = m(s.DeleteBrief) + s.CreateCampaigns = m(s.CreateCampaigns) + s.GetCampaign = m(s.GetCampaign) + s.UpdateCampaign = m(s.UpdateCampaign) + s.GetJob = m(s.GetJob) +} + +// MethodNames returns the methods served. +func (s *Server) MethodNames() []string { return lfxv2campaignservicebriefs.MethodNames[:] } + +// Mount configures the mux to serve the lfx-v2-campaign-service-briefs +// endpoints. +func Mount(mux goahttp.Muxer, h *Server) { + MountCreateBriefHandler(mux, h.CreateBrief) + MountGetBriefHandler(mux, h.GetBrief) + MountUpdateBriefHandler(mux, h.UpdateBrief) + MountApproveBriefHandler(mux, h.ApproveBrief) + MountDeleteBriefHandler(mux, h.DeleteBrief) + MountCreateCampaignsHandler(mux, h.CreateCampaigns) + MountGetCampaignHandler(mux, h.GetCampaign) + MountUpdateCampaignHandler(mux, h.UpdateCampaign) + MountGetJobHandler(mux, h.GetJob) +} + +// Mount configures the mux to serve the lfx-v2-campaign-service-briefs +// endpoints. +func (s *Server) Mount(mux goahttp.Muxer) { + Mount(mux, s) +} + +// MountCreateBriefHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint. +func MountCreateBriefHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("POST", "/projects/{project_id}/briefs", f) +} + +// NewCreateBriefHandler creates a HTTP handler which loads the HTTP request +// and calls the "lfx-v2-campaign-service-briefs" service "create-brief" +// endpoint. +func NewCreateBriefHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeCreateBriefRequest(mux, decoder) + encodeResponse = EncodeCreateBriefResponse(encoder) + encodeError = EncodeCreateBriefError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "create-brief") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountGetBriefHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint. +func MountGetBriefHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("GET", "/projects/{project_id}/briefs/{brief_id}", f) +} + +// NewGetBriefHandler creates a HTTP handler which loads the HTTP request and +// calls the "lfx-v2-campaign-service-briefs" service "get-brief" endpoint. +func NewGetBriefHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeGetBriefRequest(mux, decoder) + encodeResponse = EncodeGetBriefResponse(encoder) + encodeError = EncodeGetBriefError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "get-brief") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountUpdateBriefHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint. +func MountUpdateBriefHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("PUT", "/projects/{project_id}/briefs/{brief_id}", f) +} + +// NewUpdateBriefHandler creates a HTTP handler which loads the HTTP request +// and calls the "lfx-v2-campaign-service-briefs" service "update-brief" +// endpoint. +func NewUpdateBriefHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeUpdateBriefRequest(mux, decoder) + encodeResponse = EncodeUpdateBriefResponse(encoder) + encodeError = EncodeUpdateBriefError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "update-brief") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountApproveBriefHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint. +func MountApproveBriefHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("POST", "/projects/{project_id}/briefs/{brief_id}/approve", f) +} + +// NewApproveBriefHandler creates a HTTP handler which loads the HTTP request +// and calls the "lfx-v2-campaign-service-briefs" service "approve-brief" +// endpoint. +func NewApproveBriefHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeApproveBriefRequest(mux, decoder) + encodeResponse = EncodeApproveBriefResponse(encoder) + encodeError = EncodeApproveBriefError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "approve-brief") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountDeleteBriefHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint. +func MountDeleteBriefHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("DELETE", "/projects/{project_id}/briefs/{brief_id}", f) +} + +// NewDeleteBriefHandler creates a HTTP handler which loads the HTTP request +// and calls the "lfx-v2-campaign-service-briefs" service "delete-brief" +// endpoint. +func NewDeleteBriefHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeDeleteBriefRequest(mux, decoder) + encodeResponse = EncodeDeleteBriefResponse(encoder) + encodeError = EncodeDeleteBriefError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "delete-brief") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountCreateCampaignsHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint. +func MountCreateCampaignsHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("POST", "/projects/{project_id}/briefs/{brief_id}/campaigns", f) +} + +// NewCreateCampaignsHandler creates a HTTP handler which loads the HTTP +// request and calls the "lfx-v2-campaign-service-briefs" service +// "create-campaigns" endpoint. +func NewCreateCampaignsHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeCreateCampaignsRequest(mux, decoder) + encodeResponse = EncodeCreateCampaignsResponse(encoder) + encodeError = EncodeCreateCampaignsError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "create-campaigns") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountGetCampaignHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint. +func MountGetCampaignHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("GET", "/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}", f) +} + +// NewGetCampaignHandler creates a HTTP handler which loads the HTTP request +// and calls the "lfx-v2-campaign-service-briefs" service "get-campaign" +// endpoint. +func NewGetCampaignHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeGetCampaignRequest(mux, decoder) + encodeResponse = EncodeGetCampaignResponse(encoder) + encodeError = EncodeGetCampaignError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "get-campaign") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountUpdateCampaignHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint. +func MountUpdateCampaignHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("PUT", "/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}", f) +} + +// NewUpdateCampaignHandler creates a HTTP handler which loads the HTTP request +// and calls the "lfx-v2-campaign-service-briefs" service "update-campaign" +// endpoint. +func NewUpdateCampaignHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeUpdateCampaignRequest(mux, decoder) + encodeResponse = EncodeUpdateCampaignResponse(encoder) + encodeError = EncodeUpdateCampaignError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "update-campaign") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} + +// MountGetJobHandler configures the mux to serve the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint. +func MountGetJobHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("GET", "/projects/{project_id}/jobs/{job_id}", f) +} + +// NewGetJobHandler creates a HTTP handler which loads the HTTP request and +// calls the "lfx-v2-campaign-service-briefs" service "get-job" endpoint. +func NewGetJobHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + decodeRequest = DecodeGetJobRequest(mux, decoder) + encodeResponse = EncodeGetJobResponse(encoder) + encodeError = EncodeGetJobError(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "get-job") + ctx = context.WithValue(ctx, goa.ServiceKey, "lfx-v2-campaign-service-briefs") + payload, err := decodeRequest(r) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + res, err := endpoint(ctx, payload) + if err != nil { + if err := encodeError(ctx, w, err); err != nil && errhandler != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + if errhandler != nil { + errhandler(ctx, w, err) + } + } + }) +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go new file mode 100644 index 00000000..0a84552f --- /dev/null +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -0,0 +1,1500 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs HTTP server types +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package server + +import ( + lfxv2campaignservicebriefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + goa "goa.design/goa/v3/pkg" +) + +// CreateBriefRequestBody is the type of the "lfx-v2-campaign-service-briefs" +// service "create-brief" endpoint HTTP request body. +type CreateBriefRequestBody struct { + Brief *BriefInputRequestBody `form:"brief,omitempty" json:"brief,omitempty" xml:"brief,omitempty"` +} + +// UpdateBriefRequestBody is the type of the "lfx-v2-campaign-service-briefs" +// service "update-brief" endpoint HTTP request body. +type UpdateBriefRequestBody struct { + Brief *BriefInputRequestBody `form:"brief,omitempty" json:"brief,omitempty" xml:"brief,omitempty"` +} + +// CreateCampaignsRequestBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// request body. +type CreateCampaignsRequestBody struct { + Input *CampaignCreateInputRequestBody `form:"input,omitempty" json:"input,omitempty" xml:"input,omitempty"` +} + +// UpdateCampaignRequestBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// request body. +type UpdateCampaignRequestBody struct { + Campaign *CampaignUpdateInputRequestBody `form:"campaign,omitempty" json:"campaign,omitempty" xml:"campaign,omitempty"` +} + +// CreateBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "create-brief" endpoint HTTP response body. +type CreateBriefResponseBody struct { + // Brief UUID + ID string `form:"id" json:"id" xml:"id"` + // Owning project + ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` + // Funnel context + ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` + // Event/course slug + EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status string `form:"status" json:"status" xml:"status"` + // Optimistic-concurrency version + Version int64 `form:"version" json:"version" xml:"version"` +} + +// GetBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "get-brief" endpoint HTTP response body. +type GetBriefResponseBody struct { + // Brief UUID + ID string `form:"id" json:"id" xml:"id"` + // Owning project + ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` + // Funnel context + ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` + // Event/course slug + EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status string `form:"status" json:"status" xml:"status"` + // Optimistic-concurrency version + Version int64 `form:"version" json:"version" xml:"version"` +} + +// UpdateBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "update-brief" endpoint HTTP response body. +type UpdateBriefResponseBody struct { + // Brief UUID + ID string `form:"id" json:"id" xml:"id"` + // Owning project + ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` + // Funnel context + ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` + // Event/course slug + EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status string `form:"status" json:"status" xml:"status"` + // Optimistic-concurrency version + Version int64 `form:"version" json:"version" xml:"version"` +} + +// ApproveBriefResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "approve-brief" endpoint HTTP response body. +type ApproveBriefResponseBody struct { + // Brief UUID + ID string `form:"id" json:"id" xml:"id"` + // Owning project + ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` + // Funnel context + ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` + // Event/course slug + EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Lifecycle status + Status string `form:"status" json:"status" xml:"status"` + // Optimistic-concurrency version + Version int64 `form:"version" json:"version" xml:"version"` +} + +// CreateCampaignsResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body. +type CreateCampaignsResponseBody struct { + // Poll GET /projects/{projectId}/jobs/{jobId} + JobID string `form:"job_id" json:"job_id" xml:"job_id"` + // Initial status (always 'queued' on create) + Status string `form:"status" json:"status" xml:"status"` + // Platforms this job will create on + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` +} + +// GetCampaignResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "get-campaign" endpoint HTTP response body. +type GetCampaignResponseBody struct { + // Campaign UUID + ID string `form:"id" json:"id" xml:"id"` + // Owning project + ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` + // Parent brief + BriefID string `form:"brief_id" json:"brief_id" xml:"brief_id"` + // Channel + Platform string `form:"platform" json:"platform" xml:"platform"` + // ID returned by the ad platform + PlatformCampaignID *string `form:"platform_campaign_id,omitempty" json:"platform_campaign_id,omitempty" xml:"platform_campaign_id,omitempty"` + // Campaign name + CampaignName string `form:"campaign_name" json:"campaign_name" xml:"campaign_name"` + // Campaign status + Status string `form:"status" json:"status" xml:"status"` + // Optimistic-concurrency version + Version int64 `form:"version" json:"version" xml:"version"` +} + +// UpdateCampaignResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body. +type UpdateCampaignResponseBody struct { + // Campaign UUID + ID string `form:"id" json:"id" xml:"id"` + // Owning project + ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` + // Parent brief + BriefID string `form:"brief_id" json:"brief_id" xml:"brief_id"` + // Channel + Platform string `form:"platform" json:"platform" xml:"platform"` + // ID returned by the ad platform + PlatformCampaignID *string `form:"platform_campaign_id,omitempty" json:"platform_campaign_id,omitempty" xml:"platform_campaign_id,omitempty"` + // Campaign name + CampaignName string `form:"campaign_name" json:"campaign_name" xml:"campaign_name"` + // Campaign status + Status string `form:"status" json:"status" xml:"status"` + // Optimistic-concurrency version + Version int64 `form:"version" json:"version" xml:"version"` +} + +// GetJobResponseBody is the type of the "lfx-v2-campaign-service-briefs" +// service "get-job" endpoint HTTP response body. +type GetJobResponseBody struct { + // Job UUID + JobID string `form:"job_id" json:"job_id" xml:"job_id"` + // Job status + Status string `form:"status" json:"status" xml:"status"` + // Per-platform results, populated as each completes + Result any `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` + // Terminal error, if any + Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` +} + +// CreateBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "BadRequest" error. +type CreateBriefBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "Conflict" error. +type CreateBriefConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type CreateBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type CreateBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-brief" endpoint HTTP +// response body for the "NotFound" error. +type CreateBriefNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "Conflict" error. +type GetBriefConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "ServiceUnavailable" error. +type GetBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "InternalServerError" error. +type GetBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "NotFound" error. +type GetBriefNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "BadRequest" error. +type UpdateBriefBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "Conflict" error. +type UpdateBriefConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type UpdateBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type UpdateBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "NotFound" error. +type UpdateBriefNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefPreconditionFailedResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "PreconditionFailed" error. +type UpdateBriefPreconditionFailedResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateBriefPreconditionRequiredResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-brief" endpoint HTTP +// response body for the "PreconditionRequired" error. +type UpdateBriefPreconditionRequiredResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// ApproveBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "Conflict" error. +type ApproveBriefConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// ApproveBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type ApproveBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// ApproveBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type ApproveBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// ApproveBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "NotFound" error. +type ApproveBriefNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// DeleteBriefConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "Conflict" error. +type DeleteBriefConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// DeleteBriefServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type DeleteBriefServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// DeleteBriefInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "InternalServerError" error. +type DeleteBriefInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// DeleteBriefNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "NotFound" error. +type DeleteBriefNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateCampaignsBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "BadRequest" error. +type CreateCampaignsBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateCampaignsConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "Conflict" error. +type CreateCampaignsConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateCampaignsServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type CreateCampaignsServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateCampaignsInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "InternalServerError" error. +type CreateCampaignsInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// CreateCampaignsNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "create-campaigns" endpoint HTTP +// response body for the "NotFound" error. +type CreateCampaignsNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetCampaignConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "Conflict" error. +type GetCampaignConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetCampaignServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type GetCampaignServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetCampaignInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "InternalServerError" error. +type GetCampaignInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetCampaignNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "NotFound" error. +type GetCampaignNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "BadRequest" error. +type UpdateCampaignBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "Conflict" error. +type UpdateCampaignConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "ServiceUnavailable" error. +type UpdateCampaignServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "InternalServerError" error. +type UpdateCampaignInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "NotFound" error. +type UpdateCampaignNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignPreconditionFailedResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "PreconditionFailed" error. +type UpdateCampaignPreconditionFailedResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// UpdateCampaignPreconditionRequiredResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "update-campaign" endpoint HTTP +// response body for the "PreconditionRequired" error. +type UpdateCampaignPreconditionRequiredResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetJobConflictResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "Conflict" error. +type GetJobConflictResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetJobServiceUnavailableResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "ServiceUnavailable" error. +type GetJobServiceUnavailableResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetJobInternalServerErrorResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "InternalServerError" error. +type GetJobInternalServerErrorResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// GetJobNotFoundResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "NotFound" error. +type GetJobNotFoundResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// BriefInputRequestBody is used to define fields on request body types. +type BriefInputRequestBody struct { + // Funnel context + ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` + // Event/course slug (unique within the project) + EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` + // Event/course page URL + URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` +} + +// CampaignCreateInputRequestBody is used to define fields on request body +// types. +type CampaignCreateInputRequestBody struct { + // Platforms to create campaigns on (binding selection) + Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Per-platform campaign configuration + Config any `form:"config,omitempty" json:"config,omitempty" xml:"config,omitempty"` +} + +// CampaignUpdateInputRequestBody is used to define fields on request body +// types. +type CampaignUpdateInputRequestBody struct { + // Campaign name + CampaignName *string `form:"campaign_name,omitempty" json:"campaign_name,omitempty" xml:"campaign_name,omitempty"` + // Campaign status + Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` + // Campaign configuration snapshot + Config any `form:"config,omitempty" json:"config,omitempty" xml:"config,omitempty"` +} + +// NewCreateBriefResponseBody builds the HTTP response body from the result of +// the "create-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *CreateBriefResponseBody { + body := &CreateBriefResponseBody{ + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + Status: res.Status, + Version: res.Version, + } + if res.Platforms != nil { + body.Platforms = make([]string, len(res.Platforms)) + for i, val := range res.Platforms { + body.Platforms[i] = val + } + } + return body +} + +// NewGetBriefResponseBody builds the HTTP response body from the result of the +// "get-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewGetBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *GetBriefResponseBody { + body := &GetBriefResponseBody{ + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + Status: res.Status, + Version: res.Version, + } + if res.Platforms != nil { + body.Platforms = make([]string, len(res.Platforms)) + for i, val := range res.Platforms { + body.Platforms[i] = val + } + } + return body +} + +// NewUpdateBriefResponseBody builds the HTTP response body from the result of +// the "update-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *UpdateBriefResponseBody { + body := &UpdateBriefResponseBody{ + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + Status: res.Status, + Version: res.Version, + } + if res.Platforms != nil { + body.Platforms = make([]string, len(res.Platforms)) + for i, val := range res.Platforms { + body.Platforms[i] = val + } + } + return body +} + +// NewApproveBriefResponseBody builds the HTTP response body from the result of +// the "approve-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *ApproveBriefResponseBody { + body := &ApproveBriefResponseBody{ + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + Status: res.Status, + Version: res.Version, + } + if res.Platforms != nil { + body.Platforms = make([]string, len(res.Platforms)) + for i, val := range res.Platforms { + body.Platforms[i] = val + } + } + return body +} + +// NewCreateCampaignsResponseBody builds the HTTP response body from the result +// of the "create-campaigns" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewCreateCampaignsResponseBody(res *lfxv2campaignservicebriefs.JobCreateResponse) *CreateCampaignsResponseBody { + body := &CreateCampaignsResponseBody{ + JobID: res.JobID, + Status: res.Status, + } + if res.Platforms != nil { + body.Platforms = make([]string, len(res.Platforms)) + for i, val := range res.Platforms { + body.Platforms[i] = val + } + } + return body +} + +// NewGetCampaignResponseBody builds the HTTP response body from the result of +// the "get-campaign" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewGetCampaignResponseBody(res *lfxv2campaignservicebriefs.Campaign) *GetCampaignResponseBody { + body := &GetCampaignResponseBody{ + ID: res.ID, + ProjectID: res.ProjectID, + BriefID: res.BriefID, + Platform: res.Platform, + PlatformCampaignID: res.PlatformCampaignID, + CampaignName: res.CampaignName, + Status: res.Status, + Version: res.Version, + } + return body +} + +// NewUpdateCampaignResponseBody builds the HTTP response body from the result +// of the "update-campaign" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewUpdateCampaignResponseBody(res *lfxv2campaignservicebriefs.Campaign) *UpdateCampaignResponseBody { + body := &UpdateCampaignResponseBody{ + ID: res.ID, + ProjectID: res.ProjectID, + BriefID: res.BriefID, + Platform: res.Platform, + PlatformCampaignID: res.PlatformCampaignID, + CampaignName: res.CampaignName, + Status: res.Status, + Version: res.Version, + } + return body +} + +// NewGetJobResponseBody builds the HTTP response body from the result of the +// "get-job" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewGetJobResponseBody(res *lfxv2campaignservicebriefs.JobPollResponse) *GetJobResponseBody { + body := &GetJobResponseBody{ + JobID: res.JobID, + Status: res.Status, + Result: res.Result, + Error: res.Error, + } + return body +} + +// NewCreateBriefBadRequestResponseBody builds the HTTP response body from the +// result of the "create-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *CreateBriefBadRequestResponseBody { + body := &CreateBriefBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateBriefConflictResponseBody builds the HTTP response body from the +// result of the "create-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *CreateBriefConflictResponseBody { + body := &CreateBriefConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateBriefServiceUnavailableResponseBody builds the HTTP response body +// from the result of the "create-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *CreateBriefServiceUnavailableResponseBody { + body := &CreateBriefServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateBriefInternalServerErrorResponseBody builds the HTTP response body +// from the result of the "create-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *CreateBriefInternalServerErrorResponseBody { + body := &CreateBriefInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateBriefNotFoundResponseBody builds the HTTP response body from the +// result of the "create-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *CreateBriefNotFoundResponseBody { + body := &CreateBriefNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetBriefConflictResponseBody builds the HTTP response body from the +// result of the "get-brief" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewGetBriefConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *GetBriefConflictResponseBody { + body := &GetBriefConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetBriefServiceUnavailableResponseBody builds the HTTP response body from +// the result of the "get-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetBriefServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *GetBriefServiceUnavailableResponseBody { + body := &GetBriefServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetBriefInternalServerErrorResponseBody builds the HTTP response body +// from the result of the "get-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetBriefInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *GetBriefInternalServerErrorResponseBody { + body := &GetBriefInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetBriefNotFoundResponseBody builds the HTTP response body from the +// result of the "get-brief" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewGetBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *GetBriefNotFoundResponseBody { + body := &GetBriefNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefBadRequestResponseBody builds the HTTP response body from the +// result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *UpdateBriefBadRequestResponseBody { + body := &UpdateBriefBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefConflictResponseBody builds the HTTP response body from the +// result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *UpdateBriefConflictResponseBody { + body := &UpdateBriefConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefServiceUnavailableResponseBody builds the HTTP response body +// from the result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *UpdateBriefServiceUnavailableResponseBody { + body := &UpdateBriefServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefInternalServerErrorResponseBody builds the HTTP response body +// from the result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *UpdateBriefInternalServerErrorResponseBody { + body := &UpdateBriefInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefNotFoundResponseBody builds the HTTP response body from the +// result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *UpdateBriefNotFoundResponseBody { + body := &UpdateBriefNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefPreconditionFailedResponseBody builds the HTTP response body +// from the result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefPreconditionFailedResponseBody(res *lfxv2campaignservicebriefs.PreconditionFailedError) *UpdateBriefPreconditionFailedResponseBody { + body := &UpdateBriefPreconditionFailedResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateBriefPreconditionRequiredResponseBody builds the HTTP response body +// from the result of the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateBriefPreconditionRequiredResponseBody(res *lfxv2campaignservicebriefs.PreconditionRequiredError) *UpdateBriefPreconditionRequiredResponseBody { + body := &UpdateBriefPreconditionRequiredResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewApproveBriefConflictResponseBody builds the HTTP response body from the +// result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *ApproveBriefConflictResponseBody { + body := &ApproveBriefConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewApproveBriefServiceUnavailableResponseBody builds the HTTP response body +// from the result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *ApproveBriefServiceUnavailableResponseBody { + body := &ApproveBriefServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewApproveBriefInternalServerErrorResponseBody builds the HTTP response body +// from the result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *ApproveBriefInternalServerErrorResponseBody { + body := &ApproveBriefInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewApproveBriefNotFoundResponseBody builds the HTTP response body from the +// result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *ApproveBriefNotFoundResponseBody { + body := &ApproveBriefNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewDeleteBriefConflictResponseBody builds the HTTP response body from the +// result of the "delete-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewDeleteBriefConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *DeleteBriefConflictResponseBody { + body := &DeleteBriefConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewDeleteBriefServiceUnavailableResponseBody builds the HTTP response body +// from the result of the "delete-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewDeleteBriefServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *DeleteBriefServiceUnavailableResponseBody { + body := &DeleteBriefServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewDeleteBriefInternalServerErrorResponseBody builds the HTTP response body +// from the result of the "delete-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewDeleteBriefInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *DeleteBriefInternalServerErrorResponseBody { + body := &DeleteBriefInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewDeleteBriefNotFoundResponseBody builds the HTTP response body from the +// result of the "delete-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewDeleteBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *DeleteBriefNotFoundResponseBody { + body := &DeleteBriefNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateCampaignsBadRequestResponseBody builds the HTTP response body from +// the result of the "create-campaigns" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateCampaignsBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *CreateCampaignsBadRequestResponseBody { + body := &CreateCampaignsBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateCampaignsConflictResponseBody builds the HTTP response body from +// the result of the "create-campaigns" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateCampaignsConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *CreateCampaignsConflictResponseBody { + body := &CreateCampaignsConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateCampaignsServiceUnavailableResponseBody builds the HTTP response +// body from the result of the "create-campaigns" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateCampaignsServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *CreateCampaignsServiceUnavailableResponseBody { + body := &CreateCampaignsServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateCampaignsInternalServerErrorResponseBody builds the HTTP response +// body from the result of the "create-campaigns" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateCampaignsInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *CreateCampaignsInternalServerErrorResponseBody { + body := &CreateCampaignsInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateCampaignsNotFoundResponseBody builds the HTTP response body from +// the result of the "create-campaigns" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewCreateCampaignsNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *CreateCampaignsNotFoundResponseBody { + body := &CreateCampaignsNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetCampaignConflictResponseBody builds the HTTP response body from the +// result of the "get-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetCampaignConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *GetCampaignConflictResponseBody { + body := &GetCampaignConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetCampaignServiceUnavailableResponseBody builds the HTTP response body +// from the result of the "get-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetCampaignServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *GetCampaignServiceUnavailableResponseBody { + body := &GetCampaignServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetCampaignInternalServerErrorResponseBody builds the HTTP response body +// from the result of the "get-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetCampaignInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *GetCampaignInternalServerErrorResponseBody { + body := &GetCampaignInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetCampaignNotFoundResponseBody builds the HTTP response body from the +// result of the "get-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetCampaignNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *GetCampaignNotFoundResponseBody { + body := &GetCampaignNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignBadRequestResponseBody builds the HTTP response body from +// the result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *UpdateCampaignBadRequestResponseBody { + body := &UpdateCampaignBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignConflictResponseBody builds the HTTP response body from the +// result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *UpdateCampaignConflictResponseBody { + body := &UpdateCampaignConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignServiceUnavailableResponseBody builds the HTTP response +// body from the result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *UpdateCampaignServiceUnavailableResponseBody { + body := &UpdateCampaignServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignInternalServerErrorResponseBody builds the HTTP response +// body from the result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *UpdateCampaignInternalServerErrorResponseBody { + body := &UpdateCampaignInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignNotFoundResponseBody builds the HTTP response body from the +// result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *UpdateCampaignNotFoundResponseBody { + body := &UpdateCampaignNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignPreconditionFailedResponseBody builds the HTTP response +// body from the result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignPreconditionFailedResponseBody(res *lfxv2campaignservicebriefs.PreconditionFailedError) *UpdateCampaignPreconditionFailedResponseBody { + body := &UpdateCampaignPreconditionFailedResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewUpdateCampaignPreconditionRequiredResponseBody builds the HTTP response +// body from the result of the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewUpdateCampaignPreconditionRequiredResponseBody(res *lfxv2campaignservicebriefs.PreconditionRequiredError) *UpdateCampaignPreconditionRequiredResponseBody { + body := &UpdateCampaignPreconditionRequiredResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetJobConflictResponseBody builds the HTTP response body from the result +// of the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewGetJobConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *GetJobConflictResponseBody { + body := &GetJobConflictResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetJobServiceUnavailableResponseBody builds the HTTP response body from +// the result of the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewGetJobServiceUnavailableResponseBody(res *lfxv2campaignservicebriefs.ConnServiceUnavailableError) *GetJobServiceUnavailableResponseBody { + body := &GetJobServiceUnavailableResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetJobInternalServerErrorResponseBody builds the HTTP response body from +// the result of the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewGetJobInternalServerErrorResponseBody(res *lfxv2campaignservicebriefs.InternalServerError) *GetJobInternalServerErrorResponseBody { + body := &GetJobInternalServerErrorResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewGetJobNotFoundResponseBody builds the HTTP response body from the result +// of the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" service. +func NewGetJobNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoundError) *GetJobNotFoundResponseBody { + body := &GetJobNotFoundResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewCreateBriefPayload builds a lfx-v2-campaign-service-briefs service +// create-brief endpoint payload. +func NewCreateBriefPayload(body *CreateBriefRequestBody, projectID string, bearerToken *string) *lfxv2campaignservicebriefs.CreateBriefPayload { + v := &lfxv2campaignservicebriefs.CreateBriefPayload{} + v.Brief = unmarshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput(body.Brief) + v.ProjectID = projectID + v.BearerToken = bearerToken + + return v +} + +// NewGetBriefPayload builds a lfx-v2-campaign-service-briefs service get-brief +// endpoint payload. +func NewGetBriefPayload(projectID string, briefID string, bearerToken *string) *lfxv2campaignservicebriefs.GetBriefPayload { + v := &lfxv2campaignservicebriefs.GetBriefPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v +} + +// NewUpdateBriefPayload builds a lfx-v2-campaign-service-briefs service +// update-brief endpoint payload. +func NewUpdateBriefPayload(body *UpdateBriefRequestBody, projectID string, briefID string, bearerToken *string, ifMatch *string) *lfxv2campaignservicebriefs.UpdateBriefPayload { + v := &lfxv2campaignservicebriefs.UpdateBriefPayload{} + v.Brief = unmarshalBriefInputRequestBodyToLfxv2campaignservicebriefsBriefInput(body.Brief) + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + v.IfMatch = ifMatch + + return v +} + +// NewApproveBriefPayload builds a lfx-v2-campaign-service-briefs service +// approve-brief endpoint payload. +func NewApproveBriefPayload(projectID string, briefID string, bearerToken *string) *lfxv2campaignservicebriefs.ApproveBriefPayload { + v := &lfxv2campaignservicebriefs.ApproveBriefPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v +} + +// NewDeleteBriefPayload builds a lfx-v2-campaign-service-briefs service +// delete-brief endpoint payload. +func NewDeleteBriefPayload(projectID string, briefID string, bearerToken *string) *lfxv2campaignservicebriefs.DeleteBriefPayload { + v := &lfxv2campaignservicebriefs.DeleteBriefPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v +} + +// NewCreateCampaignsPayload builds a lfx-v2-campaign-service-briefs service +// create-campaigns endpoint payload. +func NewCreateCampaignsPayload(body *CreateCampaignsRequestBody, projectID string, briefID string, bearerToken *string) *lfxv2campaignservicebriefs.CreateCampaignsPayload { + v := &lfxv2campaignservicebriefs.CreateCampaignsPayload{} + v.Input = unmarshalCampaignCreateInputRequestBodyToLfxv2campaignservicebriefsCampaignCreateInput(body.Input) + v.ProjectID = projectID + v.BriefID = briefID + v.BearerToken = bearerToken + + return v +} + +// NewGetCampaignPayload builds a lfx-v2-campaign-service-briefs service +// get-campaign endpoint payload. +func NewGetCampaignPayload(projectID string, briefID string, campaignID string, bearerToken *string) *lfxv2campaignservicebriefs.GetCampaignPayload { + v := &lfxv2campaignservicebriefs.GetCampaignPayload{} + v.ProjectID = projectID + v.BriefID = briefID + v.CampaignID = campaignID + v.BearerToken = bearerToken + + return v +} + +// NewUpdateCampaignPayload builds a lfx-v2-campaign-service-briefs service +// update-campaign endpoint payload. +func NewUpdateCampaignPayload(body *UpdateCampaignRequestBody, projectID string, briefID string, campaignID string, bearerToken *string, ifMatch *string) *lfxv2campaignservicebriefs.UpdateCampaignPayload { + v := &lfxv2campaignservicebriefs.UpdateCampaignPayload{} + v.Campaign = unmarshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUpdateInput(body.Campaign) + v.ProjectID = projectID + v.BriefID = briefID + v.CampaignID = campaignID + v.BearerToken = bearerToken + v.IfMatch = ifMatch + + return v +} + +// NewGetJobPayload builds a lfx-v2-campaign-service-briefs service get-job +// endpoint payload. +func NewGetJobPayload(projectID string, jobID string, bearerToken *string) *lfxv2campaignservicebriefs.GetJobPayload { + v := &lfxv2campaignservicebriefs.GetJobPayload{} + v.ProjectID = projectID + v.JobID = jobID + v.BearerToken = bearerToken + + return v +} + +// ValidateCreateBriefRequestBody runs the validations defined on +// Create-BriefRequestBody +func ValidateCreateBriefRequestBody(body *CreateBriefRequestBody) (err error) { + if body.Brief == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) + } + if body.Brief != nil { + if err2 := ValidateBriefInputRequestBody(body.Brief); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + return +} + +// ValidateUpdateBriefRequestBody runs the validations defined on +// Update-BriefRequestBody +func ValidateUpdateBriefRequestBody(body *UpdateBriefRequestBody) (err error) { + if body.Brief == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) + } + if body.Brief != nil { + if err2 := ValidateBriefInputRequestBody(body.Brief); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + return +} + +// ValidateCreateCampaignsRequestBody runs the validations defined on +// Create-CampaignsRequestBody +func ValidateCreateCampaignsRequestBody(body *CreateCampaignsRequestBody) (err error) { + if body.Input == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) + } + if body.Input != nil { + if err2 := ValidateCampaignCreateInputRequestBody(body.Input); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + return +} + +// ValidateUpdateCampaignRequestBody runs the validations defined on +// Update-CampaignRequestBody +func ValidateUpdateCampaignRequestBody(body *UpdateCampaignRequestBody) (err error) { + if body.Campaign == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) + } + if body.Campaign != nil { + if err2 := ValidateCampaignUpdateInputRequestBody(body.Campaign); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + return +} + +// ValidateBriefInputRequestBody runs the validations defined on +// brief-inputRequestBody +func ValidateBriefInputRequestBody(body *BriefInputRequestBody) (err error) { + if body.ProgramType == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("program_type", "body")) + } + if body.EventSlug == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("event_slug", "body")) + } + if body.ProgramType != nil { + if !(*body.ProgramType == "events" || *body.ProgramType == "education" || *body.ProgramType == "membership") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.program_type", *body.ProgramType, []any{"events", "education", "membership"})) + } + } + return +} + +// ValidateCampaignCreateInputRequestBody runs the validations defined on +// campaign-create-inputRequestBody +func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody) (err error) { + if body.Platforms == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) + } + return +} + +// ValidateCampaignUpdateInputRequestBody runs the validations defined on +// campaign-update-inputRequestBody +func ValidateCampaignUpdateInputRequestBody(body *CampaignUpdateInputRequestBody) (err error) { + if body.CampaignName == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("campaign_name", "body")) + } + if body.Status == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) + } + return +} diff --git a/gen/http/lfx_v2_campaign_service_connections/client/cli.go b/gen/http/lfx_v2_campaign_service_connections/client/cli.go index 16abaefc..7c1ce05c 100644 --- a/gen/http/lfx_v2_campaign_service_connections/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_connections/client/cli.go @@ -24,7 +24,7 @@ func BuildCreateGoogleAdsPayload(lfxV2CampaignServiceConnectionsCreateGoogleAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Recusandae nam autem dicta perspiciatis quod.\",\n \"client_secret\": \"Quo voluptatem quas culpa omnis consequuntur iste.\",\n \"developer_token\": \"Id magnam id nihil fugiat.\",\n \"refresh_token\": \"Inventore quisquam laudantium velit.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -174,7 +174,7 @@ func BuildSetCredentialGoogleAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Recusandae nam autem dicta perspiciatis quod.\",\n \"client_secret\": \"Quo voluptatem quas culpa omnis consequuntur iste.\",\n \"developer_token\": \"Id magnam id nihil fugiat.\",\n \"refresh_token\": \"Inventore quisquam laudantium velit.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -212,7 +212,7 @@ func BuildCreateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsCreateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Fugit voluptatem.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Amet necessitatibus corrupti quaerat molestiae maiores.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -276,7 +276,7 @@ func BuildUpdateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsUpdateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Fugit voluptatem.\",\n \"org_id\": \"208777\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -363,7 +363,7 @@ func BuildSetCredentialLinkedinAdsPayload(lfxV2CampaignServiceConnectionsSetCred { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Amet necessitatibus corrupti quaerat molestiae maiores.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -400,7 +400,7 @@ func BuildCreateMetaAdsPayload(lfxV2CampaignServiceConnectionsCreateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Eligendi vero temporibus.\",\n \"label\": \"Non maiores quae sed quia.\",\n \"page_id\": \"Facilis eum ipsam.\"\n },\n \"credentials\": {\n \"access_token\": \"Soluta quas voluptas minus possimus quos praesentium.\",\n \"app_secret\": \"Repudiandae consequatur fuga dolores.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -463,7 +463,7 @@ func BuildUpdateMetaAdsPayload(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Eligendi vero temporibus.\",\n \"label\": \"Non maiores quae sed quia.\",\n \"page_id\": \"Facilis eum ipsam.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -548,7 +548,7 @@ func BuildSetCredentialMetaAdsPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Soluta quas voluptas minus possimus quos praesentium.\",\n \"app_secret\": \"Repudiandae consequatur fuga dolores.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -586,7 +586,7 @@ func BuildCreateRedditAdsPayload(lfxV2CampaignServiceConnectionsCreateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Ut est nobis aspernatur.\"\n },\n \"credentials\": {\n \"client_id\": \"Fugit qui tempora commodi reiciendis sit alias.\",\n \"client_secret\": \"Ea enim quidem odio et sequi consequatur.\",\n \"refresh_token\": \"Provident itaque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n },\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -650,7 +650,7 @@ func BuildUpdateRedditAdsPayload(lfxV2CampaignServiceConnectionsUpdateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Ut est nobis aspernatur.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -736,7 +736,7 @@ func BuildSetCredentialRedditAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Fugit qui tempora commodi reiciendis sit alias.\",\n \"client_secret\": \"Ea enim quidem odio et sequi consequatur.\",\n \"refresh_token\": \"Provident itaque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -774,7 +774,7 @@ func BuildCreateTwitterAdsPayload(lfxV2CampaignServiceConnectionsCreateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Eveniet dicta numquam doloremque.\",\n \"label\": \"Ea velit et assumenda recusandae enim.\"\n },\n \"credentials\": {\n \"access_token\": \"Ipsum quia ad a.\",\n \"access_token_secret\": \"Veritatis omnis excepturi.\",\n \"consumer_key\": \"Cumque libero.\",\n \"consumer_secret\": \"Id incidunt qui et ratione sit quaerat.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n },\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -838,7 +838,7 @@ func BuildUpdateTwitterAdsPayload(lfxV2CampaignServiceConnectionsUpdateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Eveniet dicta numquam doloremque.\",\n \"label\": \"Ea velit et assumenda recusandae enim.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -924,7 +924,7 @@ func BuildSetCredentialTwitterAdsPayload(lfxV2CampaignServiceConnectionsSetCrede { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Ipsum quia ad a.\",\n \"access_token_secret\": \"Veritatis omnis excepturi.\",\n \"consumer_key\": \"Cumque libero.\",\n \"consumer_secret\": \"Id incidunt qui et ratione sit quaerat.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -962,7 +962,7 @@ func BuildCreateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsCreateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Sint qui praesentium ea praesentium magni.\",\n \"customer_id\": \"Iure dolore et et aut nam.\",\n \"label\": \"Consequuntur neque mollitia quia.\"\n },\n \"credentials\": {\n \"client_id\": \"Voluptates odit consequatur quis.\",\n \"client_secret\": \"Est voluptatum enim earum et doloribus.\",\n \"developer_token\": \"Id ducimus eius et laboriosam omnis vitae.\",\n \"refresh_token\": \"Ea consequatur et ut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n },\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1027,7 +1027,7 @@ func BuildUpdateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsUpdateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Sint qui praesentium ea praesentium magni.\",\n \"customer_id\": \"Iure dolore et et aut nam.\",\n \"label\": \"Consequuntur neque mollitia quia.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1114,7 +1114,7 @@ func BuildSetCredentialMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsSetCre { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Voluptates odit consequatur quis.\",\n \"client_secret\": \"Est voluptatum enim earum et doloribus.\",\n \"developer_token\": \"Id ducimus eius et laboriosam omnis vitae.\",\n \"refresh_token\": \"Ea consequatur et ut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -1151,7 +1151,7 @@ func BuildCreateHubspotPayload(lfxV2CampaignServiceConnectionsCreateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Temporibus voluptas inventore sit omnis.\",\n \"brand_kit\": \"Quis facere sint totam sapiente.\",\n \"label\": \"Sint nihil.\",\n \"portal_id\": \"Expedita veniam beatae autem.\",\n \"sender_email\": \"Placeat enim.\",\n \"sender_name\": \"Nesciunt asperiores et est.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Numquam ut nesciunt voluptas.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1214,7 +1214,7 @@ func BuildUpdateHubspotPayload(lfxV2CampaignServiceConnectionsUpdateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Temporibus voluptas inventore sit omnis.\",\n \"brand_kit\": \"Quis facere sint totam sapiente.\",\n \"label\": \"Sint nihil.\",\n \"portal_id\": \"Expedita veniam beatae autem.\",\n \"sender_email\": \"Placeat enim.\",\n \"sender_name\": \"Nesciunt asperiores et est.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1299,7 +1299,7 @@ func BuildSetCredentialHubspotPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Numquam ut nesciunt voluptas.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index a91e4ac4..420ae6c5 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"A connection already exists for this provider on the project","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Labore aut eum porro."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Necessitatibus consequatur natus tempora ut.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut voluptatem inventore ab."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quis et maxime ipsam voluptatem repudiandae laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis ipsam."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Iusto quis magni et velit."},"project_id":{"type":"string","description":"Owning project","example":"Ut ipsum id."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8470973010316083422,"format":"int64"}},"example":{"account_id":"Aut id molestiae sit.","has_credentials":true,"id":"Magni voluptas odio assumenda totam.","label":"Nam cumque.","login_customer_id":"Qui esse.","project_id":"Est praesentium dolor officiis deleniti.","status":"active","version":7862773009082385007},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ducimus sequi."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Autem ab voluptas culpa."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Quia tenetur ducimus."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut et."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Alias non sequi consequatur dolorum.","client_secret":"Voluptatem voluptas omnis est tempora ipsum aut.","developer_token":"Harum et minus voluptas.","refresh_token":"Facere harum enim consequatur id voluptatem."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed maiores qui sed exercitationem quam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Asperiores facere et exercitationem soluta possimus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"In expedita."},"label":{"type":"string","description":"Optional friendly name","example":"Suscipit sed minus soluta quasi."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quia ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Magnam cumque quasi magni ducimus."},"sender_email":{"type":"string","description":"Default sender address","example":"Et veritatis voluptas nobis."},"sender_name":{"type":"string","description":"Default sender name","example":"Doloremque architecto ea et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4054743500330389510,"format":"int64"}},"example":{"account_id":"Est iste.","brand_kit":"Quae aut culpa impedit sit.","has_credentials":true,"id":"Aliquid et in.","label":"Distinctio aut.","portal_id":"Earum modi esse.","project_id":"Consequuntur omnis a dignissimos voluptate.","sender_email":"Possimus placeat enim ab.","sender_name":"Esse et qui et voluptatibus tempore.","status":"active","version":3449749392517333935},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Velit labore non."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem sapiente."},"label":{"type":"string","description":"Optional friendly name","example":"Nulla adipisci aperiam dolorem molestias."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Odit est esse."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea cum et magni adipisci magnam."},"sender_name":{"type":"string","description":"Default sender name","example":"Atque labore qui odio et corporis."}},"example":{"account_id":"Sint autem.","brand_kit":"Debitis soluta sed quod dicta aperiam eveniet.","label":"Aut natus.","portal_id":"Deleniti itaque voluptas magnam.","sender_email":"Voluptatem modi velit vitae optio ut.","sender_name":"Consequuntur sit libero autem ut."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Dolor id."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Accusantium sequi modi corrupti esse mollitia."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."},"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"},"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."},"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."},"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."},"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."},"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vel blanditiis sunt ut facere."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa nihil ad hic repellendus nobis voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum cupiditate."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Vel molestiae consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Vero et voluptas accusamus sunt."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4079703323268843140,"format":"int64"}},"example":{"account_id":"Et corporis officia sint.","has_credentials":false,"id":"Quidem est non tenetur dolore.","label":"Cupiditate voluptatem.","org_id":"Quia nulla autem ratione.","project_id":"Dolores commodi aperiam voluptatibus.","status":"error","version":874315130556833044},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"In mollitia a magni."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Consequatur ea deserunt tempora aut assumenda.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Occaecati eum tenetur."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Inventore aliquid voluptatibus iste mollitia."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Asperiores ipsum quam."},"app_id":{"type":"string","description":"Meta app ID","example":"Cum rem architecto vel quibusdam vel autem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero atque est non praesentium."},"label":{"type":"string","description":"Optional friendly name","example":"Id tenetur exercitationem aperiam incidunt."},"page_id":{"type":"string","description":"Facebook page ID","example":"Qui suscipit rerum quo eligendi tempora."},"project_id":{"type":"string","description":"Owning project","example":"Saepe sit et sed qui dolorem reiciendis."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5968285761891001183,"format":"int64"}},"example":{"account_id":"Quibusdam aliquam consequuntur.","app_id":"Deleniti earum magni quibusdam.","has_credentials":false,"id":"Id facere maxime.","label":"Maxime ut possimus expedita.","page_id":"Facilis facilis aut suscipit aut odio iste.","project_id":"Hic delectus.","status":"active","version":6674224742141168677},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Harum provident quia distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur velit quaerat aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut et."}},"example":{"account_id":"act_193556282970417","app_id":"Blanditiis atque rerum et officiis sapiente et.","label":"Rem harum provident provident quia laboriosam magnam.","page_id":"Hic et sed."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Itaque dolores in hic rem."},"app_secret":{"type":"string","description":"Meta app secret","example":"Eligendi ea vel consequatur nihil."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Vero commodi est qui asperiores velit enim.","app_secret":"Expedita ut minus ut est recusandae aspernatur."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum voluptatem et quam beatae laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Rem suscipit similique ipsam aut quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repudiandae voluptatem vitae iste maxime modi laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Magnam fugit."},"project_id":{"type":"string","description":"Owning project","example":"Dignissimos necessitatibus consequuntur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7512765750150729777,"format":"int64"}},"example":{"account_id":"Nobis nam.","customer_id":"Reiciendis pariatur quisquam.","has_credentials":true,"id":"Laudantium dolore.","label":"Non quidem doloribus debitis itaque itaque dolores.","project_id":"Possimus nihil qui enim ratione voluptatem eos.","status":"error","version":7616558197057713508},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Aspernatur facere."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem dicta rerum sed."},"label":{"type":"string","description":"Optional friendly name","example":"Aspernatur ea voluptatem eum voluptas eveniet assumenda."}},"example":{"account_id":"Quia vero quis consequuntur id.","customer_id":"Quo illum cum quod.","label":"Quia possimus dolore vel qui."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ut fugiat magnam quia."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ut tempora consequuntur cumque repudiandae omnis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Est aut labore sint natus."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Distinctio beatae."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ducimus debitis nesciunt quas quibusdam occaecati cum.","client_secret":"Iste voluptatem et voluptatem ut ut.","developer_token":"Quia sed omnis quaerat aut.","refresh_token":"Nostrum laborum minima."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsam temporibus sint et necessitatibus dolorem ut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Fugit voluptas molestias architecto dicta quidem illo."},"label":{"type":"string","description":"Optional friendly name","example":"Quia aut sed fugiat adipisci eos rerum."},"project_id":{"type":"string","description":"Owning project","example":"Doloremque et qui perferendis."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1442766184420227830,"format":"int64"}},"example":{"account_id":"Voluptates neque expedita.","has_credentials":false,"id":"Qui sed fugiat.","label":"Sit iusto.","project_id":"Veniam debitis aut similique ullam temporibus qui.","status":"active","version":3889986261433875806},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Quisquam ut eius."}},"example":{"account_id":"t2_gv9wtbfa","label":"Ipsum nihil cumque repellendus sint soluta."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sed quibusdam reiciendis qui vel."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Amet et eaque."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Consequatur iste sed illo adipisci sunt."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Soluta consectetur porro quo quia incidunt.","client_secret":"Aperiam et ipsam vitae.","refresh_token":"Velit est quis aliquid aliquam."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vitae quae debitis sunt aperiam ex voluptatibus."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"In fuga ut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate nisi natus sint."},"label":{"type":"string","description":"Optional friendly name","example":"Ut dolor velit."},"project_id":{"type":"string","description":"Owning project","example":"Beatae aliquam quia officiis hic ea."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6056629402053782931,"format":"int64"}},"example":{"account_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","funding_instrument_id":"Fuga illo dolorem sit ex commodi sapiente.","has_credentials":false,"id":"Iusto quidem laudantium.","label":"Quaerat ut neque expedita nostrum.","project_id":"Ratione consequuntur aut et corrupti.","status":"error","version":5145245548849296683},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Excepturi dolorem autem ipsa autem provident."},"label":{"type":"string","description":"Optional friendly name","example":"Illum tenetur numquam."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Quis et odio tenetur optio.","label":"Iure quo culpa."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Nostrum dolorum iure eaque animi."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Ut sint."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Iste eveniet laudantium rerum."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Error necessitatibus et autem doloribus est.","access_token_secret":"Maxime labore illo maxime provident.","consumer_key":"Error laudantium.","consumer_secret":"Similique odio adipisci dolore iste."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Ut voluptas et accusamus natus."},"id":{"type":"string","description":"Brief UUID","example":"Quasi voluptatum officia quod."},"platforms":{"type":"array","items":{"type":"string","example":"Architecto vero quisquam vero labore laudantium maiores."},"description":"Suggested default platforms","example":["Dignissimos consequatur.","Qui minima."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi aperiam."},"project_id":{"type":"string","description":"Owning project","example":"Amet quia inventore est quia enim illo."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam et officia sequi et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1640913123388047084,"format":"int64"}},"example":{"event_slug":"Autem recusandae totam.","id":"Tempora voluptatem sed quia excepturi dolores.","platforms":["Necessitatibus veritatis amet ut rerum quidem ut.","Velit quo.","Modi reiciendis aliquam.","Quidem explicabo expedita sunt."],"program_type":"Officia quidem non qui voluptates natus cum.","project_id":"Delectus voluptatem voluptas ullam dolores rem.","status":"archived","url":"Rerum nisi.","version":7840037444703092578},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et adipisci cumque molestiae eos."},"event_details":{"description":"Extracted event/course details","example":"Quisquam sed."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quia est aspernatur possimus exercitationem."},"keywords":{"description":"Keyword list","example":"Aut iusto quos impedit eos."},"platforms":{"type":"array","items":{"type":"string","example":"Cumque totam nulla aut reprehenderit."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Rerum error incidunt voluptas.","Quaerat est nobis saepe fugit.","Fuga rem.","Corrupti et."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Adipisci rerum consequatur placeat ea odio."},"url":{"type":"string","description":"Event/course page URL","example":"Quo quidem."}},"example":{"copy":"Aliquam vero ducimus.","event_details":"Voluptas aspernatur aperiam.","event_slug":"Nesciunt ipsum et.","keywords":"Recusandae aut perferendis.","platforms":["Maxime maxime porro enim.","Nobis itaque est enim magnam pariatur.","Est totam qui praesentium ipsam officiis cum.","Recusandae est adipisci ullam pariatur."],"program_type":"membership","targeting":"Est eaque ipsam harum nisi nobis.","url":"Dolorum eveniet qui alias ea."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Alias ad voluptatem accusantium tempore impedit."},"campaign_name":{"type":"string","description":"Campaign name","example":"Excepturi saepe sit vel perspiciatis neque."},"id":{"type":"string","description":"Campaign UUID","example":"Numquam quidem qui."},"platform":{"type":"string","description":"Channel","example":"Et expedita itaque quos."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quos accusantium fugit."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam possimus dolor facere velit dolores."},"status":{"type":"string","description":"Campaign status","example":"Qui molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":33967422648266414,"format":"int64"}},"example":{"brief_id":"Modi nobis aliquid rerum consequatur officiis velit.","campaign_name":"Quos cum porro architecto.","id":"Minus dolor accusantium dolores cum molestias.","platform":"Dolores assumenda accusantium mollitia fugiat dolore similique.","platform_campaign_id":"Omnis voluptates quaerat.","project_id":"Voluptatibus quis adipisci aut rerum ut blanditiis.","status":"Aperiam doloribus aut.","version":6898451533262184218},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Consequatur non cumque laudantium quod modi voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Platforms to create campaigns on (binding selection)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]}},"example":{"config":"Est voluptas sequi.","platforms":["Dicta et ad non quia.","Voluptatibus tempora possimus consequatur est.","Nihil et laudantium."]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Placeat cumque iure veritatis cumque nisi."},"config":{"description":"Campaign configuration snapshot","example":"Natus placeat esse est in deserunt aliquid."},"status":{"type":"string","description":"Campaign status","example":"Distinctio ipsum ab."}},"example":{"campaign_name":"Explicabo doloremque.","config":"Id ipsa perspiciatis sunt ut velit.","status":"Sed et odio sunt totam incidunt."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur qui molestiae velit ratione nesciunt et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Neque ut rerum facilis quia molestiae ratione."},"label":{"type":"string","description":"Optional friendly name","example":"Ut mollitia accusantium dignissimos."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Illum ratione voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Fugit provident officia officiis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4206253090509603863,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Et eveniet."},"platforms":{"type":"array","items":{"type":"string","example":"Ut non odio eius sed."},"description":"Platforms this job will create on","example":["Perspiciatis nihil.","Mollitia tempora minima voluptas.","Facere aut facilis porro dolor ipsa."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Aut hic.","platforms":["Et exercitationem aut.","Deleniti odit rerum quidem accusamus.","Provident provident.","Odit iusto ad animi eos doloribus autem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Dolore suscipit reprehenderit."},"job_id":{"type":"string","description":"Job UUID","example":"Aut mollitia aut molestiae exercitationem et."},"result":{"description":"Per-platform results, populated as each completes","example":"Perspiciatis quisquam perferendis autem ut alias quis."},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Quod et aut consequatur inventore enim reiciendis.","job_id":"Aut animi laudantium ullam.","result":"Et id laboriosam nihil.","status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index b20cb445..42261a8f 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -13,6 +13,651 @@ produces: - application/xml - application/gob paths: + /projects/{project_id}/briefs: + post: + tags: + - lfx-v2-campaign-service-briefs + summary: create-brief lfx-v2-campaign-service-briefs + description: Create a brief. + operationId: lfx-v2-campaign-service-briefs#create-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: Create-BriefRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody' + required: + - brief + responses: + "201": + description: Created response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-brief lfx-v2-campaign-service-briefs + description: Get a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-briefs + summary: update-brief lfx-v2-campaign-service-briefs + description: Replace a brief (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + required: false + type: string + - name: Update-BriefRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody' + required: + - brief + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "412": + description: Precondition Failed response. + schema: + $ref: '#/definitions/PreconditionFailedError' + required: + - code + - message + "428": + description: Precondition Required response. + schema: + $ref: '#/definitions/PreconditionRequiredError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + delete: + tags: + - lfx-v2-campaign-service-briefs + summary: delete-brief lfx-v2-campaign-service-briefs + description: Archive a brief (soft delete). + operationId: lfx-v2-campaign-service-briefs#delete-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "204": + description: No Content response. + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}/approve: + post: + tags: + - lfx-v2-campaign-service-briefs + summary: approve-brief lfx-v2-campaign-service-briefs + description: Approve a brief for campaign creation. + operationId: lfx-v2-campaign-service-briefs#approve-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}/campaigns: + post: + tags: + - lfx-v2-campaign-service-briefs + summary: create-campaigns lfx-v2-campaign-service-briefs + description: Create campaigns across the selected platforms (async -> job). + operationId: lfx-v2-campaign-service-briefs#create-campaigns + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: Create-CampaignsRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody' + required: + - input + responses: + "202": + description: Accepted response. + schema: + $ref: '#/definitions/JobCreateResponse' + required: + - job_id + - status + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-campaign lfx-v2-campaign-service-briefs + description: Get one campaign under a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-campaign + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: campaign_id + in: path + description: Campaign UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Campaign' + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-briefs + summary: update-campaign lfx-v2-campaign-service-briefs + description: Replace a campaign (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-campaign + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: campaign_id + in: path + description: Campaign UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + required: false + type: string + - name: Update-CampaignRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody' + required: + - campaign + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Campaign' + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "412": + description: Precondition Failed response. + schema: + $ref: '#/definitions/PreconditionFailedError' + required: + - code + - message + "428": + description: Precondition Required response. + schema: + $ref: '#/definitions/PreconditionRequiredError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] /projects/{project_id}/connection-google-ads: get: tags: @@ -2659,6 +3304,69 @@ paths: - http security: - jwt_header_Authorization: [] + /projects/{project_id}/jobs/{job_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-job lfx-v2-campaign-service-briefs + description: Poll campaign-creation job status. + operationId: lfx-v2-campaign-service-briefs#get-job + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: job_id + in: path + description: Job UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/JobPollResponse' + required: + - job_id + - status + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] definitions: BadRequestError: title: BadRequestError @@ -2679,6 +3387,233 @@ definitions: required: - code - message + Brief: + title: Brief + type: object + properties: + event_slug: + type: string + description: Event/course slug + example: Ut voluptas et accusamus natus. + id: + type: string + description: Brief UUID + example: Quasi voluptatum officia quod. + platforms: + type: array + items: + type: string + example: Architecto vero quisquam vero labore laudantium maiores. + description: Suggested default platforms + example: + - Dignissimos consequatur. + - Qui minima. + program_type: + type: string + description: Funnel context + example: Eligendi aperiam. + project_id: + type: string + description: Owning project + example: Amet quia inventore est quia enim illo. + status: + type: string + description: Lifecycle status + example: draft + enum: + - draft + - approved + - archived + url: + type: string + description: Event/course page URL + example: Aliquam et officia sequi et. + version: + type: integer + description: Optimistic-concurrency version + example: 1640913123388047084 + format: int64 + example: + event_slug: Autem recusandae totam. + id: Tempora voluptatem sed quia excepturi dolores. + platforms: + - Necessitatibus veritatis amet ut rerum quidem ut. + - Velit quo. + - Modi reiciendis aliquam. + - Quidem explicabo expedita sunt. + program_type: Officia quidem non qui voluptates natus cum. + project_id: Delectus voluptatem voluptas ullam dolores rem. + status: archived + url: Rerum nisi. + version: 7840037444703092578 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + BriefInput: + title: BriefInput + type: object + properties: + copy: + description: Ad copy + example: Et adipisci cumque molestiae eos. + event_details: + description: Extracted event/course details + example: Quisquam sed. + event_slug: + type: string + description: Event/course slug (unique within the project) + example: Quia est aspernatur possimus exercitationem. + keywords: + description: Keyword list + example: Aut iusto quos impedit eos. + platforms: + type: array + items: + type: string + example: Cumque totam nulla aut reprehenderit. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) + example: + - Rerum error incidunt voluptas. + - Quaerat est nobis saepe fugit. + - Fuga rem. + - Corrupti et. + program_type: + type: string + description: Funnel context + example: education + enum: + - events + - education + - membership + targeting: + description: Targeting recommendation + example: Adipisci rerum consequatur placeat ea odio. + url: + type: string + description: Event/course page URL + example: Quo quidem. + example: + copy: Aliquam vero ducimus. + event_details: Voluptas aspernatur aperiam. + event_slug: Nesciunt ipsum et. + keywords: Recusandae aut perferendis. + platforms: + - Maxime maxime porro enim. + - Nobis itaque est enim magnam pariatur. + - Est totam qui praesentium ipsam officiis cum. + - Recusandae est adipisci ullam pariatur. + program_type: membership + targeting: Est eaque ipsam harum nisi nobis. + url: Dolorum eveniet qui alias ea. + required: + - program_type + - event_slug + Campaign: + title: Campaign + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Alias ad voluptatem accusantium tempore impedit. + campaign_name: + type: string + description: Campaign name + example: Excepturi saepe sit vel perspiciatis neque. + id: + type: string + description: Campaign UUID + example: Numquam quidem qui. + platform: + type: string + description: Channel + example: Et expedita itaque quos. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Quos accusantium fugit. + project_id: + type: string + description: Owning project + example: Laboriosam possimus dolor facere velit dolores. + status: + type: string + description: Campaign status + example: Qui molestias. + version: + type: integer + description: Optimistic-concurrency version + example: 33967422648266414 + format: int64 + example: + brief_id: Modi nobis aliquid rerum consequatur officiis velit. + campaign_name: Quos cum porro architecto. + id: Minus dolor accusantium dolores cum molestias. + platform: Dolores assumenda accusantium mollitia fugiat dolore similique. + platform_campaign_id: Omnis voluptates quaerat. + project_id: Voluptatibus quis adipisci aut rerum ut blanditiis. + status: Aperiam doloribus aut. + version: 6898451533262184218 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + CampaignCreateInput: + title: CampaignCreateInput + type: object + properties: + config: + description: Per-platform campaign configuration + example: Consequatur non cumque laudantium quod modi voluptas. + platforms: + type: array + items: + type: string + example: Sed voluptatum laborum. + description: Platforms to create campaigns on (binding selection) + example: + - Quas sunt eos nulla et perferendis qui. + - Aut reiciendis ullam laborum. + - Et quidem nisi quasi. + - Ab deserunt quia magnam temporibus minus et. + example: + config: Est voluptas sequi. + platforms: + - Dicta et ad non quia. + - Voluptatibus tempora possimus consequatur est. + - Nihil et laudantium. + required: + - platforms + CampaignUpdateInput: + title: CampaignUpdateInput + type: object + properties: + campaign_name: + type: string + description: Campaign name + example: Placeat cumque iure veritatis cumque nisi. + config: + description: Campaign configuration snapshot + example: Natus placeat esse est in deserunt aliquid. + status: + type: string + description: Campaign status + example: Distinctio ipsum ab. + example: + campaign_name: Explicabo doloremque. + config: Id ipsa perspiciatis sunt ut velit. + status: Sed et odio sunt totam incidunt. + required: + - campaign_name + - status ConflictError: title: ConflictError type: object @@ -2691,7 +3626,7 @@ definitions: type: string description: Error message example: A connection for this provider already exists on the project. - description: A connection already exists for this provider on the project + description: Conflict example: code: "409" message: A connection for this provider already exists on the project. @@ -2724,14 +3659,14 @@ definitions: message: type: string description: Human-readable detail - example: Labore aut eum porro. + example: Accusamus et atque enim. ok: type: boolean description: Whether the credential authenticated against the provider example: true example: - message: Necessitatibus consequatur natus tempora ut. - ok: true + message: Rerum dicta distinctio. + ok: false required: - ok GoogleAdsConnection: @@ -2741,31 +3676,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Aut voluptatem inventore ab. + example: Consequatur qui molestiae velit ratione nesciunt et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quis et maxime ipsam voluptatem repudiandae laudantium. + example: Neque ut rerum facilis quia molestiae ratione. label: type: string description: Optional friendly name - example: Nobis ipsam. + example: Ut mollitia accusantium dignissimos. login_customer_id: type: string description: Manager account used for API access - example: Iusto quis magni et velit. + example: Illum ratione voluptate mollitia. project_id: type: string description: Owning project - example: Ut ipsum id. + example: Fugit provident officia officiis. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -2774,17 +3709,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 8470973010316083422 + example: 4206253090509603863 format: int64 example: - account_id: Aut id molestiae sit. + account_id: Quisquam incidunt qui. has_credentials: true - id: Magni voluptas odio assumenda totam. - label: Nam cumque. - login_customer_id: Qui esse. - project_id: Est praesentium dolor officiis deleniti. - status: active - version: 7862773009082385007 + id: Atque dolores accusantium non dolor. + label: Nobis labore dicta. + login_customer_id: Quia exercitationem consequatur velit. + project_id: Enim qui officia id necessitatibus mollitia soluta. + status: inactive + version: 2620236536617279883 required: - id - project_id @@ -2821,25 +3756,25 @@ definitions: client_id: type: string description: OAuth client id - example: Ducimus sequi. + example: Officiis est. client_secret: type: string description: OAuth client secret - example: Autem ab voluptas culpa. + example: Qui quisquam voluptatibus sint quia. developer_token: type: string description: Google Ads developer token - example: Quia tenetur ducimus. + example: Tempore nemo illum ut maiores. refresh_token: type: string description: OAuth refresh token - example: Aut et. + example: Quia culpa iste id sit incidunt. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Alias non sequi consequatur dolorum. - client_secret: Voluptatem voluptas omnis est tempora ipsum aut. - developer_token: Harum et minus voluptas. - refresh_token: Facere harum enim consequatur id voluptatem. + client_id: Sit repudiandae aut aut ducimus dolores vel. + client_secret: Minus voluptatem sed architecto itaque doloribus. + developer_token: Consequatur quis fugiat expedita recusandae qui. + refresh_token: Accusantium enim temporibus dolor ipsam. required: - refresh_token - client_id @@ -2852,43 +3787,43 @@ definitions: account_id: type: string description: Provider account identifier - example: Sed maiores qui sed exercitationem quam. + example: Repellat assumenda nesciunt distinctio eaque aliquam. brand_kit: type: string description: Per-project brand kit selector - example: Asperiores facere et exercitationem soluta possimus. + example: Et voluptatem deserunt consequuntur omnis sed dolore. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: In expedita. + example: Quo veritatis quis delectus est. label: type: string description: Optional friendly name - example: Suscipit sed minus soluta quasi. + example: Vel voluptate. portal_id: type: string description: HubSpot portal/account ID - example: Quia ducimus. + example: In hic. project_id: type: string description: Owning project - example: Magnam cumque quasi magni ducimus. + example: Et rerum in expedita. sender_email: type: string description: Default sender address - example: Et veritatis voluptas nobis. + example: Facere ipsa et reprehenderit dignissimos voluptas. sender_name: type: string description: Default sender name - example: Doloremque architecto ea et. + example: Consequatur dignissimos itaque quia ut aperiam cum. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -2897,20 +3832,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4054743500330389510 + example: 4147907586526409625 format: int64 example: - account_id: Est iste. - brand_kit: Quae aut culpa impedit sit. + account_id: Assumenda dignissimos beatae vitae aut ea dolor. + brand_kit: Eaque voluptate reprehenderit sed voluptatem sed illo. has_credentials: true - id: Aliquid et in. - label: Distinctio aut. - portal_id: Earum modi esse. - project_id: Consequuntur omnis a dignissimos voluptate. - sender_email: Possimus placeat enim ab. - sender_name: Esse et qui et voluptatibus tempore. - status: active - version: 3449749392517333935 + id: Voluptatibus quod necessitatibus non iste ad rem. + label: Harum corporis deleniti doloribus. + portal_id: Sit architecto ut unde. + project_id: Sunt qui cupiditate ullam ab suscipit et. + sender_email: Sapiente possimus. + sender_name: Voluptates atque. + status: error + version: 6055913800302101668 required: - id - project_id @@ -2925,34 +3860,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Velit labore non. + example: Cum nisi numquam. brand_kit: type: string description: Per-project brand kit selector - example: Dolorem sapiente. + example: Blanditiis mollitia dolores illo nostrum magnam. label: type: string description: Optional friendly name - example: Nulla adipisci aperiam dolorem molestias. + example: Praesentium tenetur quas at ut necessitatibus dolor. portal_id: type: string description: HubSpot portal/account ID - example: Odit est esse. + example: Id unde veritatis officiis aut fugiat. sender_email: type: string description: Default sender address - example: Ea cum et magni adipisci magnam. + example: Ut commodi et voluptas tenetur nobis facere. sender_name: type: string description: Default sender name - example: Atque labore qui odio et corporis. + example: Quo corporis recusandae dicta quibusdam. example: - account_id: Sint autem. - brand_kit: Debitis soluta sed quod dicta aperiam eveniet. - label: Aut natus. - portal_id: Deleniti itaque voluptas magnam. - sender_email: Voluptatem modi velit vitae optio ut. - sender_name: Consequuntur sit libero autem ut. + account_id: Omnis nobis. + brand_kit: Dolorum ut architecto deleniti nostrum. + label: Nostrum tempore. + portal_id: Deserunt repellendus corrupti itaque quo sit. + sender_email: Rerum explicabo. + sender_name: Eum et ipsum expedita reprehenderit eos. required: - account_id HubspotCredentials: @@ -2962,10 +3897,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Dolor id. + example: Aperiam et nihil. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Accusantium sequi modi corrupti esse mollitia. + private_app_token: Perspiciatis porro. required: - private_app_token InternalServerError: @@ -2987,6 +3922,144 @@ definitions: required: - code - message + JobCreateResponse: + title: JobCreateResponse + type: object + properties: + job_id: + type: string + description: Poll GET /projects/{projectId}/jobs/{jobId} + example: Et eveniet. + platforms: + type: array + items: + type: string + example: Ut non odio eius sed. + description: Platforms this job will create on + example: + - Perspiciatis nihil. + - Mollitia tempora minima voluptas. + - Facere aut facilis porro dolor ipsa. + status: + type: string + description: Initial status (always 'queued' on create) + example: queued + enum: + - queued + example: + job_id: Aut hic. + platforms: + - Et exercitationem aut. + - Deleniti odit rerum quidem accusamus. + - Provident provident. + - Odit iusto ad animi eos doloribus autem. + status: queued + required: + - job_id + - status + JobPollResponse: + title: JobPollResponse + type: object + properties: + error: + type: string + description: Terminal error, if any + example: Dolore suscipit reprehenderit. + job_id: + type: string + description: Job UUID + example: Aut mollitia aut molestiae exercitationem et. + result: + description: Per-platform results, populated as each completes + example: Perspiciatis quisquam perferendis autem ut alias quis. + status: + type: string + description: Job status + example: queued + enum: + - queued + - running + - succeeded + - partial + - failed + example: + error: Quod et aut consequatur inventore enim reiciendis. + job_id: Aut animi laudantium ullam. + result: Et id laboriosam nihil. + status: partial + required: + - job_id + - status + LfxV2CampaignServiceBriefsCreateBriefRequestBody: + title: LfxV2CampaignServiceBriefsCreateBriefRequestBody + type: object + properties: + brief: + $ref: '#/definitions/BriefInput' + example: + brief: + copy: Mollitia molestiae saepe qui ex commodi. + event_details: Quia ut atque. + event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. + keywords: Expedita unde molestiae. + platforms: + - Vel nobis non molestias non. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + program_type: membership + targeting: Voluptas dolor et incidunt pariatur quod odit. + url: Nesciunt unde ullam occaecati maxime. + required: + - brief + LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: + title: LfxV2CampaignServiceBriefsCreateCampaignsRequestBody + type: object + properties: + input: + $ref: '#/definitions/CampaignCreateInput' + example: + input: + config: Eligendi earum qui est et id laudantium. + platforms: + - Ea magnam ut nihil quo tenetur. + - Fugiat natus. + - Et tempore. + required: + - input + LfxV2CampaignServiceBriefsUpdateBriefRequestBody: + title: LfxV2CampaignServiceBriefsUpdateBriefRequestBody + type: object + properties: + brief: + $ref: '#/definitions/BriefInput' + example: + brief: + copy: Mollitia molestiae saepe qui ex commodi. + event_details: Quia ut atque. + event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. + keywords: Expedita unde molestiae. + platforms: + - Vel nobis non molestias non. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + program_type: membership + targeting: Voluptas dolor et incidunt pariatur quod odit. + url: Nesciunt unde ullam occaecati maxime. + required: + - brief + LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: + title: LfxV2CampaignServiceBriefsUpdateCampaignRequestBody + type: object + properties: + campaign: + $ref: '#/definitions/CampaignUpdateInput' + example: + campaign: + campaign_name: Hic voluptas debitis error. + config: Ut consectetur. + status: Veniam eum ut libero quibusdam debitis. + required: + - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: title: LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody type: object @@ -3001,10 +4074,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ex ea ullam corrupti. + client_secret: Et omnis accusantium. + developer_token: Iure modi asperiores ut. + refresh_token: Consectetur sint nesciunt. required: - config - credentials @@ -3018,14 +4091,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Sed omnis. + brand_kit: Sed maiores qui sed exercitationem quam. + label: Ut amet nostrum laborum minima ipsum. + portal_id: Aut id in. + sender_email: Et magnam cumque quasi magni ducimus. + sender_name: Suscipit sed minus soluta quasi. credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Non sint praesentium quia. required: - config - credentials @@ -3040,10 +4113,10 @@ definitions: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Ratione sunt nostrum tenetur repellendus dolorem cum. org_id: "208777" credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Fugit enim et sint consectetur ea minus. required: - config - credentials @@ -3058,12 +4131,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Harum et minus voluptas. + label: Alias non sequi consequatur dolorum. + page_id: Voluptatem voluptas omnis est tempora ipsum aut. credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Debitis labore aut. + app_secret: Porro ab id necessitatibus consequatur natus tempora. required: - config - credentials @@ -3077,14 +4150,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Error laudantium. + customer_id: Similique odio adipisci dolore iste. + label: Non nostrum dolorum iure eaque animi. credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + client_id: Error necessitatibus et autem doloribus est. + client_secret: Maxime labore illo maxime provident. + developer_token: Dignissimos necessitatibus consequuntur. + refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. required: - config - credentials @@ -3099,11 +4172,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Aliquam consequuntur quo aliquid ducimus. credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Facilis facilis aut suscipit aut odio iste. + client_secret: Deleniti earum magni quibusdam. + refresh_token: Tenetur velit quaerat aut. required: - config - credentials @@ -3118,13 +4191,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Commodi architecto unde rerum quisquam ut. + label: Quo sit iusto laudantium voluptates neque. credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Amet et eaque. + access_token_secret: Consequatur iste sed illo adipisci sunt. + consumer_key: Neque ipsum nihil cumque repellendus. + consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. required: - config - credentials @@ -3136,10 +4209,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ex ea ullam corrupti. + client_secret: Et omnis accusantium. + developer_token: Iure modi asperiores ut. + refresh_token: Consectetur sint nesciunt. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -3150,7 +4223,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Non sint praesentium quia. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -3161,7 +4234,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Fugit enim et sint consectetur ea minus. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -3172,8 +4245,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Debitis labore aut. + app_secret: Porro ab id necessitatibus consequatur natus tempora. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -3184,10 +4257,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + client_id: Error necessitatibus et autem doloribus est. + client_secret: Maxime labore illo maxime provident. + developer_token: Dignissimos necessitatibus consequuntur. + refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -3198,9 +4271,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Facilis facilis aut suscipit aut odio iste. + client_secret: Deleniti earum magni quibusdam. + refresh_token: Tenetur velit quaerat aut. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -3211,10 +4284,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Amet et eaque. + access_token_secret: Consequatur iste sed illo adipisci sunt. + consumer_key: Neque ipsum nihil cumque repellendus. + consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -3238,12 +4311,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Sed omnis. + brand_kit: Sed maiores qui sed exercitationem quam. + label: Ut amet nostrum laborum minima ipsum. + portal_id: Aut id in. + sender_email: Et magnam cumque quasi magni ducimus. + sender_name: Suscipit sed minus soluta quasi. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -3255,7 +4328,7 @@ definitions: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Ratione sunt nostrum tenetur repellendus dolorem cum. org_id: "208777" required: - config @@ -3268,9 +4341,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Harum et minus voluptas. + label: Alias non sequi consequatur dolorum. + page_id: Voluptatem voluptas omnis est tempora ipsum aut. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -3281,9 +4354,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Error laudantium. + customer_id: Similique odio adipisci dolore iste. + label: Non nostrum dolorum iure eaque animi. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -3295,7 +4368,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Aliquam consequuntur quo aliquid ducimus. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -3307,8 +4380,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Commodi architecto unde rerum quisquam ut. + label: Quo sit iusto laudantium voluptates neque. required: - config LinkedinAdsConnection: @@ -3318,31 +4391,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Vel blanditiis sunt ut facere. + example: Velit in recusandae maiores et voluptatem voluptatem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Ipsa nihil ad hic repellendus nobis voluptatem. + example: Ut ut nisi fuga nostrum velit hic. label: type: string description: Optional friendly name - example: Rerum cupiditate. + example: Atque dolor odio labore pariatur. org_id: type: string description: LinkedIn organization URN id - example: Vel molestiae consequatur. + example: Qui consequatur et dignissimos ex. project_id: type: string description: Owning project - example: Vero et voluptas accusamus sunt. + example: Omnis reprehenderit distinctio quos ut unde. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -3351,17 +4424,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4079703323268843140 + example: 342612035894089324 format: int64 example: - account_id: Et corporis officia sint. - has_credentials: false - id: Quidem est non tenetur dolore. - label: Cupiditate voluptatem. - org_id: Quia nulla autem ratione. - project_id: Dolores commodi aperiam voluptatibus. - status: error - version: 874315130556833044 + account_id: Vel natus provident. + has_credentials: true + id: Praesentium voluptas beatae. + label: Eos et architecto voluptas. + org_id: Ut non error aut et fuga. + project_id: Officia et sint numquam accusamus. + status: inactive + version: 4235609230431250467 required: - id - project_id @@ -3380,14 +4453,14 @@ definitions: label: type: string description: Optional friendly name - example: In mollitia a magni. + example: Nihil nihil quae porro qui rem autem. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Consequatur ea deserunt tempora aut assumenda. + label: Et nulla officia vitae. org_id: "208777" required: - account_id @@ -3399,10 +4472,10 @@ definitions: access_token: type: string description: OAuth access token - example: Occaecati eum tenetur. + example: Eveniet quibusdam. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Inventore aliquid voluptatibus iste mollitia. + access_token: Ut asperiores quo aut. required: - access_token MetaAdsConnection: @@ -3412,31 +4485,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Asperiores ipsum quam. + example: Laudantium amet veritatis rerum itaque consequatur laboriosam. app_id: type: string description: Meta app ID - example: Cum rem architecto vel quibusdam vel autem. + example: Quis illo minima. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Libero atque est non praesentium. + example: Et sunt quis dicta voluptate aut in. label: type: string description: Optional friendly name - example: Id tenetur exercitationem aperiam incidunt. + example: Excepturi deleniti voluptas aperiam vel. page_id: type: string description: Facebook page ID - example: Qui suscipit rerum quo eligendi tempora. + example: Provident maiores. project_id: type: string description: Owning project - example: Saepe sit et sed qui dolorem reiciendis. + example: Provident nobis soluta culpa vitae. status: type: string description: Connection status @@ -3449,18 +4522,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 5968285761891001183 + example: 206759142589582139 format: int64 example: - account_id: Quibusdam aliquam consequuntur. - app_id: Deleniti earum magni quibusdam. + account_id: At odio incidunt distinctio sint qui. + app_id: Enim cumque saepe sint quidem odio. has_credentials: false - id: Id facere maxime. - label: Maxime ut possimus expedita. - page_id: Facilis facilis aut suscipit aut odio iste. - project_id: Hic delectus. - status: active - version: 6674224742141168677 + id: Earum eligendi. + label: Provident dicta temporibus debitis. + page_id: Non quae omnis. + project_id: Ipsum sunt assumenda ipsa dolor officia eligendi. + status: inactive + version: 1065443246813246267 required: - id - project_id @@ -3479,20 +4552,20 @@ definitions: app_id: type: string description: Meta app ID - example: Harum provident quia distinctio ea. + example: Voluptatibus deserunt. label: type: string description: Optional friendly name - example: Tenetur velit quaerat aut. + example: Accusantium aut. page_id: type: string description: Facebook page ID - example: Aut et. + example: Deleniti error pariatur consequatur esse. example: account_id: act_193556282970417 - app_id: Blanditiis atque rerum et officiis sapiente et. - label: Rem harum provident provident quia laboriosam magnam. - page_id: Hic et sed. + app_id: Et eum est molestiae necessitatibus magni. + label: Necessitatibus eos. + page_id: Et eligendi et numquam dolorum consequatur in. required: - account_id MetaAdsCredentials: @@ -3502,15 +4575,15 @@ definitions: access_token: type: string description: Meta access token - example: Itaque dolores in hic rem. + example: Molestiae praesentium perferendis deserunt ipsum dolorum. app_secret: type: string description: Meta app secret - example: Eligendi ea vel consequatur nihil. + example: Error nulla fuga fugit repellendus et accusamus. description: Meta Ads credential. Write-only; never returned. example: - access_token: Vero commodi est qui asperiores velit enim. - app_secret: Expedita ut minus ut est recusandae aspernatur. + access_token: Non sequi error assumenda quam deleniti et. + app_secret: Nam quia aperiam sunt est. required: - access_token - app_secret @@ -3521,27 +4594,27 @@ definitions: account_id: type: string description: Provider account identifier - example: Ipsum voluptatem et quam beatae laborum omnis. + example: A necessitatibus molestiae. customer_id: type: string description: Microsoft Advertising customer ID - example: Rem suscipit similique ipsam aut quis. + example: Dolorem qui explicabo consequuntur repellat non suscipit. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Repudiandae voluptatem vitae iste maxime modi laborum. + example: Quos hic doloribus. label: type: string description: Optional friendly name - example: Magnam fugit. + example: Eum et sint corrupti eos. project_id: type: string description: Owning project - example: Dignissimos necessitatibus consequuntur. + example: Neque autem ex eos. status: type: string description: Connection status @@ -3554,17 +4627,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 7512765750150729777 + example: 7747776820204091337 format: int64 example: - account_id: Nobis nam. - customer_id: Reiciendis pariatur quisquam. - has_credentials: true - id: Laudantium dolore. - label: Non quidem doloribus debitis itaque itaque dolores. - project_id: Possimus nihil qui enim ratione voluptatem eos. - status: error - version: 7616558197057713508 + account_id: Sit est dolores est et. + customer_id: Velit atque laudantium ullam rerum. + has_credentials: false + id: Sit tempore. + label: Ut quo iure. + project_id: Magnam ut similique ea minima magnam. + status: deleted + version: 7309957715046801903 required: - id - project_id @@ -3579,19 +4652,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Aspernatur facere. + example: Enim accusantium labore esse numquam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptatem dicta rerum sed. + example: Non laudantium sunt minima repudiandae illo harum. label: type: string description: Optional friendly name - example: Aspernatur ea voluptatem eum voluptas eveniet assumenda. + example: Rerum adipisci. example: - account_id: Quia vero quis consequuntur id. - customer_id: Quo illum cum quod. - label: Quia possimus dolore vel qui. + account_id: Sit dolor sunt eos nihil ipsam. + customer_id: Odio totam cum deleniti placeat fuga. + label: Dolorum deserunt. required: - account_id MicrosoftAdsCredentials: @@ -3601,25 +4674,25 @@ definitions: client_id: type: string description: OAuth client id - example: Ut fugiat magnam quia. + example: Saepe voluptatem reiciendis pariatur. client_secret: type: string description: OAuth client secret - example: Ut tempora consequuntur cumque repudiandae omnis ut. + example: Et ut quis ut. developer_token: type: string description: Microsoft Advertising developer token - example: Est aut labore sint natus. + example: Quia cum non. refresh_token: type: string description: OAuth refresh token - example: Distinctio beatae. + example: Iusto omnis. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Ducimus debitis nesciunt quas quibusdam occaecati cum. - client_secret: Iste voluptatem et voluptatem ut ut. - developer_token: Quia sed omnis quaerat aut. - refresh_token: Nostrum laborum minima. + client_id: Aut autem sint minus voluptatum. + client_secret: Tempore quae. + developer_token: Dolores tenetur ut illum. + refresh_token: Consequatur dolore unde illum. required: - client_id - client_secret @@ -3689,7 +4762,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Ipsam temporibus sint et necessitatibus dolorem ut. + example: Quam quis quam dolor occaecati earum iusto. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3697,15 +4770,15 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Fugit voluptas molestias architecto dicta quidem illo. + example: Libero ut est rerum est occaecati et. label: type: string description: Optional friendly name - example: Quia aut sed fugiat adipisci eos rerum. + example: Delectus voluptatem iste nisi in. project_id: type: string description: Owning project - example: Doloremque et qui perferendis. + example: Natus expedita aspernatur consequuntur quod ducimus molestias. status: type: string description: Connection status @@ -3718,16 +4791,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 1442766184420227830 + example: 6933590282461306362 format: int64 example: - account_id: Voluptates neque expedita. + account_id: Nostrum corporis quasi magnam. has_credentials: false - id: Qui sed fugiat. - label: Sit iusto. - project_id: Veniam debitis aut similique ullam temporibus qui. - status: active - version: 3889986261433875806 + id: Iste qui rerum est sed sed similique. + label: Expedita voluptatum commodi fuga ipsa. + project_id: Ea maiores quidem molestiae deleniti omnis. + status: inactive + version: 6739884703025890394 required: - id - project_id @@ -3746,10 +4819,10 @@ definitions: label: type: string description: Optional friendly name - example: Quisquam ut eius. + example: Sint ipsa quo. example: account_id: t2_gv9wtbfa - label: Ipsum nihil cumque repellendus sint soluta. + label: Architecto quas eligendi impedit qui sed. required: - account_id RedditAdsCredentials: @@ -3759,20 +4832,20 @@ definitions: client_id: type: string description: OAuth client id - example: Sed quibusdam reiciendis qui vel. + example: Necessitatibus laudantium est ut. client_secret: type: string description: OAuth client secret - example: Amet et eaque. + example: Neque facilis est qui possimus eligendi. refresh_token: type: string description: OAuth refresh token - example: Consequatur iste sed illo adipisci sunt. + example: Possimus et corrupti et nobis voluptas. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Soluta consectetur porro quo quia incidunt. - client_secret: Aperiam et ipsam vitae. - refresh_token: Velit est quis aliquid aliquam. + client_id: Exercitationem illum et quisquam. + client_secret: Est facilis qui. + refresh_token: Modi ut culpa excepturi blanditiis. required: - client_id - client_secret @@ -3784,31 +4857,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Vitae quae debitis sunt aperiam ex voluptatibus. + example: Rerum illo mollitia odio et dolor. funding_instrument_id: type: string description: Funding instrument for the ad account - example: In fuga ut. + example: Ipsam maiores et maiores laudantium aut perspiciatis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptate nisi natus sint. + example: Quia quisquam corrupti distinctio voluptas eius. label: type: string description: Optional friendly name - example: Ut dolor velit. + example: Nam rerum eaque eius. project_id: type: string description: Owning project - example: Beatae aliquam quia officiis hic ea. + example: Autem est est distinctio sunt aliquid harum. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -3817,17 +4890,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6056629402053782931 + example: 9024066918837864439 format: int64 example: - account_id: Non possimus quos voluptatem doloremque consequatur deleniti. - funding_instrument_id: Fuga illo dolorem sit ex commodi sapiente. - has_credentials: false - id: Iusto quidem laudantium. - label: Quaerat ut neque expedita nostrum. - project_id: Ratione consequuntur aut et corrupti. - status: error - version: 5145245548849296683 + account_id: Ad inventore voluptatum eligendi quasi. + funding_instrument_id: Aperiam velit dolores. + has_credentials: true + id: Voluptates non sint inventore iste iure ut. + label: Porro voluptate. + project_id: Facilis suscipit. + status: inactive + version: 358292288538552244 required: - id - project_id @@ -3846,15 +4919,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Excepturi dolorem autem ipsa autem provident. + example: Dignissimos non sed omnis officiis et. label: type: string description: Optional friendly name - example: Illum tenetur numquam. + example: Placeat unde distinctio ducimus qui. example: account_id: 8r7gb - funding_instrument_id: Quis et odio tenetur optio. - label: Iure quo culpa. + funding_instrument_id: Magni repudiandae. + label: Laboriosam qui id enim. required: - account_id TwitterAdsCredentials: @@ -3864,25 +4937,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + example: Eos quaerat rem aut fuga. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Nostrum dolorum iure eaque animi. + example: Est dolor ut corporis. consumer_key: type: string description: OAuth 1.0a consumer key - example: Ut sint. + example: Nihil corrupti repellat eius. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Iste eveniet laudantium rerum. + example: Qui nobis et delectus quam. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Error necessitatibus et autem doloribus est. - access_token_secret: Maxime labore illo maxime provident. - consumer_key: Error laudantium. - consumer_secret: Similique odio adipisci dolore iste. + access_token: Pariatur debitis. + access_token_secret: Explicabo possimus consequatur. + consumer_key: Cupiditate ut illo dolor quaerat totam. + consumer_secret: Illo vitae occaecati omnis. required: - consumer_key - consumer_secret diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index cfa12163..c503a375 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Inventore ratione id vel iusto optio repellendus."},"example":"Rerum eveniet nam sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Vitae qui.","has_credentials":true,"id":"Minima autem libero natus id esse.","label":"Odit eum commodi autem expedita dolorem.","login_customer_id":"In laborum vel.","project_id":"Sed adipisci eveniet et aut.","status":"active","version":4120562596096857294}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Occaecati quaerat eum quia a excepturi."},"example":"Inventore aut molestiae voluptas hic."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Corrupti reprehenderit et non totam perspiciatis.","has_credentials":false,"id":"Harum laborum est adipisci sint.","label":"Ipsa ex.","login_customer_id":"Perspiciatis voluptatibus architecto velit.","project_id":"Est impedit et tempore provident.","status":"error","version":6280538112072962831}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Inventore impedit unde voluptatem quia ab recusandae."},"example":"Vel omnis iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ut commodi asperiores.","has_credentials":false,"id":"Dignissimos non ut sed.","label":"Perferendis nam voluptatibus totam.","login_customer_id":"Voluptatem similique.","project_id":"Deleniti quam.","status":"inactive","version":2550395787104322115}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Deserunt ab itaque amet numquam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Necessitatibus quaerat minima a voluptatem ipsa et."},"example":"Pariatur perferendis explicabo expedita et velit accusamus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","brand_kit":"Distinctio vel.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","portal_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","sender_email":"Quam et voluptatibus illum dolorem.","sender_name":"Eum dolorum.","status":"active","version":3995988906528985875}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."},"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sequi non et."},"example":"Quibusdam repellendus qui numquam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Voluptates iste autem veniam et enim unde.","brand_kit":"Blanditiis quidem qui iusto sed.","has_credentials":false,"id":"Nesciunt necessitatibus ex ea ullam corrupti sunt.","label":"Modi asperiores ut libero vel.","portal_id":"Rem quia consequuntur ut.","project_id":"Omnis accusantium ad.","sender_email":"Consequatur quos atque voluptates quo sit.","sender_name":"Dolor molestias ipsa dolorum est.","status":"inactive","version":1691702820919785934}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Deleniti placeat rerum."},"example":"Recusandae totam soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Aut ratione sunt nostrum tenetur.","brand_kit":"Ab laboriosam quis sapiente ut sit.","has_credentials":true,"id":"Ipsum quaerat delectus cupiditate sit et.","label":"Magni et rerum sed voluptatum.","portal_id":"Fugit enim et sint consectetur ea minus.","project_id":"Enim est occaecati sed non dolorem distinctio.","sender_email":"Ut laborum nostrum veniam qui rerum.","sender_name":"Eum fugit repudiandae magnam ut.","status":"active","version":2378889005955898844}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Tempora error rerum quae nihil.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ea eum."},"example":"Repudiandae quae aut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Quis repellat tenetur.","has_credentials":false,"id":"Et quam veritatis consequatur sed.","label":"Ipsum fuga deleniti consequatur.","org_id":"Natus laudantium quisquam.","project_id":"Tempora aut incidunt incidunt dolorem eaque et.","status":"inactive","version":2296210645404105233}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"},"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatem doloremque ullam consequatur ut."},"example":"Ipsa magnam cum veritatis mollitia vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Totam quasi vero.","has_credentials":false,"id":"Eum quia molestiae.","label":"Est quos.","org_id":"Est est id repellat quod deleniti cupiditate.","project_id":"Rerum delectus tempora culpa.","status":"error","version":2086671994798543080}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore rem quo fuga accusantium voluptas ratione."},"example":"Numquam optio possimus velit quod."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Ipsa rerum odit et nostrum veritatis dolores.","has_credentials":false,"id":"Aut et voluptas ut officiis.","label":"Debitis voluptatem quam occaecati.","org_id":"Et tenetur sequi dolorum porro.","project_id":"In autem tempore ut esse.","status":"deleted","version":7961829707957443728}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorum voluptates placeat rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"example":"Aut repudiandae voluptatibus odit autem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Voluptatem cupiditate voluptas aliquam facilis iste sed.","app_id":"A sed exercitationem ut.","has_credentials":false,"id":"Expedita unde molestiae.","label":"Velit ullam.","page_id":"Voluptatum a.","project_id":"Voluptas dolor et incidunt pariatur quod odit.","status":"active","version":6376430019451136769}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."},"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Perspiciatis quam iste possimus ipsam."},"example":"Eveniet quia voluptatem impedit cumque doloribus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Fuga ut expedita voluptatum sit.","app_id":"Quia ut atque.","has_credentials":true,"id":"Quis perspiciatis.","label":"Similique vel nobis non molestias.","page_id":"Velit et.","project_id":"Nesciunt unde ullam occaecati maxime.","status":"active","version":8123871071866488705}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dicta qui."},"example":"Voluptate dolorum id ut molestias id."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos quo eum dignissimos iure praesentium.","app_id":"Voluptas ratione delectus ut adipisci.","has_credentials":false,"id":"Doloremque itaque eius magni autem.","label":"Ex tempore.","page_id":"Qui mollitia perferendis eveniet voluptas est et.","project_id":"Ullam tenetur quia totam magni sunt repellat.","status":"inactive","version":7772855560046758577}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aliquam animi unde.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Non eos."},"example":"Enim voluptatem inventore quasi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Optio dolorem omnis.","customer_id":"Rerum adipisci minima quibusdam autem accusantium.","has_credentials":false,"id":"Veniam eum ut libero quibusdam debitis.","label":"Commodi quam voluptates.","project_id":"Ut consectetur.","status":"deleted","version":6203614951491514230}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."},"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus enim quas id porro."},"example":"Quo repudiandae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Exercitationem rerum iste ducimus.","customer_id":"Quidem velit est explicabo est sed.","has_credentials":true,"id":"Modi rerum sint.","label":"Dolorem dolor fugiat quia.","project_id":"Labore iste voluptates quos.","status":"inactive","version":8271015532862321776}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut omnis itaque ut vero voluptatibus."},"example":"Vero dolorem qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Maxime fugiat illo.","customer_id":"Minus est ut.","has_credentials":false,"id":"Tempora recusandae.","label":"Reiciendis architecto atque maxime soluta dolorem ducimus.","project_id":"Itaque harum.","status":"deleted","version":6177609042943350629}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ullam fugiat.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"example":"Fugit eum et sint possimus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Amet iusto provident sequi est.","has_credentials":true,"id":"Voluptas non accusantium.","label":"Sit dolorum excepturi quibusdam.","project_id":"Architecto consequatur enim magnam eius voluptas voluptatibus.","status":"deleted","version":1322493338651594921}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."},"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa aut."},"example":"Impedit vitae molestiae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Ut ea alias.","has_credentials":false,"id":"Explicabo cupiditate rerum.","label":"Hic vero et.","project_id":"Incidunt ipsum est perspiciatis soluta voluptas est.","status":"inactive","version":347677279926224703}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Neque hic voluptatem ad similique sunt."},"example":"Ratione impedit recusandae dolor consequatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Saepe pariatur.","has_credentials":true,"id":"Vero quam.","label":"Eveniet soluta adipisci.","project_id":"Neque tempore voluptatibus quo quod nesciunt.","status":"active","version":779913646680513111}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Repudiandae veniam soluta alias natus aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Enim esse dolores."},"example":"Est perferendis eos et cumque nulla."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Et tempore.","funding_instrument_id":"Est et id laudantium magnam ratione.","has_credentials":false,"id":"Ipsum deserunt ut.","label":"Ut nihil quo tenetur doloribus fugiat natus.","project_id":"Sed ea.","status":"error","version":6360932954176398686}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."},"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel temporibus sunt nulla esse sed."},"example":"Facere sed ea qui pariatur adipisci."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Totam sequi.","funding_instrument_id":"Labore ut iusto dolores.","has_credentials":false,"id":"Dolor ut.","label":"Porro sed minus illo rerum ut.","project_id":"Veniam maiores dolorum sit et.","status":"active","version":5887915076445143491}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Neque maiores quo aliquam in rem."},"example":"Voluptatem possimus veniam dignissimos consequatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Est dolorem eos amet dolorem sed.","funding_instrument_id":"Quia porro.","has_credentials":false,"id":"Ab nobis fuga atque inventore fugiat.","label":"Quod blanditiis et.","project_id":"Laboriosam maxime facere culpa modi.","status":"error","version":796228352115418506}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quo aliquid nobis.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Rerum sunt eum et qui."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Ut quia harum.","ok":false},"required":["ok"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."},"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"},"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."},"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."},"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."},"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."},"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatem sed quia excepturi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ullam dolores rem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Labore laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Eos voluptatibus."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Officia quidem non qui voluptates natus cum."},"project_id":{"type":"string","description":"Owning project","example":"Facilis reiciendis dignissimos consequatur iste qui minima."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1885605882290356239,"format":"int64"}},"example":{"account_id":"Iusto velit quo voluptatibus modi reiciendis aliquam.","etag":"Sunt recusandae similique.","has_credentials":false,"id":"Autem recusandae totam.","label":"Odit necessitatibus veritatis amet ut rerum quidem.","login_customer_id":"Iusto quia.","project_id":"Rerum nisi.","status":"error","version":4043658872882310311},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Error ipsam maiores et maiores laudantium aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aliquid harum quis."},"label":{"type":"string","description":"Optional friendly name","example":"Mollitia odio et dolor et consectetur."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Sint inventore iste iure ut."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eaque eius est rerum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1681601347963415661,"format":"int64"}},"example":{"account_id":"Ipsa et dolore.","has_credentials":true,"id":"Facilis suscipit.","label":"Ad inventore voluptatum eligendi quasi.","login_customer_id":"Placeat unde distinctio ducimus qui.","project_id":"Porro voluptate.","status":"inactive","version":1820304569870851201},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nihil corrupti repellat eius."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Magni repudiandae."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Delectus quam et eos."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam qui id enim."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8134511901185890068,"format":"int64"}},"example":{"account_id":"Illo vitae occaecati omnis.","has_credentials":false,"id":"Rem aut fuga.","label":"Cupiditate ut illo dolor quaerat totam.","login_customer_id":"Explicabo possimus consequatur.","project_id":"Est dolor ut corporis.","status":"active","version":299946558233755685},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","login_customer_id":"Velit atque laudantium ullam rerum.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ut aut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Sit similique ut minima ut."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Voluptatum officia quod error amet quia inventore."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas expedita omnis ex."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Non ut voluptas et accusamus natus id.","client_secret":"Et officia sequi et quam.","developer_token":"Vero quisquam.","refresh_token":"Quia enim illo et eligendi."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus voluptatem iste nisi in."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Nostrum corporis quasi magnam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolor occaecati earum iusto rerum sit cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nam quia aperiam sunt est."},"label":{"type":"string","description":"Optional friendly name","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Iste qui rerum est sed sed similique."},"project_id":{"type":"string","description":"Owning project","example":"Libero ut est rerum est occaecati et."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea maiores quidem molestiae deleniti omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Expedita voluptatum commodi fuga ipsa."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3681253484013323435,"format":"int64"}},"example":{"account_id":"Neque facilis est qui possimus eligendi.","brand_kit":"Voluptas eius error autem est est distinctio.","etag":"Et nobis voluptas dignissimos exercitationem illum.","has_credentials":false,"id":"Qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","portal_id":"Quisquam ex est facilis qui ducimus.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","sender_email":"Ut culpa excepturi.","sender_name":"Officiis quia quisquam corrupti.","status":"inactive","version":8080806383587730069},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Magni omnis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Perferendis culpa voluptatem nostrum eaque deleniti."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatum et impedit quod."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Est repellat."},"project_id":{"type":"string","description":"Owning project","example":"Consectetur et culpa quaerat vel."},"sender_email":{"type":"string","description":"Default sender address","example":"Esse sit id incidunt mollitia non sed."},"sender_name":{"type":"string","description":"Default sender name","example":"Minima est distinctio accusamus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7333781901734102627,"format":"int64"}},"example":{"account_id":"Aliquam animi.","brand_kit":"Eos iusto fugit.","has_credentials":true,"id":"Quo nostrum quia.","label":"Velit quis.","portal_id":"Error dolor placeat et.","project_id":"Ut nobis.","sender_email":"Et esse fugiat aliquid aspernatur voluptatem in.","sender_name":"Consequatur et dolorem.","status":"error","version":2888074467672743464},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptas omnis quidem dolor ipsum voluptas sed."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Tempora dolor quis totam hic quibusdam eveniet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Asperiores quidem."},"label":{"type":"string","description":"Optional friendly name","example":"Nesciunt adipisci odit corrupti laudantium consequatur hic."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Dolorem necessitatibus neque consectetur occaecati earum."},"project_id":{"type":"string","description":"Owning project","example":"Est nostrum atque."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut sint non eum expedita non."},"sender_name":{"type":"string","description":"Default sender name","example":"Sit voluptatem ad ab."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3980984224261423037,"format":"int64"}},"example":{"account_id":"Quidem omnis totam eos non molestias.","brand_kit":"Ducimus id sint eius aut.","has_credentials":false,"id":"Doloribus voluptas mollitia doloremque totam.","label":"Quia doloremque commodi rerum.","portal_id":"Recusandae illum accusamus debitis.","project_id":"Veniam et ducimus quos amet.","sender_email":"Praesentium sint laudantium error.","sender_name":"Nihil iure officiis nemo quia.","status":"inactive","version":6150421422111226538},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ab quo ullam ad."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aperiam facere voluptas quis nihil."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et quia ex et alias ea."},"label":{"type":"string","description":"Optional friendly name","example":"Laborum maiores est ea ducimus ipsum dolorem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Placeat explicabo."},"project_id":{"type":"string","description":"Owning project","example":"Quas quis corporis."},"sender_email":{"type":"string","description":"Default sender address","example":"Rerum tenetur ut voluptatem quo."},"sender_name":{"type":"string","description":"Default sender name","example":"Iste aut cum voluptatem qui et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3448886829732168782,"format":"int64"}},"example":{"account_id":"Vero ut et neque soluta distinctio voluptas.","brand_kit":"Voluptatem incidunt cum.","has_credentials":false,"id":"Rem asperiores eligendi vero.","label":"Facere quas qui aut rerum.","portal_id":"Fugit eum.","project_id":"Voluptatem fugiat et.","sender_email":"Necessitatibus voluptatem incidunt et totam esse rerum.","sender_name":"Dolorem delectus.","status":"active","version":5717670313645740058},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Quis quis reprehenderit non quae omnis qui."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"At odio incidunt distinctio sint qui."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Cumque saepe sint quidem odio ab."},"sender_email":{"type":"string","description":"Default sender address","example":"Aut est."},"sender_name":{"type":"string","description":"Default sender name","example":"Error pariatur consequatur esse."}},"example":{"account_id":"Et eligendi et numquam dolorum consequatur in.","brand_kit":"Non sequi error assumenda quam deleniti et.","label":"Necessitatibus eos.","portal_id":"Et eum est molestiae necessitatibus magni.","sender_email":"Molestiae praesentium perferendis deserunt ipsum dolorum.","sender_name":"Error nulla fuga fugit repellendus et accusamus."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Dolor officia eligendi."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Provident dicta temporibus debitis."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Cumque molestiae eos rem aut."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non adipisci rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Adipisci quaerat est nobis."},"label":{"type":"string","description":"Optional friendly name","example":"Et veritatis quisquam sed ratione et."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Placeat ea odio ea eos."},"project_id":{"type":"string","description":"Owning project","example":"Fugit non fuga rem adipisci."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7868855978793741277,"format":"int64"}},"example":{"account_id":"Nobis itaque est enim magnam pariatur.","etag":"Praesentium ipsam officiis cum ipsum recusandae.","has_credentials":true,"id":"Ipsum et delectus dolorum eveniet.","label":"Maxime maxime porro enim.","org_id":"Adipisci ullam pariatur ex voluptas.","project_id":"Alias ea quibusdam.","status":"active","version":5465298508990820984},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolorum deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Non laudantium sunt minima repudiandae illo harum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Eos nihil ipsam ex odio totam."},"project_id":{"type":"string","description":"Owning project","example":"Enim accusantium labore esse numquam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2440284349670140496,"format":"int64"}},"example":{"account_id":"Omnis consequatur.","has_credentials":true,"id":"Deleniti placeat fuga aut saepe.","label":"Ut quis ut accusantium.","org_id":"Aut autem sint minus voluptatum.","project_id":"Reiciendis pariatur repellat.","status":"error","version":4719926195195381744},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis quis delectus est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tempore quae."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores tenetur ut illum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Expedita accusantium vel voluptate."},"project_id":{"type":"string","description":"Owning project","example":"Consequatur dolore unde illum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1676862666948614995,"format":"int64"}},"example":{"account_id":"Magni consequatur dignissimos itaque quia.","has_credentials":true,"id":"Repellat assumenda nesciunt distinctio eaque aliquam.","label":"Et reprehenderit dignissimos.","org_id":"Et voluptatem deserunt consequuntur omnis sed dolore.","project_id":"Veniam consectetur deserunt in hic dolorum facere.","status":"inactive","version":7072791787806691868},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Assumenda dignissimos beatae vitae aut ea dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatibus quod necessitatibus non iste ad rem."},"label":{"type":"string","description":"Optional friendly name","example":"Harum corporis deleniti doloribus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Sit architecto ut unde."},"project_id":{"type":"string","description":"Owning project","example":"Sunt qui cupiditate ullam ab suscipit et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6055913800302101668,"format":"int64"}},"example":{"account_id":"Praesentium tenetur quas at ut necessitatibus dolor.","has_credentials":false,"id":"Sapiente possimus.","label":"Eaque voluptate reprehenderit sed voluptatem sed illo.","org_id":"Nihil id unde veritatis officiis aut fugiat.","project_id":"Voluptates atque.","status":"error","version":446959638978499075},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Cumque totam nulla aut reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Illum rerum error incidunt.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Aspernatur possimus."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Repellendus quo quidem."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Iusto ad animi eos doloribus autem corrupti."},"app_id":{"type":"string","description":"Meta app ID","example":"Laborum eum et quidem."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Suscipit quas sunt eos nulla."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere exercitationem et exercitationem."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum quidem accusamus et provident provident omnis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Perferendis qui maiores aut reiciendis."},"project_id":{"type":"string","description":"Owning project","example":"Eaque deleniti."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1750381436080099913,"format":"int64"}},"example":{"account_id":"Ad non.","app_id":"Est voluptas sequi.","etag":"Possimus consequatur est unde.","has_credentials":false,"id":"Quasi quis ab deserunt quia magnam.","label":"Quod modi voluptas dolores commodi dicta.","page_id":"Et laudantium.","project_id":"Minus et aut consequatur non cumque.","status":"active","version":3589524561643771783},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nostrum tempore."},"app_id":{"type":"string","description":"Meta app ID","example":"Rerum explicabo."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut commodi et voluptas tenetur nobis facere."},"label":{"type":"string","description":"Optional friendly name","example":"Blanditiis mollitia dolores illo nostrum magnam."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deserunt repellendus corrupti itaque quo sit."},"project_id":{"type":"string","description":"Owning project","example":"Quo corporis recusandae dicta quibusdam."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6534648276901202778,"format":"int64"}},"example":{"account_id":"Perspiciatis porro.","app_id":"Deserunt quod.","has_credentials":false,"id":"Eum et ipsum expedita reprehenderit eos.","label":"Aperiam et nihil.","page_id":"Non rem error.","project_id":"Dolorum ut architecto deleniti nostrum.","status":"deleted","version":2783740423386270532},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptate necessitatibus enim et et itaque."},"app_id":{"type":"string","description":"Meta app ID","example":"Nihil aut rerum est vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam quos perferendis nisi blanditiis eveniet."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis omnis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum quis et modi optio labore omnis."},"project_id":{"type":"string","description":"Owning project","example":"Ea enim ut corporis dolorum consequatur eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9014435567821091487,"format":"int64"}},"example":{"account_id":"Dolor aut assumenda fugiat.","app_id":"Aut quas suscipit eos.","has_credentials":true,"id":"Rem ab corporis.","label":"Porro et.","page_id":"Inventore alias error aut maxime dicta.","project_id":"Non dolorem.","status":"deleted","version":5862072609653585869},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor et corrupti voluptas neque vitae."},"app_id":{"type":"string","description":"Meta app ID","example":"Rerum numquam amet deserunt rem quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa rerum velit et impedit."},"label":{"type":"string","description":"Optional friendly name","example":"Velit quam omnis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Mollitia est assumenda aut harum."},"project_id":{"type":"string","description":"Owning project","example":"Quaerat labore dolor."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1514261665871912761,"format":"int64"}},"example":{"account_id":"Deleniti deserunt labore.","app_id":"Molestiae deserunt voluptates.","has_credentials":true,"id":"Ipsam dolores et et qui ut.","label":"Velit esse voluptate eum laboriosam distinctio.","page_id":"Adipisci quo.","project_id":"Numquam omnis ullam facilis ab sapiente.","status":"error","version":3954861542185537606},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Eius sed qui deserunt perspiciatis nihil."},"label":{"type":"string","description":"Optional friendly name","example":"Et eveniet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corporis ut non."}},"example":{"account_id":"act_193556282970417","app_id":"Aut hic.","label":"Mollitia tempora minima voluptas.","page_id":"Facere aut facilis porro dolor ipsa."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Aperiam voluptates."},"app_secret":{"type":"string","description":"Meta app secret","example":"Vero ducimus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Recusandae aut perferendis.","app_secret":"Est eaque ipsam harum nisi nobis."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et nulla officia vitae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Et sunt quis dicta voluptate aut in."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut asperiores quo aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Perspiciatis id."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"project_id":{"type":"string","description":"Owning project","example":"Ut non error aut et fuga."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2431299518347433245,"format":"int64"}},"example":{"account_id":"Id temporibus et provident maiores neque quis.","customer_id":"Sunt assumenda.","etag":"Eligendi ut.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Earum minus autem omnis qui debitis eum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quidem necessitatibus voluptatem consequatur sit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse officia explicabo dolor deserunt aspernatur."},"label":{"type":"string","description":"Optional friendly name","example":"Cupiditate mollitia hic vel ut."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur illo accusamus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3699306814781450025,"format":"int64"}},"example":{"account_id":"Sed corrupti sit.","customer_id":"Consectetur tenetur eum.","has_credentials":true,"id":"Et vel beatae molestiae fuga.","label":"Aut ut.","project_id":"Vitae consequatur eos.","status":"active","version":436879921687162189},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui impedit temporibus eveniet eos omnis cumque."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Natus et unde."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut ut sit nisi architecto."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium voluptate."},"project_id":{"type":"string","description":"Owning project","example":"Rerum et recusandae possimus quis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1288874109548033633,"format":"int64"}},"example":{"account_id":"Hic est quia pariatur odit ullam.","customer_id":"Sed quo perferendis nemo ut quisquam.","has_credentials":true,"id":"Explicabo repudiandae aut reiciendis recusandae molestias.","label":"Quod impedit accusamus incidunt minus veritatis enim.","project_id":"Vel inventore aliquid aut non eligendi accusamus.","status":"error","version":2175885598856983154},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic rerum accusamus velit error."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem deserunt quasi in aut nam rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repellendus quos magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Pariatur repellat vel."},"project_id":{"type":"string","description":"Owning project","example":"In id voluptatem nihil quaerat."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8411140861799189617,"format":"int64"}},"example":{"account_id":"Sint est sed.","customer_id":"Illum quisquam ex ipsa.","has_credentials":true,"id":"Distinctio magnam.","label":"Quia magni aut nisi est.","project_id":"Architecto deserunt vero ducimus distinctio.","status":"active","version":6452524533918462281},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Ex quo praesentium voluptas."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Est officia et."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem mollitia omnis doloribus qui consequatur et."}},"example":{"account_id":"Eos et architecto voluptas.","customer_id":"Vel natus provident.","label":"Numquam accusamus."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Architecto itaque doloribus voluptatem consequatur quis fugiat."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Recusandae qui culpa."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Sed rerum dicta distinctio voluptas ut ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Accusamus et atque enim."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Fuga nostrum velit hic excepturi omnis.","client_secret":"Distinctio quos ut unde et atque.","developer_token":"In recusandae maiores et voluptatem.","refresh_token":"Odio labore pariatur nobis."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolores assumenda accusantium mollitia fugiat dolore similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae quos cum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Cum molestias fuga voluptatibus quis."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis aliquid rerum consequatur officiis velit."},"project_id":{"type":"string","description":"Owning project","example":"Aut rerum ut blanditiis dolor."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4135215091203906464,"format":"int64"}},"example":{"account_id":"Natus placeat esse est in deserunt aliquid.","etag":"Sed et odio sunt totam incidunt.","has_credentials":false,"id":"Architecto doloremque aperiam doloribus aut qui.","label":"Distinctio ipsum ab.","project_id":"Placeat cumque iure veritatis cumque nisi.","status":"error","version":6763438623066254599},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Assumenda harum eos eveniet ut et laboriosam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Culpa saepe necessitatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas aperiam."},"project_id":{"type":"string","description":"Owning project","example":"Dolores enim."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6456486653687697700,"format":"int64"}},"example":{"account_id":"Cumque quae.","has_credentials":false,"id":"Qui eaque ut laudantium.","label":"Laborum aspernatur voluptate itaque fugit.","project_id":"Ratione id.","status":"deleted","version":5238309974693293664},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolore velit pariatur non assumenda perspiciatis dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ullam."},"project_id":{"type":"string","description":"Owning project","example":"Vero soluta omnis eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3837313741085790100,"format":"int64"}},"example":{"account_id":"Animi molestiae aut fugit alias nisi qui.","has_credentials":false,"id":"Molestiae ea ullam minima voluptatem vel.","label":"Beatae quia minus vero at ut.","project_id":"Dolore repudiandae necessitatibus dolorem.","status":"inactive","version":8129543513726361746},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem iste ea in ipsa."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Deserunt dolorum nihil."},"label":{"type":"string","description":"Optional friendly name","example":"Odio odio sed minus quia quia ea."},"project_id":{"type":"string","description":"Owning project","example":"Doloremque explicabo ut."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4150548058954901958,"format":"int64"}},"example":{"account_id":"Quibusdam consequuntur dolorem fugiat.","has_credentials":true,"id":"Perspiciatis magni tempore sunt itaque.","label":"Sit beatae ut modi voluptatum veniam.","project_id":"Ut ex.","status":"error","version":5881477690177318757},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Qui molestias."}},"example":{"account_id":"t2_gv9wtbfa","label":"Molestiae minus dolor accusantium."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Numquam quidem qui."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Laboriosam possimus dolor facere velit dolores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Alias ad voluptatem accusantium tempore impedit."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Et expedita itaque quos.","client_secret":"Quos accusantium fugit.","refresh_token":"Excepturi saepe sit vel perspiciatis neque."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam incidunt qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia exercitationem consequatur velit."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia culpa iste id sit incidunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Mollitia atque atque dolores accusantium non dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis labore dicta."},"project_id":{"type":"string","description":"Owning project","example":"Enim qui officia id necessitatibus mollitia soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2620236536617279883,"format":"int64"}},"example":{"account_id":"Accusantium enim temporibus dolor ipsam.","etag":"Aut ducimus dolores.","funding_instrument_id":"Dolorum minus voluptatem.","has_credentials":false,"id":"Officiis est.","label":"Tempore nemo illum ut maiores.","project_id":"Qui quisquam voluptatibus sint quia.","status":"error","version":6092912427529457622},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus ex aut quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corporis consequatur voluptatem voluptates."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Soluta odit odio praesentium perferendis eveniet sint."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus quis iste eaque ratione debitis nam."},"project_id":{"type":"string","description":"Owning project","example":"Quam dicta voluptate consequuntur voluptatem est."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":629084196159484927,"format":"int64"}},"example":{"account_id":"Velit fuga quos.","funding_instrument_id":"Sed aut quia nihil est quia.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","project_id":"Aut aut eos magnam quisquam et.","status":"active","version":2879571083312014203},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit laudantium error."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Beatae harum similique corporis id eum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Fugiat est itaque."},"label":{"type":"string","description":"Optional friendly name","example":"Culpa est possimus dolores dignissimos."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aut dicta libero."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7144064222780250488,"format":"int64"}},"example":{"account_id":"Enim vitae officia dolorem odio.","funding_instrument_id":"Excepturi minima illo dolores.","has_credentials":false,"id":"Et itaque rem eos et deleniti dolores.","label":"Facere qui omnis.","project_id":"Facilis qui libero.","status":"active","version":6722562537039921847},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non quo necessitatibus."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Laudantium nostrum earum dolores sit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"A sint quod sunt quae et."},"label":{"type":"string","description":"Optional friendly name","example":"Ut mollitia nihil ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Iure quis."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3532519562043610511,"format":"int64"}},"example":{"account_id":"At fugit dolor.","funding_instrument_id":"Non exercitationem modi possimus consequatur non.","has_credentials":false,"id":"Exercitationem accusantium nihil.","label":"Amet omnis.","project_id":"Quod alias ipsum voluptates pariatur magni.","status":"error","version":5818865715898604715},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ut mollitia accusantium dignissimos."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit provident officia officiis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Rerum ut necessitatibus illum ratione.","label":"Consequatur qui molestiae velit ratione nesciunt et."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"At perspiciatis quisquam perferendis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Ut alias quis nihil dolore suscipit reprehenderit."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Id ipsa perspiciatis sunt ut velit."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Aut mollitia aut molestiae exercitationem et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Et aut consequatur inventore enim reiciendis.","access_token_secret":"Neque ut rerum facilis quia molestiae ratione.","consumer_key":"Aut animi laudantium ullam.","consumer_secret":"Autem et id laboriosam nihil ea."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nisi est sint consequuntur omnis."},"example":"Neque sed alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"event_slug":"Nemo perspiciatis et qui aliquam doloremque itaque.","id":"Voluptatem cupiditate voluptas aliquam facilis iste sed.","platforms":["Tenetur quia totam magni.","Repellat alias ex.","Nihil quos quo eum.","Iure praesentium ea quis."],"program_type":"Sed exercitationem ut totam ut minus.","project_id":"Laboriosam tempore vero voluptatum a quos.","status":"archived","url":"Magni autem.","version":9009752361610175063}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsum quo possimus."},"example":"Quam culpa."}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Id ducimus excepturi est et est."},"example":"Deleniti non in iure dolores et quis."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae similique assumenda ut quia."},"example":"Nam eius nulla suscipit ullam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"event_slug":"Provident itaque.","id":"Ut est nobis aspernatur.","platforms":["Cupiditate rerum magni incidunt.","Est perspiciatis soluta voluptas est.","Hic vero et.","Ut ea alias."],"program_type":"Ea enim quidem odio et sequi consequatur.","project_id":"Fugit qui tempora commodi reiciendis sit alias.","status":"draft","url":"Voluptas et accusamus quia et officiis ipsum.","version":5012609352100951313}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Corrupti sint molestiae occaecati est."},"example":"Labore est ut ratione nobis ut occaecati."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima veritatis sed impedit laborum."},"example":"Totam non qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"event_slug":"Accusantium quaerat voluptatem iure vero quam consequatur.","id":"Voluptas voluptatibus deleniti sit dolorum.","platforms":["Ex eveniet soluta adipisci occaecati.","Pariatur vero est quaerat id.","Repudiandae veniam soluta alias natus aut."],"program_type":"Illo quaerat.","project_id":"Quibusdam ut amet iusto provident sequi.","status":"approved","url":"Tempore voluptatibus quo.","version":8063317454231389303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sed magnam sed vero nulla."},"example":"Vel et et iure tempora."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum perspiciatis autem."},"example":"Sunt labore voluptate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"event_slug":"Officia et pariatur molestias autem ratione.","id":"Et ratione sit.","platforms":["Et quod porro.","Minus illo rerum ut culpa totam sequi."],"program_type":"A omnis veritatis omnis.","project_id":"Sed ipsum quia.","status":"draft","url":"Ut et veniam maiores.","version":4401871562627166296}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"example":"Consequatur laborum."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Tempora veritatis harum ab nobis fuga atque.","platforms":["Laboriosam maxime facere culpa modi.","Quod blanditiis et.","Est dolorem eos amet dolorem sed.","Architecto provident id quia porro."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Beatae non et excepturi sit minus."},"example":"Et quisquam dicta."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Eaque enim est libero enim quo."},"example":"Aut tempora dolorem neque assumenda sed."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur ipsam consequatur qui illo totam fuga."},"example":"Qui non illum expedita commodi in dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Id ducimus eius et laboriosam omnis vitae.","campaign_name":"Labore iste voluptates quos.","id":"Est voluptatum enim earum et doloribus.","platform":"Voluptatem quas non voluptas ut.","platform_campaign_id":"Modi rerum sint.","project_id":"Ea consequatur et ut.","status":"Dolorem dolor fugiat quia.","version":5825706568637163425}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Similique eaque autem impedit tenetur voluptatibus."},"example":"Libero quia quam harum molestiae cupiditate."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Et eum ex doloremque quia."},"example":"Adipisci vel."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum itaque."},"example":"Et iusto doloremque odio."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Harum distinctio reiciendis architecto atque maxime soluta.","campaign_name":"Est ut ut alias ullam fugiat deserunt.","id":"Accusantium sunt culpa libero quisquam.","platform":"Ducimus porro maxime.","platform_campaign_id":"Illo ipsam error similique quaerat.","project_id":"Rerum amet aut tempora recusandae aspernatur.","status":"Nihil iusto temporibus voluptas.","version":6352110138661359662}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ratione est omnis voluptas praesentium."},"example":"Laboriosam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Consequatur quos atque voluptates quo sit.","has_credentials":false,"id":"Autem veniam.","label":"Quam sed rem quia consequuntur ut.","login_customer_id":"Dolorum est aut blanditiis quidem qui.","project_id":"Enim unde omnis.","status":"inactive","version":8150234719088577779}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum debitis."},"example":"Occaecati quam nostrum quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quibusdam magni et rerum sed voluptatum nesciunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non dolorum odit est.","brand_kit":"Natus veritatis sint autem necessitatibus.","has_credentials":false,"id":"Tempore quo quae aut culpa impedit.","label":"Aperiam dolorem molestias natus velit.","portal_id":"Et magni adipisci magnam veniam.","project_id":"Quibusdam nulla.","sender_email":"Labore qui.","sender_name":"Et corporis architecto dolorem sapiente repellendus.","status":"deleted","version":5377129987312416334}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Totam tempora quod expedita."},"example":"Dignissimos fugiat voluptatibus natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Consequuntur omnis a dignissimos voluptate.","brand_kit":"Ab voluptatem esse.","has_credentials":false,"id":"Doloremque architecto ea et.","label":"Aliquid et in.","portal_id":"Est iste.","project_id":"Asperiores facere et exercitationem soluta possimus.","sender_email":"Ad esse neque earum modi.","sender_name":"Quis possimus placeat.","status":"inactive","version":3236501119949951161}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Dolor id.","brand_kit":"Ex id ut aut.","has_credentials":false,"id":"Modi velit vitae optio ut et consequuntur.","label":"Debitis soluta sed quod dicta aperiam eveniet.","portal_id":"Corrupti esse mollitia distinctio saepe rerum.","project_id":"Libero autem ut.","sender_email":"Eum et qui aut consequatur ut.","sender_name":"Harum maxime voluptas expedita.","status":"inactive","version":5643656240528764613}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Similique ut minima.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore vel quia cum."},"example":"Aut est et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Magni voluptas odio assumenda totam.","has_credentials":true,"id":"Ipsam vitae aut voluptatem.","label":"Iusto quis magni et velit.","org_id":"Officiis deleniti ipsam nam.","project_id":"Ab quam velit sapiente.","status":"deleted","version":6633489521806040497}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Itaque quo."},"example":"Aperiam et ab."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quae nihil magni.","has_credentials":true,"id":"Eum fugit repudiandae magnam ut.","label":"Aut tempora error.","org_id":"Voluptatem repudiandae laudantium expedita ut.","project_id":"Ab laboriosam quis sapiente ut sit.","status":"error","version":7519523340683479876}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis ea molestiae eum voluptatum."},"example":"Consequatur nemo molestiae modi ut non atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Facere harum enim consequatur id voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aperiam quia doloribus omnis."},"example":"Aut quia voluptates voluptates nisi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Mollitia a magni vel consequatur ea deserunt.","app_id":"Inventore aliquid voluptatibus iste mollitia.","has_credentials":true,"id":"Et corporis officia sint.","label":"Ratione quis.","page_id":"Occaecati eum tenetur.","project_id":"Ut in possimus quia nulla.","status":"error","version":2122032566439088184}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed commodi voluptatibus."},"example":"Fuga facilis asperiores enim nisi consequatur perspiciatis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quo sint dolorum vel.","app_id":"Dolores commodi aperiam voluptatibus.","has_credentials":false,"id":"Accusamus vero et voluptas accusamus sunt.","label":"Vel blanditiis sunt ut facere.","page_id":"Est non tenetur dolore.","project_id":"Rerum cupiditate.","status":"deleted","version":8886302108378029553}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Eius voluptatem molestiae qui suscipit rerum.","app_id":"Id facere maxime.","has_credentials":false,"id":"Saepe sit et sed qui dolorem reiciendis.","label":"Asperiores ipsum quam.","page_id":"Cum rem architecto vel quibusdam vel autem.","project_id":"Id tenetur exercitationem aperiam incidunt.","status":"error","version":3981571209223840207}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Delectus et maxime ut possimus expedita qui.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima adipisci aut quia quisquam."},"example":"Magnam nihil qui doloremque nam magnam aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Possimus dolore.","customer_id":"Vero quis consequuntur.","has_credentials":true,"id":"Autem aspernatur ea voluptatem.","label":"Dicta rerum sed perferendis.","project_id":"Voluptas eveniet assumenda accusantium aspernatur facere tempora.","status":"deleted","version":5431490552370585468}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Possimus nihil qui enim ratione voluptatem eos.","customer_id":"Debitis itaque itaque dolores nihil.","has_credentials":true,"id":"Ipsum voluptatem et quam beatae laborum omnis.","label":"Aut quis qui laudantium dolore.","project_id":"Esse aut et rem suscipit similique.","status":"inactive","version":5244933818906460264}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus accusantium expedita alias."},"example":"Iusto molestiae cupiditate quis modi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Est aut labore sint natus.","customer_id":"Quas quibusdam.","has_credentials":true,"id":"Ut fugiat magnam quia.","label":"Distinctio beatae.","project_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","status":"deleted","version":8986600307371048121}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Harum iste voluptatem et voluptatem.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et iste."},"example":"Odio eos earum fuga non est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Molestias architecto dicta quidem illo numquam.","has_credentials":false,"id":"Explicabo vero commodi.","label":"Minus ut est recusandae aspernatur eum fugit.","project_id":"Qui asperiores velit enim tempore expedita.","status":"error","version":3837864470732187499}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Exercitationem officia corrupti tempora ea."},"example":"Ipsa sint optio nobis quae corporis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Blanditiis atque rerum et officiis sapiente et.","has_credentials":true,"id":"Harum provident quia distinctio ea.","label":"Hic et sed.","project_id":"Rem harum provident provident quia laboriosam magnam.","status":"deleted","version":1429619977254656560}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Rerum reiciendis similique."},"example":"Saepe voluptatem dolores tempora qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Expedita accusantium dolorum qui sed fugiat.","has_credentials":true,"id":"Sed fugiat.","label":"Ipsam temporibus sint et necessitatibus dolorem ut.","project_id":"Eos rerum.","status":"deleted","version":3554537496380374690}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ullam temporibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Repudiandae odit."},"example":"Temporibus ipsum necessitatibus ratione possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","funding_instrument_id":"Fuga illo dolorem sit ex commodi sapiente.","has_credentials":false,"id":"Ut eveniet iusto quidem.","label":"Quaerat ut neque expedita nostrum.","project_id":"Accusamus ratione consequuntur aut et corrupti.","status":"error","version":5145245548849296683}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vero voluptates soluta."},"example":"Eligendi consequatur officia labore eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Beatae aliquam quia officiis hic ea.","funding_instrument_id":"Debitis vitae quae debitis sunt.","has_credentials":true,"id":"Aperiam et ipsam vitae.","label":"Voluptate nisi natus sint.","project_id":"Velit est quis aliquid aliquam.","status":"deleted","version":1415133980301644723}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Facilis repellat eveniet reiciendis."},"example":"Non placeat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Ut sint.","funding_instrument_id":"Rerum omnis veritatis.","has_credentials":false,"id":"Excepturi dolorem autem ipsa autem provident.","label":"Quis et odio tenetur optio.","project_id":"Iure quo culpa.","status":"inactive","version":36658389617783588}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Maxime incidunt asperiores.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsum expedita animi."},"example":"Velit at omnis autem."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Voluptas nam.","job_id":"Nesciunt asperiores et est.","result":"Facere sint totam sapiente vitae numquam ut.","status":"partial"}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos expedita voluptas qui eaque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8483228206992747737,"format":"int64"}},"example":{"etag":"Repudiandae necessitatibus dolorem enim beatae quia.","event_slug":"Consequatur in vero soluta.","id":"Laudantium nostrum ratione id eius laborum aspernatur.","platforms":["Distinctio dolore velit pariatur.","Assumenda perspiciatis dolor porro.","Et cupiditate molestiae ea ullam minima voluptatem."],"program_type":"Molestiae suscipit non iusto.","project_id":"Itaque fugit rerum cumque.","status":"draft","url":"Eius dicta.","version":5990824706789002616},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7907674416929152715,"format":"int64"}},"example":{"event_slug":"Tenetur non accusamus qui ex.","id":"Dolore est dolorem quod enim pariatur.","platforms":["Et amet sunt.","Ad quae nisi."],"program_type":"Aut architecto aliquam mollitia labore sapiente.","project_id":"Occaecati veritatis.","status":"draft","url":"Quia mollitia.","version":7441335261794230827},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Hic vel aspernatur at quam est ea."},"id":{"type":"string","description":"Brief UUID","example":"Blanditiis cum et."},"platforms":{"type":"array","items":{"type":"string","example":"Necessitatibus sit."},"description":"Suggested default platforms","example":["Aperiam deserunt nostrum consectetur.","Sed praesentium libero blanditiis qui minima.","Nulla sunt autem eos rerum provident dicta."]},"program_type":{"type":"string","description":"Funnel context","example":"Nemo nihil dolorum consequatur sed tempora qui."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum eius."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Sit dignissimos incidunt voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8003111466267168066,"format":"int64"}},"example":{"event_slug":"Veritatis itaque.","id":"Dolor dolores provident porro.","platforms":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."],"program_type":"Dolores laborum sed.","project_id":"Odio sunt esse mollitia incidunt.","status":"approved","url":"Est quis impedit.","version":9059453485160266445},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Impedit dolores."},"id":{"type":"string","description":"Brief UUID","example":"Eos iste corporis praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"At sint laborum veniam."},"description":"Suggested default platforms","example":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."]},"program_type":{"type":"string","description":"Funnel context","example":"Officia eligendi alias."},"project_id":{"type":"string","description":"Owning project","example":"Quis veniam iusto consequatur quia."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Alias minus reprehenderit dignissimos aut velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8443584423631303721,"format":"int64"}},"example":{"event_slug":"Velit quis harum recusandae est ipsum.","id":"Aperiam saepe.","platforms":["Totam voluptatem eos doloribus sint exercitationem eligendi.","Quidem sit in quia molestiae perspiciatis alias."],"program_type":"Laborum est quasi dignissimos.","project_id":"Aut animi sit esse ratione aliquid.","status":"approved","url":"Amet quaerat modi.","version":3775655592825521439},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Tempora voluptate fuga ea distinctio."},"id":{"type":"string","description":"Brief UUID","example":"Molestiae praesentium minus."},"platforms":{"type":"array","items":{"type":"string","example":"Eaque nesciunt."},"description":"Suggested default platforms","example":["Inventore in eligendi ipsam.","Vel atque eos reiciendis sit minima non.","Et itaque ut dolores in voluptas."]},"program_type":{"type":"string","description":"Funnel context","example":"Pariatur mollitia incidunt autem."},"project_id":{"type":"string","description":"Owning project","example":"Et consequuntur suscipit."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Mollitia aut tempore rerum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","url":"Nostrum similique omnis iste.","version":1280403017059047628},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et itaque rem eos et deleniti dolores."},"campaign_name":{"type":"string","description":"Campaign name","example":"Enim vitae officia dolorem odio."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus a."},"id":{"type":"string","description":"Campaign UUID","example":"Beatae velit laudantium error eum et aut."},"platform":{"type":"string","description":"Channel","example":"Facilis qui libero."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Facere qui omnis."},"project_id":{"type":"string","description":"Owning project","example":"Beatae harum similique corporis id eum."},"status":{"type":"string","description":"Campaign status","example":"Beatae quia qui excepturi minima."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5260218798443375074,"format":"int64"}},"example":{"brief_id":"Non quo necessitatibus.","campaign_name":"Exercitationem accusantium nihil.","etag":"Omnis doloremque at fugit dolor et.","id":"Quod sunt quae et nesciunt iure quis.","platform":"Molestiae est accusantium laudantium nostrum.","platform_campaign_id":"Dolores sit.","project_id":"Ut mollitia nihil ducimus.","status":"Quod alias ipsum voluptates pariatur magni.","version":2477378437106771259},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptatibus nihil nisi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Vitae illo consequuntur esse."},"id":{"type":"string","description":"Campaign UUID","example":"Hic ut sapiente harum aliquam sunt eum."},"platform":{"type":"string","description":"Channel","example":"Distinctio tempore qui velit omnis dolorem est."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quia recusandae dignissimos dolore harum totam."},"project_id":{"type":"string","description":"Owning project","example":"Eaque occaecati."},"status":{"type":"string","description":"Campaign status","example":"Libero recusandae ut ullam aliquam."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4964407865557967175,"format":"int64"}},"example":{"brief_id":"Sunt deleniti.","campaign_name":"Assumenda excepturi.","id":"Consequatur minus.","platform":"Natus quia labore non ut dolores et.","platform_campaign_id":"Voluptatem ipsa.","project_id":"Iste nemo.","status":"Tempora est eveniet sequi ea.","version":4255946399444764188},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Est et magni."},"campaign_name":{"type":"string","description":"Campaign name","example":"Repellendus eveniet veritatis impedit aut iste earum."},"id":{"type":"string","description":"Campaign UUID","example":"Consequatur possimus."},"platform":{"type":"string","description":"Channel","example":"Et provident illo non quisquam iure doloremque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Ut aliquid."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sit delectus veniam."},"status":{"type":"string","description":"Campaign status","example":"Quod exercitationem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5517772416028431681,"format":"int64"}},"example":{"brief_id":"Sunt quis odio enim nam id voluptatem.","campaign_name":"Neque quia.","id":"Saepe ab qui.","platform":"Vero alias temporibus illum.","platform_campaign_id":"Ullam eaque suscipit harum.","project_id":"Ab laboriosam sunt quis omnis.","status":"Et veniam itaque optio consequatur nulla sint.","version":6009088986580236396},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut ut odio odio sed minus quia."},"platforms":{"type":"array","items":{"type":"string","example":"Vero at ut quis."},"description":"Platforms to create campaigns on (binding selection)","example":["Aut fugit alias.","Qui maiores quia non unde deserunt.","Nihil sunt doloremque."]}},"example":{"config":"Modi voluptatum veniam molestiae quibusdam.","platforms":["Architecto autem iste.","In ipsa tempore incidunt velit provident perspiciatis.","Tempore sunt itaque omnis.","Ex sunt sit beatae."]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Sit cupiditate non."},"config":{"description":"Campaign configuration snapshot","example":"Eveniet esse officia explicabo dolor deserunt."},"status":{"type":"string","description":"Campaign status","example":"Modi possimus consequatur."}},"example":{"campaign_name":"Voluptatibus aspernatur.","config":"Hic vel ut.","status":"Accusamus nam cupiditate."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Minus autem."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Debitis eum ipsa sed.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Praesentium voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam ut sed natus et unde."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Accusamus in quod."},"project_id":{"type":"string","description":"Owning project","example":"Qui impedit temporibus eveniet eos omnis cumque."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1246943015343350087,"format":"int64"}},"example":{"account_id":"Ut quisquam nisi repellendus quos magnam.","etag":"Nihil quaerat asperiores pariatur.","has_credentials":true,"id":"Accusamus incidunt minus veritatis.","label":"Ex id corrupti sed quo perferendis.","login_customer_id":"Vel veritatis hic rerum accusamus velit error.","project_id":"Unde hic est quia pariatur odit ullam.","status":"active","version":4262114400172519549},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam eaque voluptatem omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem ut."},"label":{"type":"string","description":"Optional friendly name","example":"Qui mollitia et eum veniam."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Culpa sed minima iure."},"project_id":{"type":"string","description":"Owning project","example":"Ut recusandae modi."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2166778479612099571,"format":"int64"}},"example":{"account_id":"Soluta dolore vitae.","has_credentials":false,"id":"Enim occaecati beatae eveniet molestiae ad voluptatum.","label":"Quaerat et eius culpa magni illum consequatur.","login_customer_id":"Asperiores et maiores reiciendis laudantium dolor ipsam.","project_id":"Accusantium et.","status":"error","version":2560433690780116012},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maxime nesciunt repellendus."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium odit rerum commodi ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Magnam atque ullam qui rerum numquam quo."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem aut debitis vitae unde velit eos."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1674128305180380972,"format":"int64"}},"example":{"account_id":"Perferendis omnis ad voluptas esse.","has_credentials":false,"id":"A quia magnam culpa ipsam totam.","label":"Sequi aut veniam ratione.","login_customer_id":"Quidem quo et enim totam et.","project_id":"Quaerat molestias.","status":"inactive","version":7506513470866505325},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"In praesentium cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolorem sit."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas necessitatibus cumque non porro qui molestias."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptatum mollitia nulla perferendis possimus."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6176866709241070937,"format":"int64"}},"example":{"account_id":"Fuga atque.","has_credentials":true,"id":"Iure et.","label":"Qui omnis nesciunt qui consequuntur.","login_customer_id":"Odit provident sed quo aperiam.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"inactive","version":5760426389627270301},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Et vel beatae molestiae fuga."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Vitae consequatur eos."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Dolores quidem necessitatibus voluptatem consequatur sit."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Labore quia esse consectetur tenetur eum.","client_secret":"Aut ut sit nisi architecto.","developer_token":"Rerum et recusandae possimus quis.","refresh_token":"Sed corrupti sit."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor molestiae quia voluptatem deserunt libero."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Non illo ab in voluptatem minus est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas tenetur esse."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat ipsa voluptatem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Aut impedit a veritatis."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sed minima nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Consequuntur sed ea sunt debitis."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptas qui voluptas veniam sint voluptas."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1552956989772584247,"format":"int64"}},"example":{"account_id":"Ratione dicta.","brand_kit":"Deleniti reprehenderit saepe quas commodi qui qui.","has_credentials":true,"id":"Molestiae soluta vel ad et in voluptatem.","label":"Dolores qui.","portal_id":"Non qui ad cumque voluptas qui facere.","project_id":"Perspiciatis ea dolor.","sender_email":"Voluptatem saepe eligendi eum non.","sender_name":"Possimus totam occaecati enim eaque.","status":"inactive","version":8244843411375537375},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere iste."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Magni est officiis enim qui occaecati."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto recusandae voluptates excepturi reiciendis numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Aspernatur delectus rem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ad doloremque soluta et quam totam error."},"project_id":{"type":"string","description":"Owning project","example":"Amet dolorem qui eaque ut iste."},"sender_email":{"type":"string","description":"Default sender address","example":"Repudiandae voluptate est enim aut laborum."},"sender_name":{"type":"string","description":"Default sender name","example":"Non consequatur est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4558831950104085533,"format":"int64"}},"example":{"account_id":"Ut voluptatem velit eos aut est est.","brand_kit":"Autem aperiam quis.","has_credentials":false,"id":"Autem ullam.","label":"In eveniet explicabo voluptatem et quis totam.","portal_id":"Et molestiae blanditiis nihil dolor exercitationem.","project_id":"Quis sed consequatur velit atque nam.","sender_email":"Placeat dolores culpa sed.","sender_name":"Quae qui optio magni itaque iure.","status":"inactive","version":657346491219148846},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui dignissimos."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi vel aut rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim odit numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Beatae quis dignissimos voluptatem et labore sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ut unde dolore id."},"project_id":{"type":"string","description":"Owning project","example":"Placeat aut dolores at."},"sender_email":{"type":"string","description":"Default sender address","example":"Necessitatibus fuga ducimus dolorem ut aspernatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Ad optio magnam sequi esse."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3131513535227055982,"format":"int64"}},"example":{"account_id":"Dolor eum et consequatur.","brand_kit":"Iure odio at magnam saepe.","has_credentials":true,"id":"Ad minus vero assumenda cum nemo.","label":"Quae adipisci doloribus ullam.","portal_id":"Doloremque rerum sed consequatur dolor quia.","project_id":"Nobis assumenda aut dolorem ea veniam.","sender_email":"Vero dolorum incidunt.","sender_name":"Nihil deleniti dolores dignissimos perferendis tempore eum.","status":"error","version":3519661115667163110},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"platforms":{"type":"array","items":{"type":"string","example":"Odio praesentium perferendis eveniet sint voluptatibus quam."},"description":"Platforms this job will create on","example":["Consequuntur voluptatem est qui.","Quis iste eaque."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Debitis nam.","platforms":["Aut quia distinctio consequatur dolore dolor.","Consequatur voluptatem.","Sed reprehenderit provident."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fuga quos."},"job_id":{"type":"string","description":"Job UUID","example":"Sit qui aut aut."},"result":{"description":"Per-platform results, populated as each completes","example":"Quisquam et consequuntur ut sunt aliquam et."},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dicta libero iure culpa est possimus dolores.","job_id":"Minus officiis beatae sed aut quia.","result":"Quia qui fugiat est itaque est fugiat.","status":"queued"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex ipsa nihil esse voluptate in consectetur."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed voluptatum et impedit quod rem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia magni aut nisi est."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas dolorem necessitatibus illum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Omnis corrupti facere eum aliquid est repellat."},"project_id":{"type":"string","description":"Owning project","example":"Sint est sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2425775250383083650,"format":"int64"}},"example":{"account_id":"Quo nostrum quia.","etag":"Velit quis.","has_credentials":true,"id":"Esse sit id incidunt mollitia non sed.","label":"Perferendis culpa voluptatem nostrum eaque deleniti.","org_id":"Aliquam animi.","project_id":"Minima est distinctio accusamus.","status":"error","version":8954977623991310377},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus ut necessitatibus in."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aspernatur nihil et incidunt dolorem dolor sed."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem repellat expedita inventore."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Aliquam ratione ipsum reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Delectus harum voluptates sit est corporis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2355245747867951235,"format":"int64"}},"example":{"account_id":"Magnam voluptates molestiae libero autem quod.","has_credentials":true,"id":"Hic est odio.","label":"Esse mollitia et dolorum accusantium aspernatur quos.","org_id":"Dolores dolore id dolore sed.","project_id":"Occaecati rerum reiciendis.","status":"inactive","version":6928761352190945924},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","org_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","org_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Distinctio magnam."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Architecto deserunt vero ducimus distinctio.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quae qui inventore dolorem deserunt."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"In aut nam rerum."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Doloribus voluptas mollitia doloremque totam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos amet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eum expedita non voluptas sit voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Totam hic quibusdam eveniet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia doloremque commodi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Ab quasi tempora dolor."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8632050897094076248,"format":"int64"}},"example":{"account_id":"Molestias ducimus id.","app_id":"Laborum maiores est ea ducimus ipsum dolorem.","etag":"Et quia ex et alias ea.","has_credentials":true,"id":"Quia iusto maxime.","label":"Error sit nihil iure officiis nemo.","page_id":"Quas quis corporis.","project_id":"Illum accusamus debitis explicabo praesentium sint.","status":"deleted","version":6628357942141561962},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"app_id":{"type":"string","description":"Meta app ID","example":"In vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Error deleniti vitae molestiae qui nobis.","app_id":"Enim non asperiores velit aut.","has_credentials":false,"id":"Nobis qui sunt laboriosam ipsa.","label":"Autem eaque eaque dicta ut magni.","page_id":"Cumque quis accusantium.","project_id":"Et vel dolorum aut inventore consequatur.","status":"inactive","version":8399692053212789191},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit nihil enim sit."},"app_id":{"type":"string","description":"Meta app ID","example":"Non ipsam optio in ratione accusamus quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod minima."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dolores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Qui vitae iste."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum et et laudantium."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6379674624138849400,"format":"int64"}},"example":{"account_id":"Aut perspiciatis.","app_id":"Quibusdam ea nam aut.","has_credentials":true,"id":"Ipsam eligendi est dolore.","label":"Excepturi natus est est saepe doloribus unde.","page_id":"Sit totam ut et.","project_id":"Consequatur aut vero.","status":"active","version":6192957101395237768},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nihil at."},"app_id":{"type":"string","description":"Meta app ID","example":"Maxime eos deserunt quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolores earum."},"label":{"type":"string","description":"Optional friendly name","example":"Optio quia similique vero est impedit quo."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia tempore sit soluta quia."},"project_id":{"type":"string","description":"Owning project","example":"Est consequatur rerum neque velit nulla modi."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6683913012343616485,"format":"int64"}},"example":{"account_id":"Qui quas aut provident suscipit.","app_id":"Excepturi qui.","has_credentials":true,"id":"Sed velit distinctio.","label":"Veniam amet et quisquam voluptatem fuga.","page_id":"Molestiae id quae vero aut repellendus.","project_id":"Necessitatibus eos rerum.","status":"inactive","version":747656330949987636},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Consequatur hic voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto fugit non asperiores quidem natus."},"page_id":{"type":"string","description":"Facebook page ID","example":"Nostrum atque illum nesciunt adipisci odit corrupti."}},"example":{"account_id":"act_193556282970417","app_id":"Occaecati earum unde ut.","label":"Omnis quidem dolor ipsum voluptas.","page_id":"Occaecati id ea sunt dolorem necessitatibus neque."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Vel architecto quae error dolor placeat."},"app_secret":{"type":"string","description":"Meta app secret","example":"Minus et."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Fugiat aliquid aspernatur voluptatem in cupiditate.","app_secret":"Et dolorem quod."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos ex laborum et doloremque."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ab non sunt dolores quo est ratione."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repudiandae eum."},"label":{"type":"string","description":"Optional friendly name","example":"Quod amet itaque aut."},"project_id":{"type":"string","description":"Owning project","example":"Ut itaque voluptatem unde adipisci aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6109053107717412647,"format":"int64"}},"example":{"account_id":"Soluta beatae error enim velit voluptates officiis.","customer_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Totam dolorum quas quia quam voluptate.","label":"Aut numquam est accusantium ut vitae.","project_id":"Iste architecto voluptatem velit odio.","status":"error","version":7566507239259662295},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Officiis modi quae consequatur voluptatem et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sed dolorum cupiditate quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Dolorem ea et quidem quibusdam officiis.","customer_id":"Sed sint dolor eaque culpa quae.","has_credentials":true,"id":"Culpa veritatis ut adipisci minus.","label":"Incidunt deleniti.","project_id":"Vero eum ea perspiciatis rerum.","status":"deleted","version":1470629891228199804},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eveniet amet accusantium qui pariatur odio."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Et id sint suscipit quia ipsa voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Omnis id."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat dolores iure dolore voluptatem."},"project_id":{"type":"string","description":"Owning project","example":"Omnis aut mollitia pariatur."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1077022898145795137,"format":"int64"}},"example":{"account_id":"Sapiente perspiciatis dolores dignissimos soluta non vel.","customer_id":"Velit distinctio animi fugit provident rerum.","has_credentials":true,"id":"Non neque optio.","label":"Perspiciatis consequatur beatae sunt officiis sequi qui.","project_id":"Architecto molestiae cum.","status":"inactive","version":8699718175951963580},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Hic voluptatem ad similique sunt ratione."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Dicta et ratione impedit recusandae dolor."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Mollitia vel temporibus sunt nulla esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatem incidunt cum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vero ut et neque soluta distinctio voluptas."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Libero sapiente."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3465638753396319382,"format":"int64"}},"example":{"account_id":"Inventore ratione id vel iusto optio repellendus.","etag":"Quos rerum.","has_credentials":true,"id":"Occaecati quaerat eum quia a excepturi.","label":"Inventore aut molestiae voluptas hic.","project_id":"Ut possimus quidem eos culpa quaerat.","status":"active","version":2911200286629229215},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Cumque laborum ipsum accusantium voluptatem libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tenetur atque et et quia."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut tenetur ipsum ea ad."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6681602602405949516,"format":"int64"}},"example":{"account_id":"In iure molestiae quisquam.","has_credentials":false,"id":"Necessitatibus non eum ipsum eveniet quam.","label":"Accusamus eos neque velit.","project_id":"Aut amet aut voluptatum magnam.","status":"deleted","version":3936961167651696720},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi nostrum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam in et."},"label":{"type":"string","description":"Optional friendly name","example":"Illo ut ut ut."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem maiores ipsam dicta cum odit repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1189484283141975528,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","has_credentials":true,"id":"Debitis atque laboriosam unde facilis.","label":"Voluptatem optio.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati hic ut magnam facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Quo ullam."},"project_id":{"type":"string","description":"Owning project","example":"Ea voluptatum pariatur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4047597311733105158,"format":"int64"}},"example":{"account_id":"Perferendis et.","has_credentials":false,"id":"Sed error quisquam recusandae nesciunt et itaque.","label":"Quos qui quo et.","project_id":"A debitis ut ea.","status":"deleted","version":4664403850667403290},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem fugiat et."}},"example":{"account_id":"t2_gv9wtbfa","label":"Facere quas qui aut rerum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ab quo ullam ad."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quos et est placeat explicabo."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Rerum tenetur ut voluptatem quo."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Iste aut cum voluptatem qui et.","client_secret":"Aperiam facere voluptas quis nihil.","refresh_token":"Rem asperiores eligendi vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Earum id consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Possimus ipsam perspiciatis enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Molestiae itaque autem aliquam voluptatibus assumenda mollitia.","etag":"Nemo sint et consequatur vel quisquam libero.","funding_instrument_id":"Eum et sint possimus omnis dolorem.","has_credentials":false,"id":"Dolorum id ut molestias.","label":"Rerum non assumenda molestiae modi impedit.","project_id":"Adipisci ipsa.","status":"deleted","version":1754395146238114720},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Provident nostrum vel ut nulla et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Magnam dolor et aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod nihil quia id sed voluptas fuga."},"label":{"type":"string","description":"Optional friendly name","example":"Qui qui impedit assumenda voluptas cumque."},"project_id":{"type":"string","description":"Owning project","example":"Nulla temporibus recusandae consequatur nulla quam non."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7352010610499081653,"format":"int64"}},"example":{"account_id":"Ut et laborum.","funding_instrument_id":"Iusto reiciendis.","has_credentials":false,"id":"Magnam nemo cum delectus.","label":"Et voluptatem mollitia placeat aut laudantium.","project_id":"Minus est dolor.","status":"inactive","version":760324478171279387},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus quia facere vitae aperiam velit corrupti."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Deserunt minima quis impedit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut saepe beatae quasi temporibus in."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas doloremque nobis consectetur voluptas voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Provident corrupti ut similique."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8091372322961997197,"format":"int64"}},"example":{"account_id":"Saepe eius earum.","funding_instrument_id":"Est est molestias reprehenderit placeat.","has_credentials":false,"id":"In voluptate debitis earum voluptates repellat.","label":"Repellendus dolore expedita commodi sit omnis et.","project_id":"Aut et ut dolorem tempore.","status":"inactive","version":2286015844327380649},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed qui dolor illo facere ut voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Rerum maiores in alias est laboriosam saepe."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse odio dolorem similique sapiente ab."},"label":{"type":"string","description":"Optional friendly name","example":"Incidunt nam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Pariatur deserunt aut rem molestiae assumenda."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Quae et perspiciatis numquam.","funding_instrument_id":"Cupiditate provident molestiae quia neque atque delectus.","has_credentials":true,"id":"Perferendis placeat earum occaecati et.","label":"Assumenda quam possimus aut ipsa.","project_id":"Eaque magni omnis dolorem.","status":"error","version":413964225916483826},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Accusantium voluptas ratione dignissimos esse et labore."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus tempore rem quo."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Cumque perspiciatis quam.","label":"Iste numquam optio possimus velit."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Est magni odio aut omnis vel."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iure ducimus voluptatem."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nam sunt aut inventore impedit unde."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quia ab recusandae praesentium."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Magnam cum veritatis mollitia vel velit.","access_token_secret":"Eum perferendis qui qui soluta repudiandae quae.","consumer_key":"Ullam consequatur ut eveniet tempore est.","consumer_secret":"Iusto fugiat ad et."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index e05fa2db..dc766106 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -7,13 +7,13 @@ servers: - url: http://localhost:80 description: Default server for lfx-v2-campaign-service paths: - /projects/{project_id}/connection-google-ads: - delete: + /projects/{project_id}/briefs: + post: tags: - - lfx-v2-campaign-service-connections - summary: delete-google-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Google Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-google-ads + - lfx-v2-campaign-service-briefs + summary: create-brief lfx-v2-campaign-service-briefs + description: Create a brief. + operationId: lfx-v2-campaign-service-briefs#create-brief parameters: - name: project_id in: path @@ -24,9 +24,62 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateBriefRequestBody' + example: + brief: + copy: Mollitia molestiae saepe qui ex commodi. + event_details: Quia ut atque. + event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. + keywords: Expedita unde molestiae. + platforms: + - Vel nobis non molestias non. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + program_type: membership + targeting: Voluptas dolor et incidunt pariatur quod odit. + url: Nesciunt unde ullam occaecati maxime. responses: - "204": - description: No Content response. + "201": + description: Created response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Nisi est sint consequuntur omnis. + example: Neque sed alias. + content: + application/json: + schema: + $ref: '#/components/schemas/Brief2' + example: + event_slug: Nemo perspiciatis et qui aliquam doloremque itaque. + id: Voluptatem cupiditate voluptas aliquam facilis iste sed. + platforms: + - Tenetur quia totam magni. + - Repellat alias ex. + - Nihil quos quo eum. + - Iure praesentium ea quis. + program_type: Sed exercitationem ut totam ut minus. + project_id: Laboriosam tempore vero voluptatum a quos. + status: archived + url: Magni autem. + version: 9009752361610175063 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -36,6 +89,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -56,12 +118,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - get: + /projects/{project_id}/briefs/{brief_id}: + delete: tags: - - lfx-v2-campaign-service-connections - summary: get-google-ads lfx-v2-campaign-service-connections - description: Get the project's Google Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-google-ads + - lfx-v2-campaign-service-briefs + summary: delete-brief lfx-v2-campaign-service-briefs + description: Archive a brief (soft delete). + operationId: lfx-v2-campaign-service-briefs#delete-brief parameters: - name: project_id in: path @@ -72,30 +135,18 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Cum ipsum quo possimus. + example: Quam culpa. responses: - "200": - description: OK response. - headers: - ETag: - description: ETag header value (mirrors version) - schema: - type: string - description: ETag header value (mirrors version) - example: Inventore ratione id vel iusto optio repellendus. - example: Rerum eveniet nam sunt. - content: - application/json: - schema: - $ref: '#/components/schemas/GoogleAdsConnection3' - example: - account_id: Vitae qui. - has_credentials: true - id: Minima autem libero natus id esse. - label: Odit eum commodi autem expedita dolorem. - login_customer_id: In laborum vel. - project_id: Sed adipisci eveniet et aut. - status: active - version: 4120562596096857294 + "204": + description: No Content response. "404": description: 'NotFound: Resource not found' content: @@ -105,6 +156,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -125,12 +185,12 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - post: + get: tags: - - lfx-v2-campaign-service-connections - summary: create-google-ads lfx-v2-campaign-service-connections - description: Create the project's Google Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-google-ads + - lfx-v2-campaign-service-briefs + summary: get-brief lfx-v2-campaign-service-briefs + description: Get a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-brief parameters: - name: project_id in: path @@ -141,57 +201,54 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateGoogleAdsRequestBody' - example: - config: - account_id: "8666746580" - label: TLF Main - login_customer_id: "9746983954" - credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Id ducimus excepturi est et est. + example: Deleniti non in iure dolores et quis. responses: - "201": - description: Created response. + "200": + description: OK response. headers: ETag: description: ETag header value (mirrors version) schema: type: string description: ETag header value (mirrors version) - example: Occaecati quaerat eum quia a excepturi. - example: Inventore aut molestiae voluptas hic. + example: Recusandae similique assumenda ut quia. + example: Nam eius nulla suscipit ullam. content: application/json: schema: - $ref: '#/components/schemas/GoogleAdsConnection2' + $ref: '#/components/schemas/Brief3' example: - account_id: Corrupti reprehenderit et non totam perspiciatis. - has_credentials: false - id: Harum laborum est adipisci sint. - label: Ipsa ex. - login_customer_id: Perspiciatis voluptatibus architecto velit. - project_id: Est impedit et tempore provident. - status: error - version: 6280538112072962831 - "400": - description: 'BadRequest: Bad request' + event_slug: Provident itaque. + id: Ut est nobis aspernatur. + platforms: + - Cupiditate rerum magni incidunt. + - Est perspiciatis soluta voluptas est. + - Hic vero et. + - Ut ea alias. + program_type: Ea enim quidem odio et sequi consequatur. + project_id: Fugit qui tempora commodi reiciendis sit alias. + status: draft + url: Voluptas et accusamus quia et officiis ipsum. + version: 5012609352100951313 + "404": + description: 'NotFound: Resource not found' content: application/json: schema: - $ref: '#/components/schemas/BadRequestError' + $ref: '#/components/schemas/NotFoundError' example: - code: "400" - message: The request was invalid. + code: "404" + message: The connection was not found. "409": - description: 'Conflict: A connection already exists for this provider on the project' + description: 'Conflict: Conflict' content: application/json: schema: @@ -221,10 +278,10 @@ paths: - jwt_header_Authorization: [] put: tags: - - lfx-v2-campaign-service-connections - summary: update-google-ads lfx-v2-campaign-service-connections - description: Replace the Google Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-google-ads + - lfx-v2-campaign-service-briefs + summary: update-brief lfx-v2-campaign-service-briefs + description: Replace a brief (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-brief parameters: - name: project_id in: path @@ -235,6 +292,15 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Corrupti sint molestiae occaecati est. + example: Labore est ut ratione nobis ut occaecati. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -249,12 +315,20 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateGoogleAdsRequestBody' + $ref: '#/components/schemas/CreateBriefRequestBody' example: - config: - account_id: "8666746580" - label: TLF Main - login_customer_id: "9746983954" + brief: + copy: Mollitia molestiae saepe qui ex commodi. + event_details: Quia ut atque. + event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. + keywords: Expedita unde molestiae. + platforms: + - Vel nobis non molestias non. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + program_type: membership + targeting: Voluptas dolor et incidunt pariatur quod odit. + url: Nesciunt unde ullam occaecati maxime. responses: "200": description: OK response. @@ -264,21 +338,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Inventore impedit unde voluptatem quia ab recusandae. - example: Vel omnis iure. + example: Minima veritatis sed impedit laborum. + example: Totam non qui. content: application/json: schema: - $ref: '#/components/schemas/GoogleAdsConnection4' + $ref: '#/components/schemas/Brief4' example: - account_id: Ut commodi asperiores. - has_credentials: false - id: Dignissimos non ut sed. - label: Perferendis nam voluptatibus totam. - login_customer_id: Voluptatem similique. - project_id: Deleniti quam. - status: inactive - version: 2550395787104322115 + event_slug: Accusantium quaerat voluptatem iure vero quam consequatur. + id: Voluptas voluptatibus deleniti sit dolorum. + platforms: + - Ex eveniet soluta adipisci occaecati. + - Pariatur vero est quaerat id. + - Repudiandae veniam soluta alias natus aut. + program_type: Illo quaerat. + project_id: Quibusdam ut amet iusto provident sequi. + status: approved + url: Tempore voluptatibus quo. + version: 8063317454231389303 "400": description: 'BadRequest: Bad request' content: @@ -297,6 +374,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "412": description: 'PreconditionFailed: ETag mismatch' content: @@ -335,13 +421,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-google-ads/set-credential: + /projects/{project_id}/briefs/{brief_id}/approve: post: tags: - - lfx-v2-campaign-service-connections - summary: set-credential-google-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-google-ads + - lfx-v2-campaign-service-briefs + summary: approve-brief lfx-v2-campaign-service-briefs + description: Approve a brief for campaign creation. + operationId: lfx-v2-campaign-service-briefs#approve-brief parameters: - name: project_id in: path @@ -352,30 +438,41 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' - example: - credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Sed magnam sed vero nulla. + example: Vel et et iure tempora. responses: - "204": - description: No Content response. - "400": - description: 'BadRequest: Bad request' + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Voluptatum perspiciatis autem. + example: Sunt labore voluptate. content: application/json: schema: - $ref: '#/components/schemas/BadRequestError' + $ref: '#/components/schemas/Brief5' example: - code: "400" - message: The request was invalid. + event_slug: Officia et pariatur molestias autem ratione. + id: Et ratione sit. + platforms: + - Et quod porro. + - Minus illo rerum ut culpa totam sequi. + program_type: A omnis veritatis omnis. + project_id: Sed ipsum quia. + status: draft + url: Ut et veniam maiores. + version: 4401871562627166296 "404": description: 'NotFound: Resource not found' content: @@ -385,6 +482,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -405,13 +511,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-google-ads/test: + /projects/{project_id}/briefs/{brief_id}/campaigns: post: tags: - - lfx-v2-campaign-service-connections - summary: test-google-ads lfx-v2-campaign-service-connections - description: Verify the stored Google Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-google-ads + - lfx-v2-campaign-service-briefs + summary: create-campaigns lfx-v2-campaign-service-briefs + description: Create campaigns across the selected platforms (async -> job). + operationId: lfx-v2-campaign-service-briefs#create-campaigns parameters: - name: project_id in: path @@ -422,16 +528,52 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Cum ipsa molestias voluptatibus nam debitis hic. + example: Consequatur laborum. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateCampaignsRequestBody' + example: + input: + config: Eligendi earum qui est et id laudantium. + platforms: + - Ea magnam ut nihil quo tenetur. + - Fugiat natus. + - Et tempore. responses: - "200": - description: OK response. + "202": + description: Accepted response. content: application/json: schema: - $ref: '#/components/schemas/ConnectionTestResult' + $ref: '#/components/schemas/JobCreateResponse' example: - message: Deserunt ab itaque amet numquam. - ok: true + job_id: Tempora veritatis harum ab nobis fuga atque. + platforms: + - Laboriosam maxime facere culpa modi. + - Quod blanditiis et. + - Est dolorem eos amet dolorem sed. + - Architecto provident id quia porro. + status: queued + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -441,6 +583,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -461,13 +612,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-hubspot: - delete: + /projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}: + get: tags: - - lfx-v2-campaign-service-connections - summary: delete-hubspot lfx-v2-campaign-service-connections - description: Soft-delete the project's HubSpot connection. - operationId: lfx-v2-campaign-service-connections#delete-hubspot + - lfx-v2-campaign-service-briefs + summary: get-campaign lfx-v2-campaign-service-briefs + description: Get one campaign under a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-campaign parameters: - name: project_id in: path @@ -478,9 +629,249 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Beatae non et excepturi sit minus. + example: Et quisquam dicta. + - name: campaign_id + in: path + description: Campaign UUID + required: true + schema: + type: string + description: Campaign UUID + example: Eaque enim est libero enim quo. + example: Aut tempora dolorem neque assumenda sed. responses: - "204": - description: No Content response. + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Aspernatur ipsam consequatur qui illo totam fuga. + example: Qui non illum expedita commodi in dolores. + content: + application/json: + schema: + $ref: '#/components/schemas/Campaign2' + example: + brief_id: Id ducimus eius et laboriosam omnis vitae. + campaign_name: Labore iste voluptates quos. + id: Est voluptatum enim earum et doloribus. + platform: Voluptatem quas non voluptas ut. + platform_campaign_id: Modi rerum sint. + project_id: Ea consequatur et ut. + status: Dolorem dolor fugiat quia. + version: 5825706568637163425 + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-briefs + summary: update-campaign lfx-v2-campaign-service-briefs + description: Replace a campaign (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-campaign + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Similique eaque autem impedit tenetur voluptatibus. + example: Libero quia quam harum molestiae cupiditate. + - name: campaign_id + in: path + description: Campaign UUID + required: true + schema: + type: string + description: Campaign UUID + example: Et eum ex doloremque quia. + example: Adipisci vel. + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + allowEmptyValue: true + schema: + type: string + description: If-Match header carrying the current ETag/version + example: "3" + example: "3" + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCampaignRequestBody' + example: + campaign: + campaign_name: Hic voluptas debitis error. + config: Ut consectetur. + status: Veniam eum ut libero quibusdam debitis. + responses: + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Eum itaque. + example: Et iusto doloremque odio. + content: + application/json: + schema: + $ref: '#/components/schemas/Campaign3' + example: + brief_id: Harum distinctio reiciendis architecto atque maxime soluta. + campaign_name: Est ut ut alias ullam fugiat deserunt. + id: Accusantium sunt culpa libero quisquam. + platform: Ducimus porro maxime. + platform_campaign_id: Illo ipsam error similique quaerat. + project_id: Rerum amet aut tempora recusandae aspernatur. + status: Nihil iusto temporibus voluptas. + version: 6352110138661359662 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "412": + description: 'PreconditionFailed: ETag mismatch' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionFailedError' + example: + code: "412" + message: The supplied ETag does not match the current version. + "428": + description: 'PreconditionRequired: If-Match header required' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionRequiredError' + example: + code: "428" + message: An If-Match header is required. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-google-ads: + delete: + tags: + - lfx-v2-campaign-service-connections + summary: delete-google-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Google Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-google-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "204": + description: No Content response. "404": description: 'NotFound: Resource not found' content: @@ -513,9 +904,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-hubspot lfx-v2-campaign-service-connections - description: Get the project's HubSpot connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-hubspot + summary: get-google-ads lfx-v2-campaign-service-connections + description: Get the project's Google Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-google-ads parameters: - name: project_id in: path @@ -535,22 +926,19 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Necessitatibus quaerat minima a voluptatem ipsa et. - example: Pariatur perferendis explicabo expedita et velit accusamus. + example: Sapiente alias et error nobis minima. + example: Fuga maxime tempora rem. content: application/json: schema: - $ref: '#/components/schemas/HubspotConnection3' + $ref: '#/components/schemas/GoogleAdsConnection3' example: account_id: Perspiciatis saepe consequatur doloribus sequi et. - brand_kit: Distinctio vel. has_credentials: true id: Nulla ut laboriosam. label: Omnis suscipit corrupti reiciendis. - portal_id: Nihil quia omnis eaque aperiam eum. + login_customer_id: Nihil quia omnis eaque aperiam eum. project_id: Rerum delectus velit. - sender_email: Quam et voluptatibus illum dolorem. - sender_name: Eum dolorum. status: active version: 3995988906528985875 "404": @@ -585,9 +973,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-hubspot lfx-v2-campaign-service-connections - description: Create the project's HubSpot connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-hubspot + summary: create-google-ads lfx-v2-campaign-service-connections + description: Create the project's Google Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-google-ads parameters: - name: project_id in: path @@ -603,17 +991,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateHubspotRequestBody' + $ref: '#/components/schemas/CreateGoogleAdsRequestBody' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: "8666746580" + label: TLF Main + login_customer_id: "9746983954" credentials: - private_app_token: Numquam ut nesciunt voluptas. + client_id: Ex ea ullam corrupti. + client_secret: Et omnis accusantium. + developer_token: Iure modi asperiores ut. + refresh_token: Consectetur sint nesciunt. responses: "201": description: Created response. @@ -623,24 +1011,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sequi non et. - example: Quibusdam repellendus qui numquam. + example: Ratione est omnis voluptas praesentium. + example: Laboriosam et. content: application/json: schema: - $ref: '#/components/schemas/HubspotConnection2' + $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Voluptates iste autem veniam et enim unde. - brand_kit: Blanditiis quidem qui iusto sed. + account_id: Consequatur quos atque voluptates quo sit. has_credentials: false - id: Nesciunt necessitatibus ex ea ullam corrupti sunt. - label: Modi asperiores ut libero vel. - portal_id: Rem quia consequuntur ut. - project_id: Omnis accusantium ad. - sender_email: Consequatur quos atque voluptates quo sit. - sender_name: Dolor molestias ipsa dolorum est. + id: Autem veniam. + label: Quam sed rem quia consequuntur ut. + login_customer_id: Dolorum est aut blanditiis quidem qui. + project_id: Enim unde omnis. status: inactive - version: 1691702820919785934 + version: 8150234719088577779 "400": description: 'BadRequest: Bad request' content: @@ -682,9 +1067,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-hubspot lfx-v2-campaign-service-connections - description: Replace the HubSpot connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-hubspot + summary: update-google-ads lfx-v2-campaign-service-connections + description: Replace the Google Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-google-ads parameters: - name: project_id in: path @@ -709,15 +1094,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateHubspotRequestBody' + $ref: '#/components/schemas/UpdateGoogleAdsRequestBody' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: "8666746580" + label: TLF Main + login_customer_id: "9746983954" responses: "200": description: OK response. @@ -727,24 +1109,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Deleniti placeat rerum. - example: Recusandae totam soluta. + example: Earum debitis. + example: Occaecati quam nostrum quis. content: application/json: schema: - $ref: '#/components/schemas/HubspotConnection4' + $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Aut ratione sunt nostrum tenetur. - brand_kit: Ab laboriosam quis sapiente ut sit. + account_id: Ipsum quaerat delectus cupiditate sit et. has_credentials: true - id: Ipsum quaerat delectus cupiditate sit et. - label: Magni et rerum sed voluptatum. - portal_id: Fugit enim et sint consectetur ea minus. - project_id: Enim est occaecati sed non dolorem distinctio. - sender_email: Ut laborum nostrum veniam qui rerum. - sender_name: Eum fugit repudiandae magnam ut. - status: active - version: 2378889005955898844 + id: Eum dolorum. + label: Veniam velit sequi sit impedit dolorum voluptas. + login_customer_id: Sed non. + project_id: Distinctio vel. + status: error + version: 4111850562907897222 "400": description: 'BadRequest: Bad request' content: @@ -801,13 +1180,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-hubspot/set-credential: + /projects/{project_id}/connection-google-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-hubspot lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-hubspot + summary: set-credential-google-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-google-ads parameters: - name: project_id in: path @@ -823,10 +1202,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialHubspotRequestBody' + $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - private_app_token: Numquam ut nesciunt voluptas. + client_id: Ex ea ullam corrupti. + client_secret: Et omnis accusantium. + developer_token: Iure modi asperiores ut. + refresh_token: Consectetur sint nesciunt. responses: "204": description: No Content response. @@ -868,13 +1250,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-hubspot/test: + /projects/{project_id}/connection-google-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-hubspot lfx-v2-campaign-service-connections - description: Verify the stored HubSpot credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-hubspot + summary: test-google-ads lfx-v2-campaign-service-connections + description: Verify the stored Google Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-google-ads parameters: - name: project_id in: path @@ -893,7 +1275,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Tempora error rerum quae nihil. + message: Quibusdam magni et rerum sed voluptatum nesciunt. ok: false "404": description: 'NotFound: Resource not found' @@ -924,13 +1306,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-linkedin-ads: + /projects/{project_id}/connection-hubspot: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-linkedin-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's LinkedIn Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-linkedin-ads + summary: delete-hubspot lfx-v2-campaign-service-connections + description: Soft-delete the project's HubSpot connection. + operationId: lfx-v2-campaign-service-connections#delete-hubspot parameters: - name: project_id in: path @@ -976,9 +1358,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-linkedin-ads lfx-v2-campaign-service-connections - description: Get the project's LinkedIn Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-linkedin-ads + summary: get-hubspot lfx-v2-campaign-service-connections + description: Get the project's HubSpot connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-hubspot parameters: - name: project_id in: path @@ -998,21 +1380,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ea eum. - example: Repudiandae quae aut. + example: Commodi et nihil et. + example: Repellendus adipisci sit et enim quasi ut. content: application/json: schema: - $ref: '#/components/schemas/LinkedinAdsConnection3' + $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Quis repellat tenetur. + account_id: Non dolorum odit est. + brand_kit: Natus veritatis sint autem necessitatibus. has_credentials: false - id: Et quam veritatis consequatur sed. - label: Ipsum fuga deleniti consequatur. - org_id: Natus laudantium quisquam. - project_id: Tempora aut incidunt incidunt dolorem eaque et. - status: inactive - version: 2296210645404105233 + id: Tempore quo quae aut culpa impedit. + label: Aperiam dolorem molestias natus velit. + portal_id: Et magni adipisci magnam veniam. + project_id: Quibusdam nulla. + sender_email: Labore qui. + sender_name: Et corporis architecto dolorem sapiente repellendus. + status: deleted + version: 5377129987312416334 "404": description: 'NotFound: Resource not found' content: @@ -1045,9 +1430,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-linkedin-ads lfx-v2-campaign-service-connections - description: Create the project's LinkedIn Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-linkedin-ads + summary: create-hubspot lfx-v2-campaign-service-connections + description: Create the project's HubSpot connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-hubspot parameters: - name: project_id in: path @@ -1063,14 +1448,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateLinkedinAdsRequestBody' + $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: "538170226" - label: Fugit voluptatem. - org_id: "208777" + account_id: Sed omnis. + brand_kit: Sed maiores qui sed exercitationem quam. + label: Ut amet nostrum laborum minima ipsum. + portal_id: Aut id in. + sender_email: Et magnam cumque quasi magni ducimus. + sender_name: Suscipit sed minus soluta quasi. credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + private_app_token: Non sint praesentium quia. responses: "201": description: Created response. @@ -1080,21 +1468,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatem doloremque ullam consequatur ut. - example: Ipsa magnam cum veritatis mollitia vel. + example: Totam tempora quod expedita. + example: Dignissimos fugiat voluptatibus natus. content: application/json: schema: - $ref: '#/components/schemas/LinkedinAdsConnection2' + $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Totam quasi vero. + account_id: Consequuntur omnis a dignissimos voluptate. + brand_kit: Ab voluptatem esse. has_credentials: false - id: Eum quia molestiae. - label: Est quos. - org_id: Est est id repellat quod deleniti cupiditate. - project_id: Rerum delectus tempora culpa. - status: error - version: 2086671994798543080 + id: Doloremque architecto ea et. + label: Aliquid et in. + portal_id: Est iste. + project_id: Asperiores facere et exercitationem soluta possimus. + sender_email: Ad esse neque earum modi. + sender_name: Quis possimus placeat. + status: inactive + version: 3236501119949951161 "400": description: 'BadRequest: Bad request' content: @@ -1136,9 +1527,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-linkedin-ads lfx-v2-campaign-service-connections - description: Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-linkedin-ads + summary: update-hubspot lfx-v2-campaign-service-connections + description: Replace the HubSpot connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-hubspot parameters: - name: project_id in: path @@ -1163,12 +1554,15 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateLinkedinAdsRequestBody' + $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: "538170226" - label: Fugit voluptatem. - org_id: "208777" + account_id: Sed omnis. + brand_kit: Sed maiores qui sed exercitationem quam. + label: Ut amet nostrum laborum minima ipsum. + portal_id: Aut id in. + sender_email: Et magnam cumque quasi magni ducimus. + sender_name: Suscipit sed minus soluta quasi. responses: "200": description: OK response. @@ -1178,21 +1572,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempore rem quo fuga accusantium voluptas ratione. - example: Numquam optio possimus velit quod. + example: Voluptas ipsam iste. + example: Delectus libero necessitatibus quis. content: application/json: schema: - $ref: '#/components/schemas/LinkedinAdsConnection4' + $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Ipsa rerum odit et nostrum veritatis dolores. + account_id: Dolor id. + brand_kit: Ex id ut aut. has_credentials: false - id: Aut et voluptas ut officiis. - label: Debitis voluptatem quam occaecati. - org_id: Et tenetur sequi dolorum porro. - project_id: In autem tempore ut esse. - status: deleted - version: 7961829707957443728 + id: Modi velit vitae optio ut et consequuntur. + label: Debitis soluta sed quod dicta aperiam eveniet. + portal_id: Corrupti esse mollitia distinctio saepe rerum. + project_id: Libero autem ut. + sender_email: Eum et qui aut consequatur ut. + sender_name: Harum maxime voluptas expedita. + status: inactive + version: 5643656240528764613 "400": description: 'BadRequest: Bad request' content: @@ -1249,13 +1646,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-linkedin-ads/set-credential: + /projects/{project_id}/connection-hubspot/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-linkedin-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-linkedin-ads + summary: set-credential-hubspot lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-hubspot parameters: - name: project_id in: path @@ -1271,10 +1668,10 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' + $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + private_app_token: Non sint praesentium quia. responses: "204": description: No Content response. @@ -1316,13 +1713,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-linkedin-ads/test: + /projects/{project_id}/connection-hubspot/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-linkedin-ads lfx-v2-campaign-service-connections - description: Verify the stored LinkedIn Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-linkedin-ads + summary: test-hubspot lfx-v2-campaign-service-connections + description: Verify the stored HubSpot credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-hubspot parameters: - name: project_id in: path @@ -1341,8 +1738,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Dolorum voluptates placeat rerum. - ok: true + message: Similique ut minima. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1372,13 +1769,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-meta-ads: + /projects/{project_id}/connection-linkedin-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-meta-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Meta Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-meta-ads + summary: delete-linkedin-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's LinkedIn Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-linkedin-ads parameters: - name: project_id in: path @@ -1424,9 +1821,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-meta-ads lfx-v2-campaign-service-connections - description: Get the project's Meta Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-meta-ads + summary: get-linkedin-ads lfx-v2-campaign-service-connections + description: Get the project's LinkedIn Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-linkedin-ads parameters: - name: project_id in: path @@ -1446,22 +1843,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel necessitatibus vel voluptates tenetur veniam repellat. - example: Aut repudiandae voluptatibus odit autem. + example: Tempore vel quia cum. + example: Aut est et. content: application/json: schema: - $ref: '#/components/schemas/MetaAdsConnection3' + $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Voluptatem cupiditate voluptas aliquam facilis iste sed. - app_id: A sed exercitationem ut. - has_credentials: false - id: Expedita unde molestiae. - label: Velit ullam. - page_id: Voluptatum a. - project_id: Voluptas dolor et incidunt pariatur quod odit. - status: active - version: 6376430019451136769 + account_id: Magni voluptas odio assumenda totam. + has_credentials: true + id: Ipsam vitae aut voluptatem. + label: Iusto quis magni et velit. + org_id: Officiis deleniti ipsam nam. + project_id: Ab quam velit sapiente. + status: deleted + version: 6633489521806040497 "404": description: 'NotFound: Resource not found' content: @@ -1494,9 +1890,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-meta-ads lfx-v2-campaign-service-connections - description: Create the project's Meta Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-meta-ads + summary: create-linkedin-ads lfx-v2-campaign-service-connections + description: Create the project's LinkedIn Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-linkedin-ads parameters: - name: project_id in: path @@ -1512,16 +1908,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateMetaAdsRequestBody' + $ref: '#/components/schemas/CreateLinkedinAdsRequestBody' example: config: - account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + account_id: "538170226" + label: Ratione sunt nostrum tenetur repellendus dolorem cum. + org_id: "208777" credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Fugit enim et sint consectetur ea minus. responses: "201": description: Created response. @@ -1531,22 +1925,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Perspiciatis quam iste possimus ipsam. - example: Eveniet quia voluptatem impedit cumque doloribus. + example: Itaque quo. + example: Aperiam et ab. content: application/json: schema: - $ref: '#/components/schemas/MetaAdsConnection2' + $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Fuga ut expedita voluptatum sit. - app_id: Quia ut atque. + account_id: Quae nihil magni. has_credentials: true - id: Quis perspiciatis. - label: Similique vel nobis non molestias. - page_id: Velit et. - project_id: Nesciunt unde ullam occaecati maxime. - status: active - version: 8123871071866488705 + id: Eum fugit repudiandae magnam ut. + label: Aut tempora error. + org_id: Voluptatem repudiandae laudantium expedita ut. + project_id: Ab laboriosam quis sapiente ut sit. + status: error + version: 7519523340683479876 "400": description: 'BadRequest: Bad request' content: @@ -1588,9 +1981,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-meta-ads lfx-v2-campaign-service-connections - description: Replace the Meta Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-meta-ads + summary: update-linkedin-ads lfx-v2-campaign-service-connections + description: Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-linkedin-ads parameters: - name: project_id in: path @@ -1615,13 +2008,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateMetaAdsRequestBody' + $ref: '#/components/schemas/UpdateLinkedinAdsRequestBody' example: config: - account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + account_id: "538170226" + label: Ratione sunt nostrum tenetur repellendus dolorem cum. + org_id: "208777" responses: "200": description: OK response. @@ -1631,22 +2023,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dicta qui. - example: Voluptate dolorum id ut molestias id. + example: Debitis ea molestiae eum voluptatum. + example: Consequatur nemo molestiae modi ut non atque. content: application/json: schema: - $ref: '#/components/schemas/MetaAdsConnection4' + $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Quos quo eum dignissimos iure praesentium. - app_id: Voluptas ratione delectus ut adipisci. - has_credentials: false - id: Doloremque itaque eius magni autem. - label: Ex tempore. - page_id: Qui mollitia perferendis eveniet voluptas est et. - project_id: Ullam tenetur quia totam magni sunt repellat. + account_id: Ducimus sequi. + has_credentials: true + id: Et placeat. + label: Aut et. + org_id: Culpa voluptas quia tenetur. + project_id: Qui esse. status: inactive - version: 7772855560046758577 + version: 3277300697475451657 "400": description: 'BadRequest: Bad request' content: @@ -1703,13 +2094,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-meta-ads/set-credential: + /projects/{project_id}/connection-linkedin-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-meta-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-meta-ads + summary: set-credential-linkedin-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-linkedin-ads parameters: - name: project_id in: path @@ -1725,11 +2116,10 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' + $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Fugit enim et sint consectetur ea minus. responses: "204": description: No Content response. @@ -1771,13 +2161,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-meta-ads/test: + /projects/{project_id}/connection-linkedin-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-meta-ads lfx-v2-campaign-service-connections - description: Verify the stored Meta Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-meta-ads + summary: test-linkedin-ads lfx-v2-campaign-service-connections + description: Verify the stored LinkedIn Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-linkedin-ads parameters: - name: project_id in: path @@ -1796,7 +2186,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Aliquam animi unde. + message: Facere harum enim consequatur id voluptatem. ok: true "404": description: 'NotFound: Resource not found' @@ -1827,13 +2217,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-microsoft-ads: + /projects/{project_id}/connection-meta-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-microsoft-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Microsoft Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-microsoft-ads + summary: delete-meta-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Meta Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-meta-ads parameters: - name: project_id in: path @@ -1879,9 +2269,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-microsoft-ads lfx-v2-campaign-service-connections - description: Get the project's Microsoft Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-microsoft-ads + summary: get-meta-ads lfx-v2-campaign-service-connections + description: Get the project's Meta Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-meta-ads parameters: - name: project_id in: path @@ -1901,21 +2291,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Non eos. - example: Enim voluptatem inventore quasi. + example: Aperiam quia doloribus omnis. + example: Aut quia voluptates voluptates nisi. content: application/json: schema: - $ref: '#/components/schemas/MicrosoftAdsConnection3' + $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Optio dolorem omnis. - customer_id: Rerum adipisci minima quibusdam autem accusantium. - has_credentials: false - id: Veniam eum ut libero quibusdam debitis. - label: Commodi quam voluptates. - project_id: Ut consectetur. - status: deleted - version: 6203614951491514230 + account_id: Mollitia a magni vel consequatur ea deserunt. + app_id: Inventore aliquid voluptatibus iste mollitia. + has_credentials: true + id: Et corporis officia sint. + label: Ratione quis. + page_id: Occaecati eum tenetur. + project_id: Ut in possimus quia nulla. + status: error + version: 2122032566439088184 "404": description: 'NotFound: Resource not found' content: @@ -1948,9 +2339,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-microsoft-ads lfx-v2-campaign-service-connections - description: Create the project's Microsoft Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-microsoft-ads + summary: create-meta-ads lfx-v2-campaign-service-connections + description: Create the project's Meta Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-meta-ads parameters: - name: project_id in: path @@ -1966,17 +2357,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' + $ref: '#/components/schemas/CreateMetaAdsRequestBody' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: act_193556282970417 + app_id: Harum et minus voluptas. + label: Alias non sequi consequatur dolorum. + page_id: Voluptatem voluptas omnis est tempora ipsum aut. credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + access_token: Debitis labore aut. + app_secret: Porro ab id necessitatibus consequatur natus tempora. responses: "201": description: Created response. @@ -1986,21 +2376,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Delectus enim quas id porro. - example: Quo repudiandae. + example: Sed commodi voluptatibus. + example: Fuga facilis asperiores enim nisi consequatur perspiciatis. content: application/json: schema: - $ref: '#/components/schemas/MicrosoftAdsConnection2' + $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Exercitationem rerum iste ducimus. - customer_id: Quidem velit est explicabo est sed. - has_credentials: true - id: Modi rerum sint. - label: Dolorem dolor fugiat quia. - project_id: Labore iste voluptates quos. - status: inactive - version: 8271015532862321776 + account_id: Quo sint dolorum vel. + app_id: Dolores commodi aperiam voluptatibus. + has_credentials: false + id: Accusamus vero et voluptas accusamus sunt. + label: Vel blanditiis sunt ut facere. + page_id: Est non tenetur dolore. + project_id: Rerum cupiditate. + status: deleted + version: 8886302108378029553 "400": description: 'BadRequest: Bad request' content: @@ -2042,9 +2433,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-microsoft-ads lfx-v2-campaign-service-connections - description: Replace the Microsoft Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-microsoft-ads + summary: update-meta-ads lfx-v2-campaign-service-connections + description: Replace the Meta Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-meta-ads parameters: - name: project_id in: path @@ -2069,12 +2460,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' + $ref: '#/components/schemas/UpdateMetaAdsRequestBody' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: act_193556282970417 + app_id: Harum et minus voluptas. + label: Alias non sequi consequatur dolorum. + page_id: Voluptatem voluptas omnis est tempora ipsum aut. responses: "200": description: OK response. @@ -2084,21 +2476,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut omnis itaque ut vero voluptatibus. - example: Vero dolorem qui. + example: Aut molestias aut excepturi cumque. + example: Ut hic distinctio non recusandae et qui. content: application/json: schema: - $ref: '#/components/schemas/MicrosoftAdsConnection4' + $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Maxime fugiat illo. - customer_id: Minus est ut. + account_id: Eius voluptatem molestiae qui suscipit rerum. + app_id: Id facere maxime. has_credentials: false - id: Tempora recusandae. - label: Reiciendis architecto atque maxime soluta dolorem ducimus. - project_id: Itaque harum. - status: deleted - version: 6177609042943350629 + id: Saepe sit et sed qui dolorem reiciendis. + label: Asperiores ipsum quam. + page_id: Cum rem architecto vel quibusdam vel autem. + project_id: Id tenetur exercitationem aperiam incidunt. + status: error + version: 3981571209223840207 "400": description: 'BadRequest: Bad request' content: @@ -2155,13 +2548,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-microsoft-ads/set-credential: + /projects/{project_id}/connection-meta-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-microsoft-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-microsoft-ads + summary: set-credential-meta-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-meta-ads parameters: - name: project_id in: path @@ -2177,13 +2570,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' + $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + access_token: Debitis labore aut. + app_secret: Porro ab id necessitatibus consequatur natus tempora. responses: "204": description: No Content response. @@ -2225,13 +2616,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-microsoft-ads/test: + /projects/{project_id}/connection-meta-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-microsoft-ads lfx-v2-campaign-service-connections - description: Verify the stored Microsoft Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-microsoft-ads + summary: test-meta-ads lfx-v2-campaign-service-connections + description: Verify the stored Meta Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-meta-ads parameters: - name: project_id in: path @@ -2250,8 +2641,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ullam fugiat. - ok: true + message: Delectus et maxime ut possimus expedita qui. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2281,13 +2672,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-reddit-ads: + /projects/{project_id}/connection-microsoft-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-reddit-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Reddit Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-reddit-ads + summary: delete-microsoft-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Microsoft Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-microsoft-ads parameters: - name: project_id in: path @@ -2333,9 +2724,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-reddit-ads lfx-v2-campaign-service-connections - description: Get the project's Reddit Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-reddit-ads + summary: get-microsoft-ads lfx-v2-campaign-service-connections + description: Get the project's Microsoft Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-microsoft-ads parameters: - name: project_id in: path @@ -2355,20 +2746,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Autem aliquam voluptatibus assumenda mollitia molestias eos. - example: Fugit eum et sint possimus omnis. + example: Minima adipisci aut quia quisquam. + example: Magnam nihil qui doloremque nam magnam aliquid. content: application/json: schema: - $ref: '#/components/schemas/RedditAdsConnection3' + $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Amet iusto provident sequi est. + account_id: Possimus dolore. + customer_id: Vero quis consequuntur. has_credentials: true - id: Voluptas non accusantium. - label: Sit dolorum excepturi quibusdam. - project_id: Architecto consequatur enim magnam eius voluptas voluptatibus. + id: Autem aspernatur ea voluptatem. + label: Dicta rerum sed perferendis. + project_id: Voluptas eveniet assumenda accusantium aspernatur facere tempora. status: deleted - version: 1322493338651594921 + version: 5431490552370585468 "404": description: 'NotFound: Resource not found' content: @@ -2401,9 +2793,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-reddit-ads lfx-v2-campaign-service-connections - description: Create the project's Reddit Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-reddit-ads + summary: create-microsoft-ads lfx-v2-campaign-service-connections + description: Create the project's Microsoft Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-microsoft-ads parameters: - name: project_id in: path @@ -2419,15 +2811,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateRedditAdsRequestBody' + $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + account_id: Error laudantium. + customer_id: Similique odio adipisci dolore iste. + label: Non nostrum dolorum iure eaque animi. credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Error necessitatibus et autem doloribus est. + client_secret: Maxime labore illo maxime provident. + developer_token: Dignissimos necessitatibus consequuntur. + refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. responses: "201": description: Created response. @@ -2437,20 +2831,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ipsa aut. - example: Impedit vitae molestiae. + example: Natus pariatur et et sed debitis. + example: Necessitatibus reprehenderit illum. content: application/json: schema: - $ref: '#/components/schemas/RedditAdsConnection2' + $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Ut ea alias. - has_credentials: false - id: Explicabo cupiditate rerum. - label: Hic vero et. - project_id: Incidunt ipsum est perspiciatis soluta voluptas est. + account_id: Possimus nihil qui enim ratione voluptatem eos. + customer_id: Debitis itaque itaque dolores nihil. + has_credentials: true + id: Ipsum voluptatem et quam beatae laborum omnis. + label: Aut quis qui laudantium dolore. + project_id: Esse aut et rem suscipit similique. status: inactive - version: 347677279926224703 + version: 5244933818906460264 "400": description: 'BadRequest: Bad request' content: @@ -2492,9 +2887,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-reddit-ads lfx-v2-campaign-service-connections - description: Replace the Reddit Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-reddit-ads + summary: update-microsoft-ads lfx-v2-campaign-service-connections + description: Replace the Microsoft Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-microsoft-ads parameters: - name: project_id in: path @@ -2519,11 +2914,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateRedditAdsRequestBody' + $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + account_id: Error laudantium. + customer_id: Similique odio adipisci dolore iste. + label: Non nostrum dolorum iure eaque animi. responses: "200": description: OK response. @@ -2533,20 +2929,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Neque hic voluptatem ad similique sunt. - example: Ratione impedit recusandae dolor consequatur. + example: Possimus accusantium expedita alias. + example: Iusto molestiae cupiditate quis modi. content: application/json: schema: - $ref: '#/components/schemas/RedditAdsConnection4' + $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Saepe pariatur. + account_id: Est aut labore sint natus. + customer_id: Quas quibusdam. has_credentials: true - id: Vero quam. - label: Eveniet soluta adipisci. - project_id: Neque tempore voluptatibus quo quod nesciunt. - status: active - version: 779913646680513111 + id: Ut fugiat magnam quia. + label: Distinctio beatae. + project_id: Ut tempora consequuntur cumque repudiandae omnis ut. + status: deleted + version: 8986600307371048121 "400": description: 'BadRequest: Bad request' content: @@ -2603,13 +3000,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-reddit-ads/set-credential: + /projects/{project_id}/connection-microsoft-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-reddit-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-reddit-ads + summary: set-credential-microsoft-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-microsoft-ads parameters: - name: project_id in: path @@ -2625,12 +3022,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' + $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Error necessitatibus et autem doloribus est. + client_secret: Maxime labore illo maxime provident. + developer_token: Dignissimos necessitatibus consequuntur. + refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. responses: "204": description: No Content response. @@ -2672,13 +3070,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-reddit-ads/test: + /projects/{project_id}/connection-microsoft-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-reddit-ads lfx-v2-campaign-service-connections - description: Verify the stored Reddit Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-reddit-ads + summary: test-microsoft-ads lfx-v2-campaign-service-connections + description: Verify the stored Microsoft Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-microsoft-ads parameters: - name: project_id in: path @@ -2697,8 +3095,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Repudiandae veniam soluta alias natus aut. - ok: true + message: Harum iste voluptatem et voluptatem. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2728,13 +3126,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-twitter-ads: + /projects/{project_id}/connection-reddit-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-twitter-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's X/Twitter Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-twitter-ads + summary: delete-reddit-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Reddit Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-reddit-ads parameters: - name: project_id in: path @@ -2780,9 +3178,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-twitter-ads lfx-v2-campaign-service-connections - description: Get the project's X/Twitter Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-twitter-ads + summary: get-reddit-ads lfx-v2-campaign-service-connections + description: Get the project's Reddit Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-reddit-ads parameters: - name: project_id in: path @@ -2802,21 +3200,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Enim esse dolores. - example: Est perferendis eos et cumque nulla. + example: Et iste. + example: Odio eos earum fuga non est. content: application/json: schema: - $ref: '#/components/schemas/TwitterAdsConnection3' + $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Et tempore. - funding_instrument_id: Est et id laudantium magnam ratione. + account_id: Molestias architecto dicta quidem illo numquam. has_credentials: false - id: Ipsum deserunt ut. - label: Ut nihil quo tenetur doloribus fugiat natus. - project_id: Sed ea. + id: Explicabo vero commodi. + label: Minus ut est recusandae aspernatur eum fugit. + project_id: Qui asperiores velit enim tempore expedita. status: error - version: 6360932954176398686 + version: 3837864470732187499 "404": description: 'NotFound: Resource not found' content: @@ -2849,9 +3246,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-twitter-ads lfx-v2-campaign-service-connections - description: Create the project's X/Twitter Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-twitter-ads + summary: create-reddit-ads lfx-v2-campaign-service-connections + description: Create the project's Reddit Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-reddit-ads parameters: - name: project_id in: path @@ -2867,17 +3264,15 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateTwitterAdsRequestBody' + $ref: '#/components/schemas/CreateRedditAdsRequestBody' example: config: - account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + account_id: t2_gv9wtbfa + label: Aliquam consequuntur quo aliquid ducimus. credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + client_id: Facilis facilis aut suscipit aut odio iste. + client_secret: Deleniti earum magni quibusdam. + refresh_token: Tenetur velit quaerat aut. responses: "201": description: Created response. @@ -2887,21 +3282,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel temporibus sunt nulla esse sed. - example: Facere sed ea qui pariatur adipisci. + example: Exercitationem officia corrupti tempora ea. + example: Ipsa sint optio nobis quae corporis. content: application/json: schema: - $ref: '#/components/schemas/TwitterAdsConnection2' + $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Totam sequi. - funding_instrument_id: Labore ut iusto dolores. - has_credentials: false - id: Dolor ut. - label: Porro sed minus illo rerum ut. - project_id: Veniam maiores dolorum sit et. - status: active - version: 5887915076445143491 + account_id: Blanditiis atque rerum et officiis sapiente et. + has_credentials: true + id: Harum provident quia distinctio ea. + label: Hic et sed. + project_id: Rem harum provident provident quia laboriosam magnam. + status: deleted + version: 1429619977254656560 "400": description: 'BadRequest: Bad request' content: @@ -2943,9 +3337,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-twitter-ads lfx-v2-campaign-service-connections - description: Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-twitter-ads + summary: update-reddit-ads lfx-v2-campaign-service-connections + description: Replace the Reddit Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-reddit-ads parameters: - name: project_id in: path @@ -2970,12 +3364,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateTwitterAdsRequestBody' + $ref: '#/components/schemas/UpdateRedditAdsRequestBody' example: config: - account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + account_id: t2_gv9wtbfa + label: Aliquam consequuntur quo aliquid ducimus. responses: "200": description: OK response. @@ -2985,21 +3378,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Neque maiores quo aliquam in rem. - example: Voluptatem possimus veniam dignissimos consequatur. + example: Rerum reiciendis similique. + example: Saepe voluptatem dolores tempora qui. content: application/json: schema: - $ref: '#/components/schemas/TwitterAdsConnection4' + $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Est dolorem eos amet dolorem sed. - funding_instrument_id: Quia porro. - has_credentials: false - id: Ab nobis fuga atque inventore fugiat. - label: Quod blanditiis et. - project_id: Laboriosam maxime facere culpa modi. - status: error - version: 796228352115418506 + account_id: Expedita accusantium dolorum qui sed fugiat. + has_credentials: true + id: Sed fugiat. + label: Ipsam temporibus sint et necessitatibus dolorem ut. + project_id: Eos rerum. + status: deleted + version: 3554537496380374690 "400": description: 'BadRequest: Bad request' content: @@ -3056,13 +3448,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-twitter-ads/set-credential: + /projects/{project_id}/connection-reddit-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-twitter-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-twitter-ads + summary: set-credential-reddit-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-reddit-ads parameters: - name: project_id in: path @@ -3078,13 +3470,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' + $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + client_id: Facilis facilis aut suscipit aut odio iste. + client_secret: Deleniti earum magni quibusdam. + refresh_token: Tenetur velit quaerat aut. responses: "204": description: No Content response. @@ -3126,13 +3517,186 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-twitter-ads/test: + /projects/{project_id}/connection-reddit-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-twitter-ads lfx-v2-campaign-service-connections - description: Verify the stored X/Twitter Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-twitter-ads + summary: test-reddit-ads lfx-v2-campaign-service-connections + description: Verify the stored Reddit Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-reddit-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectionTestResult' + example: + message: Ullam temporibus. + ok: false + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-twitter-ads: + delete: + tags: + - lfx-v2-campaign-service-connections + summary: delete-twitter-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's X/Twitter Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "204": + description: No Content response. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + get: + tags: + - lfx-v2-campaign-service-connections + summary: get-twitter-ads lfx-v2-campaign-service-connections + description: Get the project's X/Twitter Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Repudiandae odit. + example: Temporibus ipsum necessitatibus ratione possimus. + content: + application/json: + schema: + $ref: '#/components/schemas/TwitterAdsConnection3' + example: + account_id: Non possimus quos voluptatem doloremque consequatur deleniti. + funding_instrument_id: Fuga illo dolorem sit ex commodi sapiente. + has_credentials: false + id: Ut eveniet iusto quidem. + label: Quaerat ut neque expedita nostrum. + project_id: Accusamus ratione consequuntur aut et corrupti. + status: error + version: 5145245548849296683 + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + post: + tags: + - lfx-v2-campaign-service-connections + summary: create-twitter-ads lfx-v2-campaign-service-connections + description: Create the project's X/Twitter Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-twitter-ads parameters: - name: project_id in: path @@ -3140,67 +3704,1021 @@ paths: required: true schema: type: string - description: Project UUID or slug that scopes the connection - example: cncf - example: cncf - responses: - "200": - description: OK response. - content: - application/json: - schema: - $ref: '#/components/schemas/ConnectionTestResult' - example: - message: Quo aliquid nobis. - ok: true - "404": - description: 'NotFound: Resource not found' - content: - application/json: - schema: - $ref: '#/components/schemas/NotFoundError' - example: - code: "404" - message: The connection was not found. - "500": - description: 'InternalServerError: Internal server error' - content: - application/json: - schema: - $ref: '#/components/schemas/InternalServerError' - example: - code: "500" - message: An internal server error occurred. - "503": - description: 'ServiceUnavailable: Service unavailable' - content: - application/json: - schema: - $ref: '#/components/schemas/ConnServiceUnavailableError' - example: - code: "503" - message: The service is unavailable. - security: - - jwt_header_Authorization: [] -components: - schemas: - BadRequestError: + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateTwitterAdsRequestBody' + example: + config: + account_id: 8r7gb + funding_instrument_id: Commodi architecto unde rerum quisquam ut. + label: Quo sit iusto laudantium voluptates neque. + credentials: + access_token: Amet et eaque. + access_token_secret: Consequatur iste sed illo adipisci sunt. + consumer_key: Neque ipsum nihil cumque repellendus. + consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + responses: + "201": + description: Created response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Vero voluptates soluta. + example: Eligendi consequatur officia labore eos. + content: + application/json: + schema: + $ref: '#/components/schemas/TwitterAdsConnection2' + example: + account_id: Beatae aliquam quia officiis hic ea. + funding_instrument_id: Debitis vitae quae debitis sunt. + has_credentials: true + id: Aperiam et ipsam vitae. + label: Voluptate nisi natus sint. + project_id: Velit est quis aliquid aliquam. + status: deleted + version: 1415133980301644723 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "409": + description: 'Conflict: A connection already exists for this provider on the project' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-connections + summary: update-twitter-ads lfx-v2-campaign-service-connections + description: Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + allowEmptyValue: true + schema: + type: string + description: If-Match header carrying the current ETag/version + example: "3" + example: "3" + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateTwitterAdsRequestBody' + example: + config: + account_id: 8r7gb + funding_instrument_id: Commodi architecto unde rerum quisquam ut. + label: Quo sit iusto laudantium voluptates neque. + responses: + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Facilis repellat eveniet reiciendis. + example: Non placeat. + content: + application/json: + schema: + $ref: '#/components/schemas/TwitterAdsConnection4' + example: + account_id: Ut sint. + funding_instrument_id: Rerum omnis veritatis. + has_credentials: false + id: Excepturi dolorem autem ipsa autem provident. + label: Quis et odio tenetur optio. + project_id: Iure quo culpa. + status: inactive + version: 36658389617783588 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "412": + description: 'PreconditionFailed: ETag mismatch' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionFailedError' + example: + code: "412" + message: The supplied ETag does not match the current version. + "428": + description: 'PreconditionRequired: If-Match header required' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionRequiredError' + example: + code: "428" + message: An If-Match header is required. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-twitter-ads/set-credential: + post: + tags: + - lfx-v2-campaign-service-connections + summary: set-credential-twitter-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' + example: + credentials: + access_token: Amet et eaque. + access_token_secret: Consequatur iste sed illo adipisci sunt. + consumer_key: Neque ipsum nihil cumque repellendus. + consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + responses: + "204": + description: No Content response. + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-twitter-ads/test: + post: + tags: + - lfx-v2-campaign-service-connections + summary: test-twitter-ads lfx-v2-campaign-service-connections + description: Verify the stored X/Twitter Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectionTestResult' + example: + message: Maxime incidunt asperiores. + ok: true + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/jobs/{job_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-job lfx-v2-campaign-service-briefs + description: Poll campaign-creation job status. + operationId: lfx-v2-campaign-service-briefs#get-job + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + - name: job_id + in: path + description: Job UUID + required: true + schema: + type: string + description: Job UUID + example: Ipsum expedita animi. + example: Velit at omnis autem. + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/JobPollResponse' + example: + error: Voluptas nam. + job_id: Nesciunt asperiores et est. + result: Facere sint totam sapiente vitae numquam ut. + status: partial + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] +components: + schemas: + BadRequestError: + type: object + properties: + code: + type: string + description: HTTP status code + example: "400" + message: + type: string + description: Error message + example: The request was invalid. + example: + code: "400" + message: The request was invalid. + required: + - code + - message + Brief: + type: object + properties: + etag: + type: string + description: ETag header value (mirrors version) + example: Quos expedita voluptas qui eaque. + event_slug: + type: string + description: Event/course slug + example: Deserunt labore et id aut et adipisci. + id: + type: string + description: Brief UUID + example: Et qui ut libero numquam. + platforms: + type: array + items: + type: string + example: Voluptates ut culpa saepe necessitatibus. + description: Suggested default platforms + example: + - Enim id voluptas aperiam distinctio. + - Harum eos eveniet ut. + program_type: + type: string + description: Funnel context + example: Esse voluptate eum laboriosam distinctio non. + project_id: + type: string + description: Owning project + example: Ullam facilis ab sapiente voluptatem. + status: + type: string + description: Lifecycle status + example: approved + enum: + - draft + - approved + - archived + url: + type: string + description: Event/course page URL + example: Ut molestiae. + version: + type: integer + description: Optimistic-concurrency version + example: 8483228206992747737 + format: int64 + example: + etag: Repudiandae necessitatibus dolorem enim beatae quia. + event_slug: Consequatur in vero soluta. + id: Laudantium nostrum ratione id eius laborum aspernatur. + platforms: + - Distinctio dolore velit pariatur. + - Assumenda perspiciatis dolor porro. + - Et cupiditate molestiae ea ullam minima voluptatem. + program_type: Molestiae suscipit non iusto. + project_id: Itaque fugit rerum cumque. + status: draft + url: Eius dicta. + version: 5990824706789002616 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief2: + type: object + properties: + event_slug: + type: string + description: Event/course slug + example: Nihil atque. + id: + type: string + description: Brief UUID + example: Et optio sed omnis aut voluptatem voluptas. + platforms: + type: array + items: + type: string + example: Vero ad ex consequatur dolore. + description: Suggested default platforms + example: + - Beatae eaque quo atque. + - Error eligendi incidunt accusamus excepturi inventore. + - Est ut voluptas quod. + - Dolor qui molestiae id aut. + program_type: + type: string + description: Funnel context + example: Et eum inventore quisquam. + project_id: + type: string + description: Owning project + example: Eum omnis est blanditiis maxime et. + status: + type: string + description: Lifecycle status + example: draft + enum: + - draft + - approved + - archived + url: + type: string + description: Event/course page URL + example: Nihil facilis sunt. + version: + type: integer + description: Optimistic-concurrency version + example: 7907674416929152715 + format: int64 + example: + event_slug: Tenetur non accusamus qui ex. + id: Dolore est dolorem quod enim pariatur. + platforms: + - Et amet sunt. + - Ad quae nisi. + program_type: Aut architecto aliquam mollitia labore sapiente. + project_id: Occaecati veritatis. + status: draft + url: Quia mollitia. + version: 7441335261794230827 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief3: + type: object + properties: + event_slug: + type: string + description: Event/course slug + example: Hic vel aspernatur at quam est ea. + id: + type: string + description: Brief UUID + example: Blanditiis cum et. + platforms: + type: array + items: + type: string + example: Necessitatibus sit. + description: Suggested default platforms + example: + - Aperiam deserunt nostrum consectetur. + - Sed praesentium libero blanditiis qui minima. + - Nulla sunt autem eos rerum provident dicta. + program_type: + type: string + description: Funnel context + example: Nemo nihil dolorum consequatur sed tempora qui. + project_id: + type: string + description: Owning project + example: Ipsum eius. + status: + type: string + description: Lifecycle status + example: archived + enum: + - draft + - approved + - archived + url: + type: string + description: Event/course page URL + example: Sit dignissimos incidunt voluptas. + version: + type: integer + description: Optimistic-concurrency version + example: 8003111466267168066 + format: int64 + example: + event_slug: Veritatis itaque. + id: Dolor dolores provident porro. + platforms: + - Harum et consequatur eligendi eum necessitatibus. + - Magnam ut. + - Voluptate voluptates corrupti sapiente. + - Dolorum repellat expedita ut recusandae dolor. + program_type: Dolores laborum sed. + project_id: Odio sunt esse mollitia incidunt. + status: approved + url: Est quis impedit. + version: 9059453485160266445 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief4: + type: object + properties: + event_slug: + type: string + description: Event/course slug + example: Impedit dolores. + id: + type: string + description: Brief UUID + example: Eos iste corporis praesentium. + platforms: + type: array + items: + type: string + example: At sint laborum veniam. + description: Suggested default platforms + example: + - Omnis doloribus. + - Cum ut quo. + - Necessitatibus id sint dicta assumenda omnis voluptatem. + - Praesentium voluptatem blanditiis non totam temporibus. + program_type: + type: string + description: Funnel context + example: Officia eligendi alias. + project_id: + type: string + description: Owning project + example: Quis veniam iusto consequatur quia. + status: + type: string + description: Lifecycle status + example: approved + enum: + - draft + - approved + - archived + url: + type: string + description: Event/course page URL + example: Alias minus reprehenderit dignissimos aut velit. + version: + type: integer + description: Optimistic-concurrency version + example: 8443584423631303721 + format: int64 + example: + event_slug: Velit quis harum recusandae est ipsum. + id: Aperiam saepe. + platforms: + - Totam voluptatem eos doloribus sint exercitationem eligendi. + - Quidem sit in quia molestiae perspiciatis alias. + program_type: Laborum est quasi dignissimos. + project_id: Aut animi sit esse ratione aliquid. + status: approved + url: Amet quaerat modi. + version: 3775655592825521439 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief5: + type: object + properties: + event_slug: + type: string + description: Event/course slug + example: Tempora voluptate fuga ea distinctio. + id: + type: string + description: Brief UUID + example: Molestiae praesentium minus. + platforms: + type: array + items: + type: string + example: Eaque nesciunt. + description: Suggested default platforms + example: + - Inventore in eligendi ipsam. + - Vel atque eos reiciendis sit minima non. + - Et itaque ut dolores in voluptas. + program_type: + type: string + description: Funnel context + example: Pariatur mollitia incidunt autem. + project_id: + type: string + description: Owning project + example: Et consequuntur suscipit. + status: + type: string + description: Lifecycle status + example: archived + enum: + - draft + - approved + - archived + url: + type: string + description: Event/course page URL + example: Mollitia aut tempore rerum. + version: + type: integer + description: Optimistic-concurrency version + example: 3896136867528920326 + format: int64 + example: + event_slug: Aut omnis labore et quis consequatur dolores. + id: Numquam molestias quibusdam aliquid deleniti. + platforms: + - Minima aut fugit eos et iure laudantium. + - Est molestiae voluptates ipsum neque sapiente aliquid. + - Velit sunt molestiae eius. + - Reprehenderit nobis hic eos magni. + program_type: Est natus sequi beatae. + project_id: Est aliquam debitis natus. + status: approved + url: Nostrum similique omnis iste. + version: 1280403017059047628 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + BriefInput: + type: object + properties: + copy: + description: Ad copy + example: Optio labore omnis. + event_details: + description: Extracted event/course details + example: Sunt omnis mollitia aut rerum quis et. + event_slug: + type: string + description: Event/course slug (unique within the project) + example: Amet enim non rem. + keywords: + description: Keyword list + example: Nihil aut rerum est vel. + platforms: + type: array + items: + type: string + example: Quos perferendis nisi blanditiis eveniet quasi ea. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) + example: + - Corporis dolorum consequatur eius perferendis. + - Omnis vel voluptate necessitatibus enim et et. + program_type: + type: string + description: Funnel context + example: membership + enum: + - events + - education + - membership + targeting: + description: Targeting recommendation + example: Rem ab corporis. + url: + type: string + description: Event/course page URL + example: Voluptas deserunt quod officiis. + example: + copy: Vitae vel omnis autem accusamus mollitia. + event_details: Corrupti voluptas. + event_slug: Dolorem repellendus porro et distinctio. + keywords: Assumenda aut harum eligendi rerum numquam amet. + platforms: + - Error aut maxime dicta qui. + - Quas suscipit eos nam ipsa. + - Velit et impedit facilis quaerat. + - Dolor ut velit quam omnis et dolor. + program_type: education + targeting: Rem quia vel ipsam dolores. + url: Aut assumenda fugiat quia eaque dolor porro. + required: + - program_type + - event_slug + Campaign: + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Et itaque rem eos et deleniti dolores. + campaign_name: + type: string + description: Campaign name + example: Enim vitae officia dolorem odio. + etag: + type: string + description: ETag header value (mirrors version) + example: Natus a. + id: + type: string + description: Campaign UUID + example: Beatae velit laudantium error eum et aut. + platform: + type: string + description: Channel + example: Facilis qui libero. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Facere qui omnis. + project_id: + type: string + description: Owning project + example: Beatae harum similique corporis id eum. + status: + type: string + description: Campaign status + example: Beatae quia qui excepturi minima. + version: + type: integer + description: Optimistic-concurrency version + example: 5260218798443375074 + format: int64 + example: + brief_id: Non quo necessitatibus. + campaign_name: Exercitationem accusantium nihil. + etag: Omnis doloremque at fugit dolor et. + id: Quod sunt quae et nesciunt iure quis. + platform: Molestiae est accusantium laudantium nostrum. + platform_campaign_id: Dolores sit. + project_id: Ut mollitia nihil ducimus. + status: Quod alias ipsum voluptates pariatur magni. + version: 2477378437106771259 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + Campaign2: + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Voluptatibus nihil nisi. + campaign_name: + type: string + description: Campaign name + example: Vitae illo consequuntur esse. + id: + type: string + description: Campaign UUID + example: Hic ut sapiente harum aliquam sunt eum. + platform: + type: string + description: Channel + example: Distinctio tempore qui velit omnis dolorem est. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Quia recusandae dignissimos dolore harum totam. + project_id: + type: string + description: Owning project + example: Eaque occaecati. + status: + type: string + description: Campaign status + example: Libero recusandae ut ullam aliquam. + version: + type: integer + description: Optimistic-concurrency version + example: 4964407865557967175 + format: int64 + example: + brief_id: Sunt deleniti. + campaign_name: Assumenda excepturi. + id: Consequatur minus. + platform: Natus quia labore non ut dolores et. + platform_campaign_id: Voluptatem ipsa. + project_id: Iste nemo. + status: Tempora est eveniet sequi ea. + version: 4255946399444764188 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + Campaign3: + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Est et magni. + campaign_name: + type: string + description: Campaign name + example: Repellendus eveniet veritatis impedit aut iste earum. + id: + type: string + description: Campaign UUID + example: Consequatur possimus. + platform: + type: string + description: Channel + example: Et provident illo non quisquam iure doloremque. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Ut aliquid. + project_id: + type: string + description: Owning project + example: Assumenda sit delectus veniam. + status: + type: string + description: Campaign status + example: Quod exercitationem. + version: + type: integer + description: Optimistic-concurrency version + example: 5517772416028431681 + format: int64 + example: + brief_id: Sunt quis odio enim nam id voluptatem. + campaign_name: Neque quia. + id: Saepe ab qui. + platform: Vero alias temporibus illum. + platform_campaign_id: Ullam eaque suscipit harum. + project_id: Ab laboriosam sunt quis omnis. + status: Et veniam itaque optio consequatur nulla sint. + version: 6009088986580236396 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + CampaignCreateInput: type: object properties: - code: + config: + description: Per-platform campaign configuration + example: Ut ut odio odio sed minus quia. + platforms: + type: array + items: + type: string + example: Vero at ut quis. + description: Platforms to create campaigns on (binding selection) + example: + - Aut fugit alias. + - Qui maiores quia non unde deserunt. + - Nihil sunt doloremque. + example: + config: Modi voluptatum veniam molestiae quibusdam. + platforms: + - Architecto autem iste. + - In ipsa tempore incidunt velit provident perspiciatis. + - Tempore sunt itaque omnis. + - Ex sunt sit beatae. + required: + - platforms + CampaignUpdateInput: + type: object + properties: + campaign_name: type: string - description: HTTP status code - example: "400" - message: + description: Campaign name + example: Sit cupiditate non. + config: + description: Campaign configuration snapshot + example: Eveniet esse officia explicabo dolor deserunt. + status: type: string - description: Error message - example: The request was invalid. + description: Campaign status + example: Modi possimus consequatur. example: - code: "400" - message: The request was invalid. + campaign_name: Voluptatibus aspernatur. + config: Hic vel ut. + status: Accusamus nam cupiditate. required: - - code - - message + - campaign_name + - status ConflictError: type: object properties: @@ -3241,16 +4759,50 @@ components: message: type: string description: Human-readable detail - example: Rerum sunt eum et qui. + example: Minus autem. ok: type: boolean description: Whether the credential authenticated against the provider - example: true + example: false example: - message: Ut quia harum. - ok: false + message: Debitis eum ipsa sed. + ok: true required: - ok + CreateBriefRequestBody: + type: object + properties: + brief: + $ref: '#/components/schemas/BriefInput' + example: + brief: + copy: Mollitia molestiae saepe qui ex commodi. + event_details: Quia ut atque. + event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. + keywords: Expedita unde molestiae. + platforms: + - Vel nobis non molestias non. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + program_type: membership + targeting: Voluptas dolor et incidunt pariatur quod odit. + url: Nesciunt unde ullam occaecati maxime. + required: + - brief + CreateCampaignsRequestBody: + type: object + properties: + input: + $ref: '#/components/schemas/CampaignCreateInput' + example: + input: + config: Eligendi earum qui est et id laudantium. + platforms: + - Ea magnam ut nihil quo tenetur. + - Fugiat natus. + - Et tempore. + required: + - input CreateGoogleAdsRequestBody: type: object properties: @@ -3264,10 +4816,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ex ea ullam corrupti. + client_secret: Et omnis accusantium. + developer_token: Iure modi asperiores ut. + refresh_token: Consectetur sint nesciunt. required: - config - credentials @@ -3280,14 +4832,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Sed omnis. + brand_kit: Sed maiores qui sed exercitationem quam. + label: Ut amet nostrum laborum minima ipsum. + portal_id: Aut id in. + sender_email: Et magnam cumque quasi magni ducimus. + sender_name: Suscipit sed minus soluta quasi. credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Non sint praesentium quia. required: - config - credentials @@ -3301,10 +4853,10 @@ components: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Ratione sunt nostrum tenetur repellendus dolorem cum. org_id: "208777" credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Fugit enim et sint consectetur ea minus. required: - config - credentials @@ -3318,12 +4870,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Harum et minus voluptas. + label: Alias non sequi consequatur dolorum. + page_id: Voluptatem voluptas omnis est tempora ipsum aut. credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Debitis labore aut. + app_secret: Porro ab id necessitatibus consequatur natus tempora. required: - config - credentials @@ -3336,14 +4888,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Error laudantium. + customer_id: Similique odio adipisci dolore iste. + label: Non nostrum dolorum iure eaque animi. credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + client_id: Error necessitatibus et autem doloribus est. + client_secret: Maxime labore illo maxime provident. + developer_token: Dignissimos necessitatibus consequuntur. + refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. required: - config - credentials @@ -3357,11 +4909,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Aliquam consequuntur quo aliquid ducimus. credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Facilis facilis aut suscipit aut odio iste. + client_secret: Deleniti earum magni quibusdam. + refresh_token: Tenetur velit quaerat aut. required: - config - credentials @@ -3375,13 +4927,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Commodi architecto unde rerum quisquam ut. + label: Quo sit iusto laudantium voluptates neque. credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Amet et eaque. + access_token_secret: Consequatur iste sed illo adipisci sunt. + consumer_key: Neque ipsum nihil cumque repellendus. + consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. required: - config - credentials @@ -3391,31 +4943,31 @@ components: account_id: type: string description: Provider account identifier - example: Voluptatem sed quia excepturi. + example: Explicabo repudiandae aut reiciendis recusandae molestias. etag: type: string description: ETag header value (mirrors version) - example: Voluptas ullam dolores rem. + example: Aut non. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Labore laudantium. + example: Praesentium voluptate. label: type: string description: Optional friendly name - example: Eos voluptatibus. + example: Ipsam ut sed natus et unde. login_customer_id: type: string description: Manager account used for API access - example: Officia quidem non qui voluptates natus cum. + example: Accusamus in quod. project_id: type: string description: Owning project - example: Facilis reiciendis dignissimos consequatur iste qui minima. + example: Qui impedit temporibus eveniet eos omnis cumque. status: type: string description: Connection status @@ -3428,18 +4980,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1885605882290356239 + example: 1246943015343350087 format: int64 example: - account_id: Iusto velit quo voluptatibus modi reiciendis aliquam. - etag: Sunt recusandae similique. - has_credentials: false - id: Autem recusandae totam. - label: Odit necessitatibus veritatis amet ut rerum quidem. - login_customer_id: Iusto quia. - project_id: Rerum nisi. - status: error - version: 4043658872882310311 + account_id: Ut quisquam nisi repellendus quos magnam. + etag: Nihil quaerat asperiores pariatur. + has_credentials: true + id: Accusamus incidunt minus veritatis. + label: Ex id corrupti sed quo perferendis. + login_customer_id: Vel veritatis hic rerum accusamus velit error. + project_id: Unde hic est quia pariatur odit ullam. + status: active + version: 4262114400172519549 required: - id - project_id @@ -3454,7 +5006,7 @@ components: account_id: type: string description: Provider account identifier - example: Error ipsam maiores et maiores laudantium aut. + example: Aliquam eaque voluptatem omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3462,23 +5014,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aliquid harum quis. + example: Voluptatem ut. label: type: string description: Optional friendly name - example: Mollitia odio et dolor et consectetur. + example: Qui mollitia et eum veniam. login_customer_id: type: string description: Manager account used for API access - example: Sint inventore iste iure ut. + example: Culpa sed minima iure. project_id: type: string description: Owning project - example: Rerum eaque eius est rerum. + example: Ut recusandae modi. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -3487,17 +5039,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1681601347963415661 + example: 2166778479612099571 format: int64 example: - account_id: Ipsa et dolore. - has_credentials: true - id: Facilis suscipit. - label: Ad inventore voluptatum eligendi quasi. - login_customer_id: Placeat unde distinctio ducimus qui. - project_id: Porro voluptate. - status: inactive - version: 1820304569870851201 + account_id: Soluta dolore vitae. + has_credentials: false + id: Enim occaecati beatae eveniet molestiae ad voluptatum. + label: Quaerat et eius culpa magni illum consequatur. + login_customer_id: Asperiores et maiores reiciendis laudantium dolor ipsam. + project_id: Accusantium et. + status: error + version: 2560433690780116012 required: - id - project_id @@ -3511,27 +5063,27 @@ components: account_id: type: string description: Provider account identifier - example: Nihil corrupti repellat eius. + example: Consequatur et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Dignissimos non sed omnis officiis et. + example: Maxime nesciunt repellendus. label: type: string description: Optional friendly name - example: Magni repudiandae. + example: Accusantium odit rerum commodi ea. login_customer_id: type: string description: Manager account used for API access - example: Delectus quam et eos. + example: Magnam atque ullam qui rerum numquam quo. project_id: type: string description: Owning project - example: Laboriosam qui id enim. + example: Voluptatem aut debitis vitae unde velit eos. status: type: string description: Connection status @@ -3544,17 +5096,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8134511901185890068 + example: 1674128305180380972 format: int64 example: - account_id: Illo vitae occaecati omnis. + account_id: Perferendis omnis ad voluptas esse. has_credentials: false - id: Rem aut fuga. - label: Cupiditate ut illo dolor quaerat totam. - login_customer_id: Explicabo possimus consequatur. - project_id: Est dolor ut corporis. - status: active - version: 299946558233755685 + id: A quia magnam culpa ipsam totam. + label: Sequi aut veniam ratione. + login_customer_id: Quidem quo et enim totam et. + project_id: Quaerat molestias. + status: inactive + version: 7506513470866505325 required: - id - project_id @@ -3568,31 +5120,31 @@ components: account_id: type: string description: Provider account identifier - example: A necessitatibus molestiae. + example: In praesentium cumque. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quos hic doloribus. + example: Dolorem sit. label: type: string description: Optional friendly name - example: Eum et sint corrupti eos. + example: Voluptas necessitatibus cumque non porro qui molestias. login_customer_id: type: string description: Manager account used for API access - example: Dolorem qui explicabo consequuntur repellat non suscipit. + example: Voluptatum mollitia nulla perferendis possimus. project_id: type: string description: Owning project - example: Neque autem ex eos. + example: Tempora qui. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -3601,17 +5153,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7747776820204091337 + example: 6176866709241070937 format: int64 example: - account_id: Sit est dolores est et. - has_credentials: false - id: Sit tempore. - label: Ut quo iure. - login_customer_id: Velit atque laudantium ullam rerum. - project_id: Magnam ut similique ea minima magnam. - status: deleted - version: 7309957715046801903 + account_id: Fuga atque. + has_credentials: true + id: Iure et. + label: Qui omnis nesciunt qui consequuntur. + login_customer_id: Odit provident sed quo aperiam. + project_id: Ea quidem ducimus tempora ea molestias. + status: inactive + version: 5760426389627270301 required: - id - project_id @@ -3646,25 +5198,25 @@ components: client_id: type: string description: OAuth client id - example: Ut aut. + example: Et vel beatae molestiae fuga. client_secret: type: string description: OAuth client secret - example: Sit similique ut minima ut. + example: Vitae consequatur eos. developer_token: type: string description: Google Ads developer token - example: Voluptatum officia quod error amet quia inventore. + example: Aut ut. refresh_token: type: string description: OAuth refresh token - example: Voluptas expedita omnis ex. + example: Dolores quidem necessitatibus voluptatem consequatur sit. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Non ut voluptas et accusamus natus id. - client_secret: Et officia sequi et quam. - developer_token: Vero quisquam. - refresh_token: Quia enim illo et eligendi. + client_id: Labore quia esse consectetur tenetur eum. + client_secret: Aut ut sit nisi architecto. + developer_token: Rerum et recusandae possimus quis. + refresh_token: Sed corrupti sit. required: - refresh_token - client_id @@ -3676,47 +5228,47 @@ components: account_id: type: string description: Provider account identifier - example: Delectus voluptatem iste nisi in. + example: Quia omnis commodi aspernatur pariatur nostrum. brand_kit: type: string description: Per-project brand kit selector - example: Nostrum corporis quasi magnam. + example: Quia omnis in qui. etag: type: string description: ETag header value (mirrors version) - example: Dolor occaecati earum iusto rerum sit cupiditate. + example: Perferendis est ipsum aut voluptas molestias. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Nam quia aperiam sunt est. + example: Dolor ea iusto eveniet velit sint odit. label: type: string description: Optional friendly name - example: Natus expedita aspernatur consequuntur quod ducimus molestias. + example: Quis quae quam enim. portal_id: type: string description: HubSpot portal/account ID - example: Iste qui rerum est sed sed similique. + example: Fuga voluptas ut vero autem consequuntur. project_id: type: string description: Owning project - example: Libero ut est rerum est occaecati et. + example: Ipsa eos nemo cupiditate et esse voluptate. sender_email: type: string description: Default sender address - example: Ea maiores quidem molestiae deleniti omnis. + example: Omnis a pariatur omnis. sender_name: type: string description: Default sender name - example: Expedita voluptatum commodi fuga ipsa. + example: Velit dolorem. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -3725,21 +5277,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3681253484013323435 + example: 1005353535355254376 format: int64 example: - account_id: Neque facilis est qui possimus eligendi. - brand_kit: Voluptas eius error autem est est distinctio. - etag: Et nobis voluptas dignissimos exercitationem illum. + account_id: Veniam molestias. + brand_kit: Hic magni. + etag: Commodi recusandae. has_credentials: false - id: Qui quidem exercitationem. - label: Sed numquam necessitatibus laudantium est ut. - portal_id: Quisquam ex est facilis qui ducimus. - project_id: Ipsa quo vel architecto quas eligendi impedit. - sender_email: Ut culpa excepturi. - sender_name: Officiis quia quisquam corrupti. - status: inactive - version: 8080806383587730069 + id: Nihil ut. + label: Minus voluptatem ab delectus porro. + portal_id: Cumque rerum. + project_id: Mollitia nulla. + sender_email: Modi esse voluptatibus. + sender_name: Fugit dolorum nulla quo veritatis id. + status: error + version: 3871826656092488452 required: - id - project_id @@ -3754,43 +5306,43 @@ components: account_id: type: string description: Provider account identifier - example: Magni omnis. + example: Dolor molestiae quia voluptatem deserunt libero. brand_kit: type: string description: Per-project brand kit selector - example: Perferendis culpa voluptatem nostrum eaque deleniti. + example: Non illo ab in voluptatem minus est. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Esse voluptate. + example: Voluptas tenetur esse. label: type: string description: Optional friendly name - example: Voluptatum et impedit quod. + example: Quaerat ipsa voluptatem. portal_id: type: string description: HubSpot portal/account ID - example: Est repellat. + example: Aut impedit a veritatis. project_id: type: string description: Owning project - example: Consectetur et culpa quaerat vel. + example: Assumenda sed minima nihil. sender_email: type: string description: Default sender address - example: Esse sit id incidunt mollitia non sed. + example: Consequuntur sed ea sunt debitis. sender_name: type: string description: Default sender name - example: Minima est distinctio accusamus. + example: Voluptas qui voluptas veniam sint voluptas. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -3799,20 +5351,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7333781901734102627 + example: 1552956989772584247 format: int64 example: - account_id: Aliquam animi. - brand_kit: Eos iusto fugit. + account_id: Ratione dicta. + brand_kit: Deleniti reprehenderit saepe quas commodi qui qui. has_credentials: true - id: Quo nostrum quia. - label: Velit quis. - portal_id: Error dolor placeat et. - project_id: Ut nobis. - sender_email: Et esse fugiat aliquid aspernatur voluptatem in. - sender_name: Consequatur et dolorem. - status: error - version: 2888074467672743464 + id: Molestiae soluta vel ad et in voluptatem. + label: Dolores qui. + portal_id: Non qui ad cumque voluptas qui facere. + project_id: Perspiciatis ea dolor. + sender_email: Voluptatem saepe eligendi eum non. + sender_name: Possimus totam occaecati enim eaque. + status: inactive + version: 8244843411375537375 required: - id - project_id @@ -3826,11 +5378,11 @@ components: account_id: type: string description: Provider account identifier - example: Voluptas omnis quidem dolor ipsum voluptas sed. + example: Facere iste. brand_kit: type: string description: Per-project brand kit selector - example: Tempora dolor quis totam hic quibusdam eveniet. + example: Magni est officiis enim qui occaecati. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3838,27 +5390,27 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Asperiores quidem. + example: Architecto recusandae voluptates excepturi reiciendis numquam. label: type: string description: Optional friendly name - example: Nesciunt adipisci odit corrupti laudantium consequatur hic. + example: Aspernatur delectus rem. portal_id: type: string description: HubSpot portal/account ID - example: Dolorem necessitatibus neque consectetur occaecati earum. + example: Ad doloremque soluta et quam totam error. project_id: type: string description: Owning project - example: Est nostrum atque. + example: Amet dolorem qui eaque ut iste. sender_email: type: string description: Default sender address - example: Ut sint non eum expedita non. + example: Repudiandae voluptate est enim aut laborum. sender_name: type: string description: Default sender name - example: Sit voluptatem ad ab. + example: Non consequatur est et. status: type: string description: Connection status @@ -3871,20 +5423,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3980984224261423037 + example: 4558831950104085533 format: int64 example: - account_id: Quidem omnis totam eos non molestias. - brand_kit: Ducimus id sint eius aut. + account_id: Ut voluptatem velit eos aut est est. + brand_kit: Autem aperiam quis. has_credentials: false - id: Doloribus voluptas mollitia doloremque totam. - label: Quia doloremque commodi rerum. - portal_id: Recusandae illum accusamus debitis. - project_id: Veniam et ducimus quos amet. - sender_email: Praesentium sint laudantium error. - sender_name: Nihil iure officiis nemo quia. + id: Autem ullam. + label: In eveniet explicabo voluptatem et quis totam. + portal_id: Et molestiae blanditiis nihil dolor exercitationem. + project_id: Quis sed consequatur velit atque nam. + sender_email: Placeat dolores culpa sed. + sender_name: Quae qui optio magni itaque iure. status: inactive - version: 6150421422111226538 + version: 657346491219148846 required: - id - project_id @@ -3898,43 +5450,43 @@ components: account_id: type: string description: Provider account identifier - example: Ab quo ullam ad. + example: Qui dignissimos. brand_kit: type: string description: Per-project brand kit selector - example: Aperiam facere voluptas quis nihil. + example: Modi vel aut rerum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Et quia ex et alias ea. + example: Enim odit numquam. label: type: string description: Optional friendly name - example: Laborum maiores est ea ducimus ipsum dolorem. + example: Beatae quis dignissimos voluptatem et labore sit. portal_id: type: string description: HubSpot portal/account ID - example: Placeat explicabo. + example: Ut unde dolore id. project_id: type: string description: Owning project - example: Quas quis corporis. + example: Placeat aut dolores at. sender_email: type: string description: Default sender address - example: Rerum tenetur ut voluptatem quo. + example: Necessitatibus fuga ducimus dolorem ut aspernatur. sender_name: type: string description: Default sender name - example: Iste aut cum voluptatem qui et. + example: Ad optio magnam sequi esse. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -3943,20 +5495,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3448886829732168782 + example: 3131513535227055982 format: int64 example: - account_id: Vero ut et neque soluta distinctio voluptas. - brand_kit: Voluptatem incidunt cum. - has_credentials: false - id: Rem asperiores eligendi vero. - label: Facere quas qui aut rerum. - portal_id: Fugit eum. - project_id: Voluptatem fugiat et. - sender_email: Necessitatibus voluptatem incidunt et totam esse rerum. - sender_name: Dolorem delectus. - status: active - version: 5717670313645740058 + account_id: Dolor eum et consequatur. + brand_kit: Iure odio at magnam saepe. + has_credentials: true + id: Ad minus vero assumenda cum nemo. + label: Quae adipisci doloribus ullam. + portal_id: Doloremque rerum sed consequatur dolor quia. + project_id: Nobis assumenda aut dolorem ea veniam. + sender_email: Vero dolorum incidunt. + sender_name: Nihil deleniti dolores dignissimos perferendis tempore eum. + status: error + version: 3519661115667163110 required: - id - project_id @@ -3970,34 +5522,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Quis quis reprehenderit non quae omnis qui. + example: Qui et assumenda quas. brand_kit: type: string description: Per-project brand kit selector - example: Voluptatibus deserunt. + example: Qui sed voluptatibus quam quia. label: type: string description: Optional friendly name - example: At odio incidunt distinctio sint qui. + example: Praesentium libero. portal_id: type: string description: HubSpot portal/account ID - example: Cumque saepe sint quidem odio ab. + example: Quisquam animi. sender_email: type: string description: Default sender address - example: Aut est. + example: Delectus blanditiis magnam sed iure amet. sender_name: type: string description: Default sender name - example: Error pariatur consequatur esse. + example: Repudiandae facilis blanditiis libero nam. example: - account_id: Et eligendi et numquam dolorum consequatur in. - brand_kit: Non sequi error assumenda quam deleniti et. - label: Necessitatibus eos. - portal_id: Et eum est molestiae necessitatibus magni. - sender_email: Molestiae praesentium perferendis deserunt ipsum dolorum. - sender_name: Error nulla fuga fugit repellendus et accusamus. + account_id: Molestiae omnis doloremque. + brand_kit: Aliquid explicabo eaque ab aut voluptas. + label: Deserunt et quidem sapiente. + portal_id: Perspiciatis modi dicta quae sed ut. + sender_email: Et atque. + sender_name: Impedit velit omnis incidunt. required: - account_id HubspotCredentials: @@ -4006,10 +5558,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Dolor officia eligendi. + example: Nulla eos. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Provident dicta temporibus debitis. + private_app_token: Recusandae totam soluta. required: - private_app_token InternalServerError: @@ -4029,17 +5581,81 @@ components: required: - code - message + JobCreateResponse: + type: object + properties: + job_id: + type: string + description: Poll GET /projects/{projectId}/jobs/{jobId} + example: Dolorem fugiat et aspernatur voluptatem nobis. + platforms: + type: array + items: + type: string + example: Odio praesentium perferendis eveniet sint voluptatibus quam. + description: Platforms this job will create on + example: + - Consequuntur voluptatem est qui. + - Quis iste eaque. + status: + type: string + description: Initial status (always 'queued' on create) + example: queued + enum: + - queued + example: + job_id: Debitis nam. + platforms: + - Aut quia distinctio consequatur dolore dolor. + - Consequatur voluptatem. + - Sed reprehenderit provident. + status: queued + required: + - job_id + - status + JobPollResponse: + type: object + properties: + error: + type: string + description: Terminal error, if any + example: Fuga quos. + job_id: + type: string + description: Job UUID + example: Sit qui aut aut. + result: + description: Per-platform results, populated as each completes + example: Quisquam et consequuntur ut sunt aliquam et. + status: + type: string + description: Job status + example: running + enum: + - queued + - running + - succeeded + - partial + - failed + example: + error: Dicta libero iure culpa est possimus dolores. + job_id: Minus officiis beatae sed aut quia. + result: Quia qui fugiat est itaque est fugiat. + status: queued + required: + - job_id + - status LinkedinAdsConnection: type: object properties: account_id: type: string description: Provider account identifier - example: Cumque molestiae eos rem aut. + example: Ex ipsa nihil esse voluptate in consectetur. etag: type: string description: ETag header value (mirrors version) - example: Non adipisci rerum. + example: Sed voluptatum et impedit quod rem. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4047,23 +5663,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Adipisci quaerat est nobis. + example: Quia magni aut nisi est. label: type: string description: Optional friendly name - example: Et veritatis quisquam sed ratione et. + example: Voluptas dolorem necessitatibus illum. org_id: type: string description: LinkedIn organization URN id - example: Placeat ea odio ea eos. + example: Omnis corrupti facere eum aliquid est repellat. project_id: type: string description: Owning project - example: Fugit non fuga rem adipisci. + example: Sint est sed. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -4072,18 +5688,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7868855978793741277 + example: 2425775250383083650 format: int64 example: - account_id: Nobis itaque est enim magnam pariatur. - etag: Praesentium ipsam officiis cum ipsum recusandae. + account_id: Quo nostrum quia. + etag: Velit quis. has_credentials: true - id: Ipsum et delectus dolorum eveniet. - label: Maxime maxime porro enim. - org_id: Adipisci ullam pariatur ex voluptas. - project_id: Alias ea quibusdam. - status: active - version: 5465298508990820984 + id: Esse sit id incidunt mollitia non sed. + label: Perferendis culpa voluptatem nostrum eaque deleniti. + org_id: Aliquam animi. + project_id: Minima est distinctio accusamus. + status: error + version: 8954977623991310377 required: - id - project_id @@ -4098,31 +5714,31 @@ components: account_id: type: string description: Provider account identifier - example: Dolorum deserunt. + example: Necessitatibus ut necessitatibus in. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Rerum adipisci. + example: Aspernatur nihil et incidunt dolorem dolor sed. label: type: string description: Optional friendly name - example: Non laudantium sunt minima repudiandae illo harum. + example: Voluptatem repellat expedita inventore. org_id: type: string description: LinkedIn organization URN id - example: Eos nihil ipsam ex odio totam. + example: Aliquam ratione ipsum reprehenderit. project_id: type: string description: Owning project - example: Enim accusantium labore esse numquam. + example: Delectus harum voluptates sit est corporis. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -4131,17 +5747,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2440284349670140496 + example: 2355245747867951235 format: int64 example: - account_id: Omnis consequatur. + account_id: Magnam voluptates molestiae libero autem quod. has_credentials: true - id: Deleniti placeat fuga aut saepe. - label: Ut quis ut accusantium. - org_id: Aut autem sint minus voluptatum. - project_id: Reiciendis pariatur repellat. - status: error - version: 4719926195195381744 + id: Hic est odio. + label: Esse mollitia et dolorum accusantium aspernatur quos. + org_id: Dolores dolore id dolore sed. + project_id: Occaecati rerum reiciendis. + status: inactive + version: 6928761352190945924 required: - id - project_id @@ -4155,31 +5771,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo veritatis quis delectus est. + example: Est ipsam sint autem repudiandae asperiores et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Tempore quae. + example: Sunt accusantium totam quia. label: type: string description: Optional friendly name - example: Dolores tenetur ut illum. + example: Commodi qui. org_id: type: string description: LinkedIn organization URN id - example: Expedita accusantium vel voluptate. + example: Nulla dolore quibusdam ducimus voluptas soluta. project_id: type: string description: Owning project - example: Consequatur dolore unde illum. + example: Accusantium debitis adipisci qui iste explicabo. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -4188,17 +5804,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1676862666948614995 + example: 7019802315342385433 format: int64 example: - account_id: Magni consequatur dignissimos itaque quia. + account_id: Ex est modi cupiditate. has_credentials: true - id: Repellat assumenda nesciunt distinctio eaque aliquam. - label: Et reprehenderit dignissimos. - org_id: Et voluptatem deserunt consequuntur omnis sed dolore. - project_id: Veniam consectetur deserunt in hic dolorum facere. - status: inactive - version: 7072791787806691868 + id: Qui at fugiat est omnis inventore. + label: Consequatur quisquam explicabo. + org_id: Consequatur molestias et et deleniti sint. + project_id: Ab totam laboriosam quos omnis deserunt. + status: error + version: 765646658236151796 required: - id - project_id @@ -4212,7 +5828,7 @@ components: account_id: type: string description: Provider account identifier - example: Assumenda dignissimos beatae vitae aut ea dolor. + example: Aliquam et asperiores quae voluptatem velit. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4220,19 +5836,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatibus quod necessitatibus non iste ad rem. + example: Odit eos. label: type: string description: Optional friendly name - example: Harum corporis deleniti doloribus. + example: Hic quam impedit placeat consequatur. org_id: type: string description: LinkedIn organization URN id - example: Sit architecto ut unde. + example: Enim voluptas numquam. project_id: type: string description: Owning project - example: Sunt qui cupiditate ullam ab suscipit et. + example: Quidem est. status: type: string description: Connection status @@ -4245,17 +5861,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6055913800302101668 + example: 5408757854107547795 format: int64 example: - account_id: Praesentium tenetur quas at ut necessitatibus dolor. - has_credentials: false - id: Sapiente possimus. - label: Eaque voluptate reprehenderit sed voluptatem sed illo. - org_id: Nihil id unde veritatis officiis aut fugiat. - project_id: Voluptates atque. - status: error - version: 446959638978499075 + account_id: Officia dolorem. + has_credentials: true + id: Et iusto eius dolor magnam necessitatibus. + label: Tempora voluptatem rem fugit accusantium est necessitatibus. + org_id: Aut soluta quae et est et corporis. + project_id: Mollitia earum aut qui sit rerum. + status: inactive + version: 758133864872776679 required: - id - project_id @@ -4273,14 +5889,14 @@ components: label: type: string description: Optional friendly name - example: Cumque totam nulla aut reprehenderit. + example: Distinctio magnam. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Illum rerum error incidunt. + label: Architecto deserunt vero ducimus distinctio. org_id: "208777" required: - account_id @@ -4291,10 +5907,10 @@ components: access_token: type: string description: OAuth access token - example: Aspernatur possimus. + example: Quae qui inventore dolorem deserunt. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Repellendus quo quidem. + access_token: In aut nam rerum. required: - access_token MetaAdsConnection: @@ -4303,39 +5919,39 @@ components: account_id: type: string description: Provider account identifier - example: Iusto ad animi eos doloribus autem corrupti. + example: Doloribus voluptas mollitia doloremque totam. app_id: type: string description: Meta app ID - example: Laborum eum et quidem. + example: Quidem omnis totam eos non molestias. etag: type: string description: ETag header value (mirrors version) - example: Suscipit quas sunt eos nulla. + example: Quos amet. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Facere exercitationem et exercitationem. + example: Non eum expedita non voluptas sit voluptatem. label: type: string description: Optional friendly name - example: Rerum quidem accusamus et provident provident omnis. + example: Totam hic quibusdam eveniet. page_id: type: string description: Facebook page ID - example: Perferendis qui maiores aut reiciendis. + example: Quia doloremque commodi rerum. project_id: type: string description: Owning project - example: Eaque deleniti. + example: Ab quasi tempora dolor. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4344,19 +5960,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1750381436080099913 + example: 8632050897094076248 format: int64 example: - account_id: Ad non. - app_id: Est voluptas sequi. - etag: Possimus consequatur est unde. - has_credentials: false - id: Quasi quis ab deserunt quia magnam. - label: Quod modi voluptas dolores commodi dicta. - page_id: Et laudantium. - project_id: Minus et aut consequatur non cumque. - status: active - version: 3589524561643771783 + account_id: Molestias ducimus id. + app_id: Laborum maiores est ea ducimus ipsum dolorem. + etag: Et quia ex et alias ea. + has_credentials: true + id: Quia iusto maxime. + label: Error sit nihil iure officiis nemo. + page_id: Quas quis corporis. + project_id: Illum accusamus debitis explicabo praesentium sint. + status: deleted + version: 6628357942141561962 required: - id - project_id @@ -4371,11 +5987,11 @@ components: account_id: type: string description: Provider account identifier - example: Nostrum tempore. + example: Ex dolor. app_id: type: string description: Meta app ID - example: Rerum explicabo. + example: In vel. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4383,23 +5999,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut commodi et voluptas tenetur nobis facere. + example: Voluptate est reprehenderit consectetur accusamus eaque inventore. label: type: string description: Optional friendly name - example: Blanditiis mollitia dolores illo nostrum magnam. + example: Officia dolores et reprehenderit. page_id: type: string description: Facebook page ID - example: Deserunt repellendus corrupti itaque quo sit. + example: Vitae qui explicabo tempora accusantium aut. project_id: type: string description: Owning project - example: Quo corporis recusandae dicta quibusdam. + example: Aut explicabo. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -4408,18 +6024,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6534648276901202778 + example: 2969272646168040903 format: int64 example: - account_id: Perspiciatis porro. - app_id: Deserunt quod. + account_id: Error deleniti vitae molestiae qui nobis. + app_id: Enim non asperiores velit aut. has_credentials: false - id: Eum et ipsum expedita reprehenderit eos. - label: Aperiam et nihil. - page_id: Non rem error. - project_id: Dolorum ut architecto deleniti nostrum. - status: deleted - version: 2783740423386270532 + id: Nobis qui sunt laboriosam ipsa. + label: Autem eaque eaque dicta ut magni. + page_id: Cumque quis accusantium. + project_id: Et vel dolorum aut inventore consequatur. + status: inactive + version: 8399692053212789191 required: - id - project_id @@ -4433,11 +6049,11 @@ components: account_id: type: string description: Provider account identifier - example: Voluptate necessitatibus enim et et itaque. + example: Sit nihil enim sit. app_id: type: string description: Meta app ID - example: Nihil aut rerum est vel. + example: Non ipsam optio in ratione accusamus quasi. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4445,23 +6061,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aperiam quos perferendis nisi blanditiis eveniet. + example: Quod minima. label: type: string description: Optional friendly name - example: Nobis omnis. + example: Dolores dolores. page_id: type: string description: Facebook page ID - example: Rerum quis et modi optio labore omnis. + example: Qui vitae iste. project_id: type: string description: Owning project - example: Ea enim ut corporis dolorum consequatur eius. + example: Ipsum et et laudantium. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -4470,18 +6086,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 9014435567821091487 + example: 6379674624138849400 format: int64 example: - account_id: Dolor aut assumenda fugiat. - app_id: Aut quas suscipit eos. + account_id: Aut perspiciatis. + app_id: Quibusdam ea nam aut. has_credentials: true - id: Rem ab corporis. - label: Porro et. - page_id: Inventore alias error aut maxime dicta. - project_id: Non dolorem. - status: deleted - version: 5862072609653585869 + id: Ipsam eligendi est dolore. + label: Excepturi natus est est saepe doloribus unde. + page_id: Sit totam ut et. + project_id: Consequatur aut vero. + status: active + version: 6192957101395237768 required: - id - project_id @@ -4495,11 +6111,11 @@ components: account_id: type: string description: Provider account identifier - example: Dolor et corrupti voluptas neque vitae. + example: Nihil at. app_id: type: string description: Meta app ID - example: Rerum numquam amet deserunt rem quia. + example: Maxime eos deserunt quia. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4507,19 +6123,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ipsa rerum velit et impedit. + example: Dolores earum. label: type: string description: Optional friendly name - example: Velit quam omnis. + example: Optio quia similique vero est impedit quo. page_id: type: string description: Facebook page ID - example: Mollitia est assumenda aut harum. + example: Quia tempore sit soluta quia. project_id: type: string description: Owning project - example: Quaerat labore dolor. + example: Est consequatur rerum neque velit nulla modi. status: type: string description: Connection status @@ -4532,18 +6148,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1514261665871912761 + example: 6683913012343616485 format: int64 example: - account_id: Deleniti deserunt labore. - app_id: Molestiae deserunt voluptates. + account_id: Qui quas aut provident suscipit. + app_id: Excepturi qui. has_credentials: true - id: Ipsam dolores et et qui ut. - label: Velit esse voluptate eum laboriosam distinctio. - page_id: Adipisci quo. - project_id: Numquam omnis ullam facilis ab sapiente. - status: error - version: 3954861542185537606 + id: Sed velit distinctio. + label: Veniam amet et quisquam voluptatem fuga. + page_id: Molestiae id quae vero aut repellendus. + project_id: Necessitatibus eos rerum. + status: inactive + version: 747656330949987636 required: - id - project_id @@ -4561,20 +6177,20 @@ components: app_id: type: string description: Meta app ID - example: Eius sed qui deserunt perspiciatis nihil. + example: Consequatur hic voluptatem. label: type: string description: Optional friendly name - example: Et eveniet. + example: Iusto fugit non asperiores quidem natus. page_id: type: string description: Facebook page ID - example: Corporis ut non. + example: Nostrum atque illum nesciunt adipisci odit corrupti. example: account_id: act_193556282970417 - app_id: Aut hic. - label: Mollitia tempora minima voluptas. - page_id: Facere aut facilis porro dolor ipsa. + app_id: Occaecati earum unde ut. + label: Omnis quidem dolor ipsum voluptas. + page_id: Occaecati id ea sunt dolorem necessitatibus neque. required: - account_id MetaAdsCredentials: @@ -4583,15 +6199,15 @@ components: access_token: type: string description: Meta access token - example: Aperiam voluptates. + example: Vel architecto quae error dolor placeat. app_secret: type: string description: Meta app secret - example: Vero ducimus. + example: Minus et. description: Meta Ads credential. Write-only; never returned. example: - access_token: Recusandae aut perferendis. - app_secret: Est eaque ipsam harum nisi nobis. + access_token: Fugiat aliquid aspernatur voluptatem in cupiditate. + app_secret: Et dolorem quod. required: - access_token - app_secret @@ -4601,35 +6217,35 @@ components: account_id: type: string description: Provider account identifier - example: Et nulla officia vitae. + example: Aut omnis itaque ut vero voluptatibus. customer_id: type: string description: Microsoft Advertising customer ID - example: Et sunt quis dicta voluptate aut in. + example: Sequi non et. etag: type: string description: ETag header value (mirrors version) - example: Ut asperiores quo aut. + example: Voluptatibus voluptatem vero dolorem qui. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Perspiciatis id. + example: Non eos. label: type: string description: Optional friendly name - example: Nihil nihil quae porro qui rem autem. + example: Enim voluptatem inventore quasi. project_id: type: string description: Owning project - example: Ut non error aut et fuga. + example: Vel aut aliquam rerum et quidem. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -4638,18 +6254,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2431299518347433245 + example: 6330819027913820088 format: int64 example: - account_id: Id temporibus et provident maiores neque quis. - customer_id: Sunt assumenda. - etag: Eligendi ut. + account_id: Aut est voluptatibus placeat. + customer_id: Deleniti placeat rerum. + etag: Expedita et velit accusamus. has_credentials: false - id: Provident nobis soluta culpa vitae. - label: Laudantium amet veritatis rerum itaque consequatur laboriosam. - project_id: Excepturi deleniti voluptas aperiam vel. - status: error - version: 4162198444433663334 + id: Vero vel. + label: Necessitatibus quaerat minima a voluptatem ipsa et. + project_id: Quibusdam repellendus qui numquam. + status: inactive + version: 7624219269087359761 required: - id - project_id @@ -4664,31 +6280,31 @@ components: account_id: type: string description: Provider account identifier - example: Earum minus autem omnis qui debitis eum. + example: Eos ex laborum et doloremque. customer_id: type: string description: Microsoft Advertising customer ID - example: Quidem necessitatibus voluptatem consequatur sit. + example: Ab non sunt dolores quo est ratione. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Esse officia explicabo dolor deserunt aspernatur. + example: Repudiandae eum. label: type: string description: Optional friendly name - example: Cupiditate mollitia hic vel ut. + example: Quod amet itaque aut. project_id: type: string description: Owning project - example: Aspernatur illo accusamus. + example: Ut itaque voluptatem unde adipisci aut. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -4697,17 +6313,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3699306814781450025 + example: 6109053107717412647 format: int64 example: - account_id: Sed corrupti sit. - customer_id: Consectetur tenetur eum. + account_id: Soluta beatae error enim velit voluptates officiis. + customer_id: Molestiae veniam exercitationem blanditiis ratione non. has_credentials: true - id: Et vel beatae molestiae fuga. - label: Aut ut. - project_id: Vitae consequatur eos. - status: active - version: 436879921687162189 + id: Totam dolorum quas quia quam voluptate. + label: Aut numquam est accusantium ut vitae. + project_id: Iste architecto voluptatem velit odio. + status: error + version: 7566507239259662295 required: - id - project_id @@ -4721,27 +6337,27 @@ components: account_id: type: string description: Provider account identifier - example: Qui impedit temporibus eveniet eos omnis cumque. + example: Quos provident. customer_id: type: string description: Microsoft Advertising customer ID - example: Natus et unde. + example: Officiis modi quae consequatur voluptatem et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Aut ut sit nisi architecto. + example: Sed dolorum cupiditate quia qui dicta. label: type: string description: Optional friendly name - example: Praesentium voluptate. + example: Totam et voluptates atque consequatur consequuntur voluptates. project_id: type: string description: Owning project - example: Rerum et recusandae possimus quis. + example: Commodi facere vel. status: type: string description: Connection status @@ -4754,17 +6370,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1288874109548033633 + example: 413153877019026133 format: int64 example: - account_id: Hic est quia pariatur odit ullam. - customer_id: Sed quo perferendis nemo ut quisquam. + account_id: Dolorem ea et quidem quibusdam officiis. + customer_id: Sed sint dolor eaque culpa quae. has_credentials: true - id: Explicabo repudiandae aut reiciendis recusandae molestias. - label: Quod impedit accusamus incidunt minus veritatis enim. - project_id: Vel inventore aliquid aut non eligendi accusamus. - status: error - version: 2175885598856983154 + id: Culpa veritatis ut adipisci minus. + label: Incidunt deleniti. + project_id: Vero eum ea perspiciatis rerum. + status: deleted + version: 1470629891228199804 required: - id - project_id @@ -4778,11 +6394,11 @@ components: account_id: type: string description: Provider account identifier - example: Hic rerum accusamus velit error. + example: Eveniet amet accusantium qui pariatur odio. customer_id: type: string description: Microsoft Advertising customer ID - example: Dolorem deserunt quasi in aut nam rerum. + example: Et id sint suscipit quia ipsa voluptas. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4790,15 +6406,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Repellendus quos magnam. + example: Omnis id. label: type: string description: Optional friendly name - example: Pariatur repellat vel. + example: Placeat dolores iure dolore voluptatem. project_id: type: string description: Owning project - example: In id voluptatem nihil quaerat. + example: Omnis aut mollitia pariatur. status: type: string description: Connection status @@ -4811,17 +6427,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8411140861799189617 + example: 1077022898145795137 format: int64 example: - account_id: Sint est sed. - customer_id: Illum quisquam ex ipsa. + account_id: Sapiente perspiciatis dolores dignissimos soluta non vel. + customer_id: Velit distinctio animi fugit provident rerum. has_credentials: true - id: Distinctio magnam. - label: Quia magni aut nisi est. - project_id: Architecto deserunt vero ducimus distinctio. - status: active - version: 6452524533918462281 + id: Non neque optio. + label: Perspiciatis consequatur beatae sunt officiis sequi qui. + project_id: Architecto molestiae cum. + status: inactive + version: 8699718175951963580 required: - id - project_id @@ -4835,19 +6451,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: Ex quo praesentium voluptas. + example: In autem neque nihil laborum omnis. customer_id: type: string description: Microsoft Advertising customer ID - example: Est officia et. + example: Voluptatem possimus veniam dignissimos consequatur. label: type: string description: Optional friendly name - example: Voluptatem mollitia omnis doloribus qui consequatur et. + example: Neque maiores quo aliquam in rem. example: - account_id: Eos et architecto voluptas. - customer_id: Vel natus provident. - label: Numquam accusamus. + account_id: Est porro eos ipsa quia. + customer_id: Quo repudiandae. + label: Delectus enim quas id porro. required: - account_id MicrosoftAdsCredentials: @@ -4856,25 +6472,25 @@ components: client_id: type: string description: OAuth client id - example: Architecto itaque doloribus voluptatem consequatur quis fugiat. + example: Hic voluptatem ad similique sunt ratione. client_secret: type: string description: OAuth client secret - example: Recusandae qui culpa. + example: Dicta et ratione impedit recusandae dolor. developer_token: type: string description: Microsoft Advertising developer token - example: Sed rerum dicta distinctio voluptas ut ut. + example: Sunt voluptatem beatae repellat veritatis perferendis veritatis. refresh_token: type: string description: OAuth refresh token - example: Accusamus et atque enim. + example: Mollitia vel temporibus sunt nulla esse. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Fuga nostrum velit hic excepturi omnis. - client_secret: Distinctio quos ut unde et atque. - developer_token: In recusandae maiores et voluptatem. - refresh_token: Odio labore pariatur nobis. + client_id: Facere sed ea qui pariatur adipisci. + client_secret: Enim esse dolores. + developer_token: Est perferendis eos et cumque nulla. + refresh_token: Iste exercitationem voluptate quia esse nihil sed. required: - client_id - client_secret @@ -4937,27 +6553,27 @@ components: account_id: type: string description: Provider account identifier - example: Dolores assumenda accusantium mollitia fugiat dolore similique. + example: Necessitatibus voluptatem incidunt et totam esse rerum. etag: type: string description: ETag header value (mirrors version) - example: Molestiae quos cum. + example: Voluptatem incidunt cum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Cum molestias fuga voluptatibus quis. + example: Vero ut et neque soluta distinctio voluptas. label: type: string description: Optional friendly name - example: Nobis aliquid rerum consequatur officiis velit. + example: Fugit eum. project_id: type: string description: Owning project - example: Aut rerum ut blanditiis dolor. + example: Libero sapiente. status: type: string description: Connection status @@ -4970,17 +6586,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4135215091203906464 + example: 3465638753396319382 format: int64 example: - account_id: Natus placeat esse est in deserunt aliquid. - etag: Sed et odio sunt totam incidunt. - has_credentials: false - id: Architecto doloremque aperiam doloribus aut qui. - label: Distinctio ipsum ab. - project_id: Placeat cumque iure veritatis cumque nisi. - status: error - version: 6763438623066254599 + account_id: Inventore ratione id vel iusto optio repellendus. + etag: Quos rerum. + has_credentials: true + id: Occaecati quaerat eum quia a excepturi. + label: Inventore aut molestiae voluptas hic. + project_id: Ut possimus quidem eos culpa quaerat. + status: active + version: 2911200286629229215 required: - id - project_id @@ -4995,23 +6611,23 @@ components: account_id: type: string description: Provider account identifier - example: Assumenda harum eos eveniet ut et laboriosam. + example: Cumque laborum ipsum accusantium voluptatem libero. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Culpa saepe necessitatibus. + example: Tenetur atque et et quia. label: type: string description: Optional friendly name - example: Voluptas aperiam. + example: Consequatur aut. project_id: type: string description: Owning project - example: Dolores enim. + example: Aut tenetur ipsum ea ad. status: type: string description: Connection status @@ -5024,16 +6640,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6456486653687697700 + example: 6681602602405949516 format: int64 example: - account_id: Cumque quae. + account_id: In iure molestiae quisquam. has_credentials: false - id: Qui eaque ut laudantium. - label: Laborum aspernatur voluptate itaque fugit. - project_id: Ratione id. + id: Necessitatibus non eum ipsum eveniet quam. + label: Accusamus eos neque velit. + project_id: Aut amet aut voluptatum magnam. status: deleted - version: 5238309974693293664 + version: 3936961167651696720 required: - id - project_id @@ -5047,27 +6663,27 @@ components: account_id: type: string description: Provider account identifier - example: Dolore velit pariatur non assumenda perspiciatis dolor. + example: Modi nostrum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Odit consequatur. + example: Totam in et. label: type: string description: Optional friendly name - example: Ut ullam. + example: Illo ut ut ut. project_id: type: string description: Owning project - example: Vero soluta omnis eius. + example: Voluptatem maiores ipsam dicta cum odit repellat. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5076,16 +6692,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3837313741085790100 + example: 1189484283141975528 format: int64 example: - account_id: Animi molestiae aut fugit alias nisi qui. - has_credentials: false - id: Molestiae ea ullam minima voluptatem vel. - label: Beatae quia minus vero at ut. - project_id: Dolore repudiandae necessitatibus dolorem. + account_id: Aliquam est autem vel eos minima. + has_credentials: true + id: Debitis atque laboriosam unde facilis. + label: Voluptatem optio. + project_id: Ut quas officiis mollitia ducimus sunt repellendus. status: inactive - version: 8129543513726361746 + version: 2884566362507518761 required: - id - project_id @@ -5099,7 +6715,7 @@ components: account_id: type: string description: Provider account identifier - example: Autem iste ea in ipsa. + example: Occaecati hic ut magnam facilis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5107,19 +6723,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Deserunt dolorum nihil. + example: Maiores consequatur. label: type: string description: Optional friendly name - example: Odio odio sed minus quia quia ea. + example: Quo ullam. project_id: type: string description: Owning project - example: Doloremque explicabo ut. + example: Ea voluptatum pariatur non. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -5128,16 +6744,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4150548058954901958 + example: 4047597311733105158 format: int64 example: - account_id: Quibusdam consequuntur dolorem fugiat. - has_credentials: true - id: Perspiciatis magni tempore sunt itaque. - label: Sit beatae ut modi voluptatum veniam. - project_id: Ut ex. - status: error - version: 5881477690177318757 + account_id: Perferendis et. + has_credentials: false + id: Sed error quisquam recusandae nesciunt et itaque. + label: Quos qui quo et. + project_id: A debitis ut ea. + status: deleted + version: 4664403850667403290 required: - id - project_id @@ -5155,10 +6771,10 @@ components: label: type: string description: Optional friendly name - example: Qui molestias. + example: Voluptatem fugiat et. example: account_id: t2_gv9wtbfa - label: Molestiae minus dolor accusantium. + label: Facere quas qui aut rerum. required: - account_id RedditAdsCredentials: @@ -5167,20 +6783,20 @@ components: client_id: type: string description: OAuth client id - example: Numquam quidem qui. + example: Ab quo ullam ad. client_secret: type: string description: OAuth client secret - example: Laboriosam possimus dolor facere velit dolores. + example: Quos et est placeat explicabo. refresh_token: type: string description: OAuth refresh token - example: Alias ad voluptatem accusantium tempore impedit. + example: Rerum tenetur ut voluptatem quo. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Et expedita itaque quos. - client_secret: Quos accusantium fugit. - refresh_token: Excepturi saepe sit vel perspiciatis neque. + client_id: Iste aut cum voluptatem qui et. + client_secret: Aperiam facere voluptas quis nihil. + refresh_token: Rem asperiores eligendi vero. required: - client_id - client_secret @@ -5209,10 +6825,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ex ea ullam corrupti. + client_secret: Et omnis accusantium. + developer_token: Iure modi asperiores ut. + refresh_token: Consectetur sint nesciunt. required: - credentials SetCredentialHubspotRequestBody: @@ -5222,7 +6838,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Non sint praesentium quia. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -5232,7 +6848,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Fugit enim et sint consectetur ea minus. required: - credentials SetCredentialMetaAdsRequestBody: @@ -5242,8 +6858,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Debitis labore aut. + app_secret: Porro ab id necessitatibus consequatur natus tempora. required: - credentials SetCredentialRedditAdsRequestBody: @@ -5253,9 +6869,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Facilis facilis aut suscipit aut odio iste. + client_secret: Deleniti earum magni quibusdam. + refresh_token: Tenetur velit quaerat aut. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -5265,10 +6881,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Amet et eaque. + access_token_secret: Consequatur iste sed illo adipisci sunt. + consumer_key: Neque ipsum nihil cumque repellendus. + consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. required: - credentials TwitterAdsConnection: @@ -5277,15 +6893,15 @@ components: account_id: type: string description: Provider account identifier - example: Quisquam incidunt qui. + example: Minima vitae illo cumque optio impedit. etag: type: string description: ETag header value (mirrors version) - example: Quia exercitationem consequatur velit. + example: Odit autem repellendus dicta qui vel. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Quia culpa iste id sit incidunt. + example: Earum id consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5293,15 +6909,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Mollitia atque atque dolores accusantium non dolor. + example: Possimus ipsam perspiciatis enim id. label: type: string description: Optional friendly name - example: Nobis labore dicta. + example: Vel necessitatibus vel voluptates tenetur veniam repellat. project_id: type: string description: Owning project - example: Enim qui officia id necessitatibus mollitia soluta. + example: Eveniet quia voluptatem impedit cumque doloribus. status: type: string description: Connection status @@ -5314,18 +6930,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2620236536617279883 + example: 234140326367801793 format: int64 example: - account_id: Accusantium enim temporibus dolor ipsam. - etag: Aut ducimus dolores. - funding_instrument_id: Dolorum minus voluptatem. + account_id: Molestiae itaque autem aliquam voluptatibus assumenda mollitia. + etag: Nemo sint et consequatur vel quisquam libero. + funding_instrument_id: Eum et sint possimus omnis dolorem. has_credentials: false - id: Officiis est. - label: Tempore nemo illum ut maiores. - project_id: Qui quisquam voluptatibus sint quia. - status: error - version: 6092912427529457622 + id: Dolorum id ut molestias. + label: Rerum non assumenda molestiae modi impedit. + project_id: Adipisci ipsa. + status: deleted + version: 1754395146238114720 required: - id - project_id @@ -5340,27 +6956,27 @@ components: account_id: type: string description: Provider account identifier - example: Delectus ex aut quia. + example: Provident nostrum vel ut nulla et. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Corporis consequatur voluptatem voluptates. + example: Magnam dolor et aliquam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Soluta odit odio praesentium perferendis eveniet sint. + example: Quod nihil quia id sed voluptas fuga. label: type: string description: Optional friendly name - example: Temporibus quis iste eaque ratione debitis nam. + example: Qui qui impedit assumenda voluptas cumque. project_id: type: string description: Owning project - example: Quam dicta voluptate consequuntur voluptatem est. + example: Nulla temporibus recusandae consequatur nulla quam non. status: type: string description: Connection status @@ -5373,17 +6989,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 629084196159484927 + example: 7352010610499081653 format: int64 example: - account_id: Velit fuga quos. - funding_instrument_id: Sed aut quia nihil est quia. - has_credentials: true - id: Reprehenderit provident repudiandae sit. - label: Ut sunt aliquam. - project_id: Aut aut eos magnam quisquam et. - status: active - version: 2879571083312014203 + account_id: Ut et laborum. + funding_instrument_id: Iusto reiciendis. + has_credentials: false + id: Magnam nemo cum delectus. + label: Et voluptatem mollitia placeat aut laudantium. + project_id: Minus est dolor. + status: inactive + version: 760324478171279387 required: - id - project_id @@ -5397,31 +7013,31 @@ components: account_id: type: string description: Provider account identifier - example: Velit laudantium error. + example: Necessitatibus quia facere vitae aperiam velit corrupti. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Beatae harum similique corporis id eum. + example: Deserunt minima quis impedit. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Fugiat est itaque. + example: Ut saepe beatae quasi temporibus in. label: type: string description: Optional friendly name - example: Culpa est possimus dolores dignissimos. + example: Voluptas doloremque nobis consectetur voluptas voluptas. project_id: type: string description: Owning project - example: Fugiat aut dicta libero. + example: Provident corrupti ut similique. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5430,17 +7046,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7144064222780250488 + example: 8091372322961997197 format: int64 example: - account_id: Enim vitae officia dolorem odio. - funding_instrument_id: Excepturi minima illo dolores. + account_id: Saepe eius earum. + funding_instrument_id: Est est molestias reprehenderit placeat. has_credentials: false - id: Et itaque rem eos et deleniti dolores. - label: Facere qui omnis. - project_id: Facilis qui libero. - status: active - version: 6722562537039921847 + id: In voluptate debitis earum voluptates repellat. + label: Repellendus dolore expedita commodi sit omnis et. + project_id: Aut et ut dolorem tempore. + status: inactive + version: 2286015844327380649 required: - id - project_id @@ -5454,31 +7070,31 @@ components: account_id: type: string description: Provider account identifier - example: Non quo necessitatibus. + example: Sed qui dolor illo facere ut voluptatem. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Laudantium nostrum earum dolores sit. + example: Rerum maiores in alias est laboriosam saepe. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: A sint quod sunt quae et. + example: Esse odio dolorem similique sapiente ab. label: type: string description: Optional friendly name - example: Ut mollitia nihil ducimus. + example: Incidunt nam repellat. project_id: type: string description: Owning project - example: Iure quis. + example: Pariatur deserunt aut rem molestiae assumenda. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5487,17 +7103,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3532519562043610511 + example: 8862716294143227386 format: int64 example: - account_id: At fugit dolor. - funding_instrument_id: Non exercitationem modi possimus consequatur non. - has_credentials: false - id: Exercitationem accusantium nihil. - label: Amet omnis. - project_id: Quod alias ipsum voluptates pariatur magni. + account_id: Quae et perspiciatis numquam. + funding_instrument_id: Cupiditate provident molestiae quia neque atque delectus. + has_credentials: true + id: Perferendis placeat earum occaecati et. + label: Assumenda quam possimus aut ipsa. + project_id: Eaque magni omnis dolorem. status: error - version: 5818865715898604715 + version: 413964225916483826 required: - id - project_id @@ -5515,15 +7131,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Ut mollitia accusantium dignissimos. + example: Accusantium voluptas ratione dignissimos esse et labore. label: type: string description: Optional friendly name - example: Fugit provident officia officiis. + example: Necessitatibus tempore rem quo. example: account_id: 8r7gb - funding_instrument_id: Rerum ut necessitatibus illum ratione. - label: Consequatur qui molestiae velit ratione nesciunt et. + funding_instrument_id: Cumque perspiciatis quam. + label: Iste numquam optio possimus velit. required: - account_id TwitterAdsCredentials: @@ -5532,30 +7148,42 @@ components: access_token: type: string description: OAuth 1.0a access token - example: At perspiciatis quisquam perferendis. + example: Est magni odio aut omnis vel. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Ut alias quis nihil dolore suscipit reprehenderit. + example: Iure ducimus voluptatem. consumer_key: type: string description: OAuth 1.0a consumer key - example: Id ipsa perspiciatis sunt ut velit. + example: Nam sunt aut inventore impedit unde. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Aut mollitia aut molestiae exercitationem et. + example: Quia ab recusandae praesentium. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Et aut consequatur inventore enim reiciendis. - access_token_secret: Neque ut rerum facilis quia molestiae ratione. - consumer_key: Aut animi laudantium ullam. - consumer_secret: Autem et id laboriosam nihil ea. + access_token: Magnam cum veritatis mollitia vel velit. + access_token_secret: Eum perferendis qui qui soluta repudiandae quae. + consumer_key: Ullam consequatur ut eveniet tempore est. + consumer_secret: Iusto fugiat ad et. required: - consumer_key - consumer_secret - access_token - access_token_secret + UpdateCampaignRequestBody: + type: object + properties: + campaign: + $ref: '#/components/schemas/CampaignUpdateInput' + example: + campaign: + campaign_name: Hic voluptas debitis error. + config: Ut consectetur. + status: Veniam eum ut libero quibusdam debitis. + required: + - campaign UpdateGoogleAdsRequestBody: type: object properties: @@ -5575,12 +7203,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Sed omnis. + brand_kit: Sed maiores qui sed exercitationem quam. + label: Ut amet nostrum laborum minima ipsum. + portal_id: Aut id in. + sender_email: Et magnam cumque quasi magni ducimus. + sender_name: Suscipit sed minus soluta quasi. required: - config UpdateLinkedinAdsRequestBody: @@ -5591,7 +7219,7 @@ components: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Ratione sunt nostrum tenetur repellendus dolorem cum. org_id: "208777" required: - config @@ -5603,9 +7231,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Harum et minus voluptas. + label: Alias non sequi consequatur dolorum. + page_id: Voluptatem voluptas omnis est tempora ipsum aut. required: - config UpdateMicrosoftAdsRequestBody: @@ -5615,9 +7243,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Error laudantium. + customer_id: Similique odio adipisci dolore iste. + label: Non nostrum dolorum iure eaque animi. required: - config UpdateRedditAdsRequestBody: @@ -5628,7 +7256,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Aliquam consequuntur quo aliquid ducimus. required: - config UpdateTwitterAdsRequestBody: @@ -5639,8 +7267,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Commodi architecto unde rerum quisquam ut. + label: Quo sit iusto laudantium voluptates neque. required: - config securitySchemes: @@ -5651,5 +7279,7 @@ components: tags: - name: lfx-v2-campaign-service-svc description: The campaign service supports Marketing Operations campaign creation and management. + - name: lfx-v2-campaign-service-briefs + description: Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation. - name: lfx-v2-campaign-service-connections description: Manage a project's singleton, per-provider ad-platform connections. diff --git a/gen/lfx_v2_campaign_service_briefs/client.go b/gen/lfx_v2_campaign_service_briefs/client.go new file mode 100644 index 00000000..433c0531 --- /dev/null +++ b/gen/lfx_v2_campaign_service_briefs/client.go @@ -0,0 +1,200 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs client +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package lfxv2campaignservicebriefs + +import ( + "context" + + goa "goa.design/goa/v3/pkg" +) + +// Client is the "lfx-v2-campaign-service-briefs" service client. +type Client struct { + CreateBriefEndpoint goa.Endpoint + GetBriefEndpoint goa.Endpoint + UpdateBriefEndpoint goa.Endpoint + ApproveBriefEndpoint goa.Endpoint + DeleteBriefEndpoint goa.Endpoint + CreateCampaignsEndpoint goa.Endpoint + GetCampaignEndpoint goa.Endpoint + UpdateCampaignEndpoint goa.Endpoint + GetJobEndpoint goa.Endpoint +} + +// NewClient initializes a "lfx-v2-campaign-service-briefs" service client +// given the endpoints. +func NewClient(createBrief, getBrief, updateBrief, approveBrief, deleteBrief, createCampaigns, getCampaign, updateCampaign, getJob goa.Endpoint) *Client { + return &Client{ + CreateBriefEndpoint: createBrief, + GetBriefEndpoint: getBrief, + UpdateBriefEndpoint: updateBrief, + ApproveBriefEndpoint: approveBrief, + DeleteBriefEndpoint: deleteBrief, + CreateCampaignsEndpoint: createCampaigns, + GetCampaignEndpoint: getCampaign, + UpdateCampaignEndpoint: updateCampaign, + GetJobEndpoint: getJob, + } +} + +// CreateBrief calls the "create-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// CreateBrief may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) CreateBrief(ctx context.Context, p *CreateBriefPayload) (res *Brief, err error) { + var ires any + ires, err = c.CreateBriefEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*Brief), nil +} + +// GetBrief calls the "get-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// GetBrief may return the following errors: +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) GetBrief(ctx context.Context, p *GetBriefPayload) (res *Brief, err error) { + var ires any + ires, err = c.GetBriefEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*Brief), nil +} + +// UpdateBrief calls the "update-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// UpdateBrief may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - "PreconditionFailed" (type *PreconditionFailedError): ETag mismatch +// - "PreconditionRequired" (type *PreconditionRequiredError): If-Match header required +// - error: internal error +func (c *Client) UpdateBrief(ctx context.Context, p *UpdateBriefPayload) (res *Brief, err error) { + var ires any + ires, err = c.UpdateBriefEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*Brief), nil +} + +// ApproveBrief calls the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// ApproveBrief may return the following errors: +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) ApproveBrief(ctx context.Context, p *ApproveBriefPayload) (res *Brief, err error) { + var ires any + ires, err = c.ApproveBriefEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*Brief), nil +} + +// DeleteBrief calls the "delete-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// DeleteBrief may return the following errors: +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) DeleteBrief(ctx context.Context, p *DeleteBriefPayload) (err error) { + _, err = c.DeleteBriefEndpoint(ctx, p) + return +} + +// CreateCampaigns calls the "create-campaigns" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// CreateCampaigns may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) CreateCampaigns(ctx context.Context, p *CreateCampaignsPayload) (res *JobCreateResponse, err error) { + var ires any + ires, err = c.CreateCampaignsEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*JobCreateResponse), nil +} + +// GetCampaign calls the "get-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// GetCampaign may return the following errors: +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) GetCampaign(ctx context.Context, p *GetCampaignPayload) (res *Campaign, err error) { + var ires any + ires, err = c.GetCampaignEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*Campaign), nil +} + +// UpdateCampaign calls the "update-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +// UpdateCampaign may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - "PreconditionFailed" (type *PreconditionFailedError): ETag mismatch +// - "PreconditionRequired" (type *PreconditionRequiredError): If-Match header required +// - error: internal error +func (c *Client) UpdateCampaign(ctx context.Context, p *UpdateCampaignPayload) (res *Campaign, err error) { + var ires any + ires, err = c.UpdateCampaignEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*Campaign), nil +} + +// GetJob calls the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +// GetJob may return the following errors: +// - "NotFound" (type *NotFoundError): Resource not found +// - "Conflict" (type *ConflictError): Conflict +// - "InternalServerError" (type *InternalServerError): Internal server error +// - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - error: internal error +func (c *Client) GetJob(ctx context.Context, p *GetJobPayload) (res *JobPollResponse, err error) { + var ires any + ires, err = c.GetJobEndpoint(ctx, p) + if err != nil { + return + } + return ires.(*JobPollResponse), nil +} diff --git a/gen/lfx_v2_campaign_service_briefs/endpoints.go b/gen/lfx_v2_campaign_service_briefs/endpoints.go new file mode 100644 index 00000000..9a30542c --- /dev/null +++ b/gen/lfx_v2_campaign_service_briefs/endpoints.go @@ -0,0 +1,267 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs endpoints +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package lfxv2campaignservicebriefs + +import ( + "context" + + goa "goa.design/goa/v3/pkg" + "goa.design/goa/v3/security" +) + +// Endpoints wraps the "lfx-v2-campaign-service-briefs" service endpoints. +type Endpoints struct { + CreateBrief goa.Endpoint + GetBrief goa.Endpoint + UpdateBrief goa.Endpoint + ApproveBrief goa.Endpoint + DeleteBrief goa.Endpoint + CreateCampaigns goa.Endpoint + GetCampaign goa.Endpoint + UpdateCampaign goa.Endpoint + GetJob goa.Endpoint +} + +// NewEndpoints wraps the methods of the "lfx-v2-campaign-service-briefs" +// service with endpoints. +func NewEndpoints(s Service) *Endpoints { + // Casting service to Auther interface + a := s.(Auther) + return &Endpoints{ + CreateBrief: NewCreateBriefEndpoint(s, a.JWTAuth), + GetBrief: NewGetBriefEndpoint(s, a.JWTAuth), + UpdateBrief: NewUpdateBriefEndpoint(s, a.JWTAuth), + ApproveBrief: NewApproveBriefEndpoint(s, a.JWTAuth), + DeleteBrief: NewDeleteBriefEndpoint(s, a.JWTAuth), + CreateCampaigns: NewCreateCampaignsEndpoint(s, a.JWTAuth), + GetCampaign: NewGetCampaignEndpoint(s, a.JWTAuth), + UpdateCampaign: NewUpdateCampaignEndpoint(s, a.JWTAuth), + GetJob: NewGetJobEndpoint(s, a.JWTAuth), + } +} + +// Use applies the given middleware to all the "lfx-v2-campaign-service-briefs" +// service endpoints. +func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) { + e.CreateBrief = m(e.CreateBrief) + e.GetBrief = m(e.GetBrief) + e.UpdateBrief = m(e.UpdateBrief) + e.ApproveBrief = m(e.ApproveBrief) + e.DeleteBrief = m(e.DeleteBrief) + e.CreateCampaigns = m(e.CreateCampaigns) + e.GetCampaign = m(e.GetCampaign) + e.UpdateCampaign = m(e.UpdateCampaign) + e.GetJob = m(e.GetJob) +} + +// NewCreateBriefEndpoint returns an endpoint function that calls the method +// "create-brief" of service "lfx-v2-campaign-service-briefs". +func NewCreateBriefEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*CreateBriefPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.CreateBrief(ctx, p) + } +} + +// NewGetBriefEndpoint returns an endpoint function that calls the method +// "get-brief" of service "lfx-v2-campaign-service-briefs". +func NewGetBriefEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*GetBriefPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.GetBrief(ctx, p) + } +} + +// NewUpdateBriefEndpoint returns an endpoint function that calls the method +// "update-brief" of service "lfx-v2-campaign-service-briefs". +func NewUpdateBriefEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*UpdateBriefPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.UpdateBrief(ctx, p) + } +} + +// NewApproveBriefEndpoint returns an endpoint function that calls the method +// "approve-brief" of service "lfx-v2-campaign-service-briefs". +func NewApproveBriefEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*ApproveBriefPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.ApproveBrief(ctx, p) + } +} + +// NewDeleteBriefEndpoint returns an endpoint function that calls the method +// "delete-brief" of service "lfx-v2-campaign-service-briefs". +func NewDeleteBriefEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*DeleteBriefPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return nil, s.DeleteBrief(ctx, p) + } +} + +// NewCreateCampaignsEndpoint returns an endpoint function that calls the +// method "create-campaigns" of service "lfx-v2-campaign-service-briefs". +func NewCreateCampaignsEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*CreateCampaignsPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.CreateCampaigns(ctx, p) + } +} + +// NewGetCampaignEndpoint returns an endpoint function that calls the method +// "get-campaign" of service "lfx-v2-campaign-service-briefs". +func NewGetCampaignEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*GetCampaignPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.GetCampaign(ctx, p) + } +} + +// NewUpdateCampaignEndpoint returns an endpoint function that calls the method +// "update-campaign" of service "lfx-v2-campaign-service-briefs". +func NewUpdateCampaignEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*UpdateCampaignPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.UpdateCampaign(ctx, p) + } +} + +// NewGetJobEndpoint returns an endpoint function that calls the method +// "get-job" of service "lfx-v2-campaign-service-briefs". +func NewGetJobEndpoint(s Service, authJWTFn security.AuthJWTFunc) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + p := req.(*GetJobPayload) + var err error + sc := security.JWTScheme{ + Name: "jwt", + Scopes: []string{}, + RequiredScopes: []string{}, + } + var token string + if p.BearerToken != nil { + token = *p.BearerToken + } + ctx, err = authJWTFn(ctx, token, &sc) + if err != nil { + return nil, err + } + return s.GetJob(ctx, p) + } +} diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go new file mode 100644 index 00000000..35f14b28 --- /dev/null +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -0,0 +1,442 @@ +// Code generated by goa v3.25.3, DO NOT EDIT. +// +// lfx-v2-campaign-service-briefs service +// +// Command: +// $ goa gen github.com/linuxfoundation/lfx-v2-campaign-service/design + +package lfxv2campaignservicebriefs + +import ( + "context" + + "goa.design/goa/v3/security" +) + +// Manage campaign briefs and their subordinate platform campaigns, including +// async multi-platform creation. +type Service interface { + // Create a brief. + CreateBrief(context.Context, *CreateBriefPayload) (res *Brief, err error) + // Get a brief; returns ETag. + GetBrief(context.Context, *GetBriefPayload) (res *Brief, err error) + // Replace a brief (requires If-Match). + UpdateBrief(context.Context, *UpdateBriefPayload) (res *Brief, err error) + // Approve a brief for campaign creation. + ApproveBrief(context.Context, *ApproveBriefPayload) (res *Brief, err error) + // Archive a brief (soft delete). + DeleteBrief(context.Context, *DeleteBriefPayload) (err error) + // Create campaigns across the selected platforms (async -> job). + CreateCampaigns(context.Context, *CreateCampaignsPayload) (res *JobCreateResponse, err error) + // Get one campaign under a brief; returns ETag. + GetCampaign(context.Context, *GetCampaignPayload) (res *Campaign, err error) + // Replace a campaign (requires If-Match). + UpdateCampaign(context.Context, *UpdateCampaignPayload) (res *Campaign, err error) + // Poll campaign-creation job status. + GetJob(context.Context, *GetJobPayload) (res *JobPollResponse, err error) +} + +// Auther defines the authorization functions to be implemented by the service. +type Auther interface { + // JWTAuth implements the authorization logic for the JWT security scheme. + JWTAuth(ctx context.Context, token string, schema *security.JWTScheme) (context.Context, error) +} + +// APIName is the name of the API as defined in the design. +const APIName = "lfx-v2-campaign-service" + +// APIVersion is the version of the API as defined in the design. +const APIVersion = "0.0.1" + +// ServiceName is the name of the service as defined in the design. This is the +// same value that is set in the endpoint request contexts under the ServiceKey +// key. +const ServiceName = "lfx-v2-campaign-service-briefs" + +// MethodNames lists the service method names as defined in the design. These +// are the same values that are set in the endpoint request contexts under the +// MethodKey key. +var MethodNames = [9]string{"create-brief", "get-brief", "update-brief", "approve-brief", "delete-brief", "create-campaigns", "get-campaign", "update-campaign", "get-job"} + +// ApproveBriefPayload is the payload type of the +// lfx-v2-campaign-service-briefs service approve-brief method. +type ApproveBriefPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string +} + +// Brief is the result type of the lfx-v2-campaign-service-briefs service +// create-brief method. +type Brief struct { + // Brief UUID + ID string + // Owning project + ProjectID string + // Funnel context + ProgramType string + // Event/course slug + EventSlug string + // Event/course page URL + URL *string + // Suggested default platforms + Platforms []string + // Lifecycle status + Status string + // Optimistic-concurrency version + Version int64 + // ETag header value (mirrors version) + Etag *string +} + +type BriefInput struct { + // Funnel context + ProgramType string + // Event/course slug (unique within the project) + EventSlug string + // Event/course page URL + URL *string + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) + Platforms []string + // Extracted event/course details + EventDetails any + // Ad copy + Copy any + // Keyword list + Keywords any + // Targeting recommendation + Targeting any +} + +// Campaign is the result type of the lfx-v2-campaign-service-briefs service +// get-campaign method. +type Campaign struct { + // Campaign UUID + ID string + // Owning project + ProjectID string + // Parent brief + BriefID string + // Channel + Platform string + // ID returned by the ad platform + PlatformCampaignID *string + // Campaign name + CampaignName string + // Campaign status + Status string + // Optimistic-concurrency version + Version int64 + // ETag header value (mirrors version) + Etag *string +} + +type CampaignCreateInput struct { + // Platforms to create campaigns on (binding selection) + Platforms []string + // Per-platform campaign configuration + Config any +} + +type CampaignUpdateInput struct { + // Campaign name + CampaignName string + // Campaign status + Status string + // Campaign configuration snapshot + Config any +} + +// CreateBriefPayload is the payload type of the lfx-v2-campaign-service-briefs +// service create-brief method. +type CreateBriefPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + Brief *BriefInput +} + +// CreateCampaignsPayload is the payload type of the +// lfx-v2-campaign-service-briefs service create-campaigns method. +type CreateCampaignsPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string + Input *CampaignCreateInput +} + +// DeleteBriefPayload is the payload type of the lfx-v2-campaign-service-briefs +// service delete-brief method. +type DeleteBriefPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string +} + +// GetBriefPayload is the payload type of the lfx-v2-campaign-service-briefs +// service get-brief method. +type GetBriefPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string +} + +// GetCampaignPayload is the payload type of the lfx-v2-campaign-service-briefs +// service get-campaign method. +type GetCampaignPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string + // Campaign UUID + CampaignID string +} + +// GetJobPayload is the payload type of the lfx-v2-campaign-service-briefs +// service get-job method. +type GetJobPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Job UUID + JobID string +} + +// JobCreateResponse is the result type of the lfx-v2-campaign-service-briefs +// service create-campaigns method. +type JobCreateResponse struct { + // Poll GET /projects/{projectId}/jobs/{jobId} + JobID string + // Initial status (always 'queued' on create) + Status string + // Platforms this job will create on + Platforms []string +} + +// JobPollResponse is the result type of the lfx-v2-campaign-service-briefs +// service get-job method. +type JobPollResponse struct { + // Job UUID + JobID string + // Job status + Status string + // Per-platform results, populated as each completes + Result any + // Terminal error, if any + Error *string +} + +// UpdateBriefPayload is the payload type of the lfx-v2-campaign-service-briefs +// service update-brief method. +type UpdateBriefPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string + // If-Match header carrying the current ETag/version + IfMatch *string + Brief *BriefInput +} + +// UpdateCampaignPayload is the payload type of the +// lfx-v2-campaign-service-briefs service update-campaign method. +type UpdateCampaignPayload struct { + // JWT token issued by Heimdall + BearerToken *string + // Project UUID or slug that scopes the connection + ProjectID string + // Brief UUID + BriefID string + // Campaign UUID + CampaignID string + // If-Match header carrying the current ETag/version + IfMatch *string + Campaign *CampaignUpdateInput +} + +type BadRequestError struct { + // HTTP status code + Code string + // Error message + Message string +} + +type ConflictError struct { + // HTTP status code + Code string + // Error message + Message string +} + +type ConnServiceUnavailableError struct { + // HTTP status code + Code string + // Error message + Message string +} + +type InternalServerError struct { + // HTTP status code + Code string + // Error message + Message string +} + +type NotFoundError struct { + // HTTP status code + Code string + // Error message + Message string +} + +type PreconditionFailedError struct { + // HTTP status code + Code string + // Error message + Message string +} + +type PreconditionRequiredError struct { + // HTTP status code + Code string + // Error message + Message string +} + +// Error returns an error description. +func (e *BadRequestError) Error() string { + return "" +} + +// ErrorName returns "bad-request-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *BadRequestError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "bad-request-error". +func (e *BadRequestError) GoaErrorName() string { + return "BadRequest" +} + +// Error returns an error description. +func (e *ConflictError) Error() string { + return "" +} + +// ErrorName returns "conflict-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *ConflictError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "conflict-error". +func (e *ConflictError) GoaErrorName() string { + return "Conflict" +} + +// Error returns an error description. +func (e *ConnServiceUnavailableError) Error() string { + return "" +} + +// ErrorName returns "conn-service-unavailable-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *ConnServiceUnavailableError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "conn-service-unavailable-error". +func (e *ConnServiceUnavailableError) GoaErrorName() string { + return "ServiceUnavailable" +} + +// Error returns an error description. +func (e *InternalServerError) Error() string { + return "" +} + +// ErrorName returns "internal-server-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *InternalServerError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "internal-server-error". +func (e *InternalServerError) GoaErrorName() string { + return "InternalServerError" +} + +// Error returns an error description. +func (e *NotFoundError) Error() string { + return "" +} + +// ErrorName returns "not-found-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *NotFoundError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "not-found-error". +func (e *NotFoundError) GoaErrorName() string { + return "NotFound" +} + +// Error returns an error description. +func (e *PreconditionFailedError) Error() string { + return "" +} + +// ErrorName returns "precondition-failed-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *PreconditionFailedError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "precondition-failed-error". +func (e *PreconditionFailedError) GoaErrorName() string { + return "PreconditionFailed" +} + +// Error returns an error description. +func (e *PreconditionRequiredError) Error() string { + return "" +} + +// ErrorName returns "precondition-required-error". +// +// Deprecated: Use GoaErrorName - https://github.com/goadesign/goa/issues/3105 +func (e *PreconditionRequiredError) ErrorName() string { + return e.GoaErrorName() +} + +// GoaErrorName returns "precondition-required-error". +func (e *PreconditionRequiredError) GoaErrorName() string { + return "PreconditionRequired" +} diff --git a/internal/container/container.go b/internal/container/container.go index 468c726f..b9d58e2b 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -10,8 +10,10 @@ import ( "log/slog" "time" + briefsvc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" connsvc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_connections" svc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_svc" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/config" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/crypto" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/postgres" @@ -28,6 +30,7 @@ type Container struct { Config *config.Config Service svc.Service Connections connsvc.Service + Briefs briefsvc.Service pool *postgres.Pool } @@ -89,6 +92,22 @@ func NewContainer(cfg *config.Config) (*Container, error) { repo := postgres.NewConnectionRepo(pool) c.Connections = service.NewConnectionService(repo, enc) + briefRepo := postgres.NewBriefRepo(pool) + campaignRepo := postgres.NewCampaignRepo(pool) + jobRepo := postgres.NewJobRepo(pool) + // No platform dispatchers are registered yet; campaign creation records a + // job whose platforms report "no dispatcher" until the per-platform adapters + // land (LFXV2-2636..2640). The orchestration flow (job lifecycle, + // persistence) is exercised end to end regardless. Log a startup warning so + // this gap is visible in production logs rather than silently producing jobs + // that always finish "failed" with "no dispatcher registered". + dispatchers := map[model.Provider]service.PlatformDispatcher(nil) + if len(dispatchers) == 0 { + slog.Warn("no platform dispatchers registered; campaign creation will record jobs but perform no upstream dispatch") + } + orch := service.NewOrchestrator(briefRepo, campaignRepo, jobRepo, dispatchers) + c.Briefs = service.NewBriefService(briefRepo, campaignRepo, jobRepo, orch) + // The health service's readiness depends on the database pool (Readyz). c.Service = service.NewCampaignService(pool) diff --git a/internal/service/brief.go b/internal/service/brief.go new file mode 100644 index 00000000..cc587f15 --- /dev/null +++ b/internal/service/brief.go @@ -0,0 +1,274 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +package service + +import ( + "context" + "encoding/json" + "errors" + "strconv" + + briefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" + + "goa.design/goa/v3/security" +) + +// BriefService implements the generated briefs service interface, delegating to +// the brief/campaign repositories and the async orchestrator. +type BriefService struct { + briefs domain.BriefRepository + campaigns domain.CampaignRepository + jobs domain.JobRepository + orch *Orchestrator +} + +var ( + _ briefs.Service = (*BriefService)(nil) + _ briefs.Auther = (*BriefService)(nil) +) + +// NewBriefService constructs a BriefService. +func NewBriefService(b domain.BriefRepository, c domain.CampaignRepository, j domain.JobRepository, orch *Orchestrator) *BriefService { + return &BriefService{briefs: b, campaigns: c, jobs: j, orch: orch} +} + +// JWTAuth mirrors the connection service: it records the authenticated actor +// (validated by Heimdall at the gateway) into the context for attribution. +func (s *BriefService) JWTAuth(ctx context.Context, token string, _ *security.JWTScheme) (context.Context, error) { + if token == "" { + return ctx, &briefs.InternalServerError{Code: "500", Message: "missing bearer token"} + } + if a := actorFromToken(token); a != nil { + ctx = context.WithValue(ctx, actorCtxKey{}, a) + } + return ctx, nil +} + +// ─── Briefs ─── + +func (s *BriefService) CreateBrief(ctx context.Context, p *briefs.CreateBriefPayload) (*briefs.Brief, error) { + in := p.Brief + b := &model.CampaignBrief{ + ProjectID: p.ProjectID, + ProgramType: model.ProgramType(in.ProgramType), + EventSlug: in.EventSlug, + URL: strVal(in.URL), + Platforms: marshalStrings(in.Platforms), + EventDetails: marshalAny(in.EventDetails), + Copy: marshalAny(in.Copy), + Keywords: marshalAny(in.Keywords), + Targeting: marshalAny(in.Targeting), + } + created, err := s.briefs.CreateBrief(ctx, b) + if err != nil { + return nil, mapBriefErr(err) + } + return briefResult(created), nil +} + +func (s *BriefService) GetBrief(ctx context.Context, p *briefs.GetBriefPayload) (*briefs.Brief, error) { + b, err := s.briefs.GetBrief(ctx, p.ProjectID, p.BriefID) + if err != nil { + return nil, mapBriefErr(err) + } + return briefResult(b), nil +} + +func (s *BriefService) UpdateBrief(ctx context.Context, p *briefs.UpdateBriefPayload) (*briefs.Brief, error) { + version, err := parseBriefIfMatch(p.IfMatch) + if err != nil { + return nil, err + } + in := p.Brief + b := &model.CampaignBrief{ + ID: p.BriefID, + ProjectID: p.ProjectID, + ProgramType: model.ProgramType(in.ProgramType), + EventSlug: in.EventSlug, + URL: strVal(in.URL), + Platforms: marshalStrings(in.Platforms), + EventDetails: marshalAny(in.EventDetails), + Copy: marshalAny(in.Copy), + Keywords: marshalAny(in.Keywords), + Targeting: marshalAny(in.Targeting), + } + updated, uerr := s.briefs.ReplaceBrief(ctx, b, version) + if uerr != nil { + return nil, mapBriefErr(uerr) + } + return briefResult(updated), nil +} + +func (s *BriefService) ApproveBrief(ctx context.Context, p *briefs.ApproveBriefPayload) (*briefs.Brief, error) { + b, err := s.briefs.Approve(ctx, p.ProjectID, p.BriefID, actorFromCtx(ctx)) + if err != nil { + return nil, mapBriefErr(err) + } + return briefResult(b), nil +} + +func (s *BriefService) DeleteBrief(ctx context.Context, p *briefs.DeleteBriefPayload) error { + return mapBriefErr(s.briefs.ArchiveBrief(ctx, p.ProjectID, p.BriefID)) +} + +// ─── Campaigns ─── + +func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCampaignsPayload) (*briefs.JobCreateResponse, error) { + brief, err := s.briefs.GetBrief(ctx, p.ProjectID, p.BriefID) + if err != nil { + return nil, mapBriefErr(err) + } + if brief.Status != model.BriefApproved { + return nil, &briefs.BadRequestError{Code: "400", Message: "brief must be approved before creating campaigns"} + } + platforms := make([]model.Provider, 0, len(p.Input.Platforms)) + for _, pl := range p.Input.Platforms { + prov := model.Provider(pl) + if !prov.Valid() { + return nil, &briefs.BadRequestError{Code: "400", Message: "unknown platform: " + pl} + } + platforms = append(platforms, prov) + } + jobID, err := s.orch.Start(ctx, brief, platforms, marshalAny(p.Input.Config)) + if err != nil { + return nil, mapBriefErr(err) + } + queued := "queued" + return &briefs.JobCreateResponse{JobID: jobID, Status: queued, Platforms: p.Input.Platforms}, nil +} + +func (s *BriefService) GetCampaign(ctx context.Context, p *briefs.GetCampaignPayload) (*briefs.Campaign, error) { + c, err := s.campaigns.GetCampaign(ctx, p.ProjectID, p.BriefID, p.CampaignID) + if err != nil { + return nil, mapBriefErr(err) + } + return campaignResult(c), nil +} + +func (s *BriefService) UpdateCampaign(ctx context.Context, p *briefs.UpdateCampaignPayload) (*briefs.Campaign, error) { + version, err := parseBriefIfMatch(p.IfMatch) + if err != nil { + return nil, err + } + c := &model.Campaign{ + ID: p.CampaignID, + ProjectID: p.ProjectID, + BriefID: p.BriefID, + CampaignName: p.Campaign.CampaignName, + Status: p.Campaign.Status, + ConfigSnapshot: marshalAny(p.Campaign.Config), + } + updated, uerr := s.campaigns.ReplaceCampaign(ctx, c, version) + if uerr != nil { + return nil, mapBriefErr(uerr) + } + return campaignResult(updated), nil +} + +func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*briefs.JobPollResponse, error) { + j, err := s.jobs.GetJob(ctx, p.JobID) + if err != nil { + return nil, mapBriefErr(err) + } + resp := &briefs.JobPollResponse{JobID: j.ID, Status: string(j.Status)} + if len(j.Result) > 0 { + var any any + if json.Unmarshal(j.Result, &any) == nil { + resp.Result = any + } + } + if j.Error != "" { + errMsg := j.Error // copy: don't hand out a pointer aliasing the source struct field + resp.Error = &errMsg + } + return resp, nil +} + +// ─── mapping helpers ─── + +func briefResult(b *model.CampaignBrief) *briefs.Brief { + return &briefs.Brief{ + ID: b.ID, + ProjectID: b.ProjectID, + ProgramType: string(b.ProgramType), + EventSlug: b.EventSlug, + URL: optStr(b.URL), + Platforms: unmarshalStrings(b.Platforms), + Status: string(b.Status), + Version: b.Version, + Etag: optStr(etag(b.Version)), + } +} + +func campaignResult(c *model.Campaign) *briefs.Campaign { + return &briefs.Campaign{ + ID: c.ID, + ProjectID: c.ProjectID, + BriefID: c.BriefID, + Platform: string(c.Platform), + PlatformCampaignID: optStr(c.PlatformCampaignID), + CampaignName: c.CampaignName, + Status: c.Status, + Version: c.Version, + Etag: optStr(etag(c.Version)), + } +} + +// parseBriefIfMatch converts the If-Match header to a version (428 if missing, +// 400 if non-numeric), returning briefs-package errors. +func parseBriefIfMatch(ifMatch *string) (int64, error) { + if ifMatch == nil || *ifMatch == "" { + return 0, &briefs.PreconditionRequiredError{Code: "428", Message: "an If-Match header is required"} + } + v, err := strconv.ParseInt(*ifMatch, 10, 64) + if err != nil { + return 0, &briefs.BadRequestError{Code: "400", Message: "If-Match must be an integer version"} + } + return v, nil +} + +func mapBriefErr(err error) error { + switch { + case err == nil: + return nil + case errors.Is(err, domain.ErrNotFound): + return &briefs.NotFoundError{Code: "404", Message: "the resource was not found"} + case errors.Is(err, domain.ErrConflict): + return &briefs.ConflictError{Code: "409", Message: "the resource already exists"} + case errors.Is(err, domain.ErrPreconditionFailed): + return &briefs.PreconditionFailedError{Code: "412", Message: "the supplied ETag does not match the current version"} + default: + return &briefs.InternalServerError{Code: "500", Message: "an internal server error occurred"} + } +} + +func marshalStrings(ss []string) json.RawMessage { + if len(ss) == 0 { + return nil + } + b, _ := json.Marshal(ss) + return b +} + +func unmarshalStrings(j json.RawMessage) []string { + if len(j) == 0 { + return nil + } + var ss []string + _ = json.Unmarshal(j, &ss) + return ss +} + +func marshalAny(v any) json.RawMessage { + if v == nil { + return nil + } + b, err := json.Marshal(v) + if err != nil { + return nil + } + return b +} diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go new file mode 100644 index 00000000..b030af02 --- /dev/null +++ b/internal/service/orchestrator.go @@ -0,0 +1,157 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +package service + +import ( + "context" + "encoding/json" + "log/slog" + + "golang.org/x/sync/errgroup" + + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" +) + +// maxParallelDispatch bounds concurrent per-platform campaign creation. +const maxParallelDispatch = 5 + +// PlatformDispatcher creates a campaign on one ad platform. Implementations are +// the per-provider adapters (added as those integrations land); the +// orchestrator is agnostic to them. +type PlatformDispatcher interface { + // Dispatch creates a campaign on the platform and returns the resulting + // campaign row (platform_campaign_id, status, result populated). + Dispatch(ctx context.Context, brief *model.CampaignBrief, platform model.Provider, config json.RawMessage) (*model.Campaign, error) +} + +// Orchestrator runs async multi-platform campaign creation for a brief. +type Orchestrator struct { + briefs domain.BriefRepository + campaigns domain.CampaignRepository + jobs domain.JobRepository + dispatchers map[model.Provider]PlatformDispatcher +} + +// NewOrchestrator constructs an Orchestrator. dispatchers may be empty; a +// platform with no registered dispatcher is recorded as a failed result. +func NewOrchestrator(briefs domain.BriefRepository, campaigns domain.CampaignRepository, jobs domain.JobRepository, dispatchers map[model.Provider]PlatformDispatcher) *Orchestrator { + if dispatchers == nil { + dispatchers = map[model.Provider]PlatformDispatcher{} + } + return &Orchestrator{briefs: briefs, campaigns: campaigns, jobs: jobs, dispatchers: dispatchers} +} + +// platformResult is the per-platform outcome recorded in the job result. +type platformResult struct { + Platform string `json:"platform"` + OK bool `json:"ok"` + CampaignID string `json:"campaign_id,omitempty"` + Error string `json:"error,omitempty"` +} + +// Start creates a queued job for the brief and launches dispatch asynchronously, +// returning the job id immediately. The caller polls GetJob for progress. +// +// The dispatch goroutine uses context.WithoutCancel so it survives the request +// context ending, matching the documented async model. +func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, platforms []model.Provider, config json.RawMessage) (string, error) { + job, err := o.jobs.CreateJob(ctx, brief.ID) + if err != nil { + return "", err + } + + dispatchCtx := context.WithoutCancel(ctx) + go o.run(dispatchCtx, job.ID, brief, platforms, config) + + return job.ID, nil +} + +// run performs the parallel per-platform dispatch and finalizes the job. +func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.CampaignBrief, platforms []model.Provider, config json.RawMessage) { + _ = o.jobs.UpdateJobStatus(ctx, jobID, model.JobRunning, nil, "") + + results := make([]platformResult, len(platforms)) + g, gctx := errgroup.WithContext(ctx) + g.SetLimit(maxParallelDispatch) + + for i, p := range platforms { + i, p := i, p + g.Go(func() error { + // A single platform failure must not cancel the others, so we never + // return a non-nil error from the group; failures are recorded. + res := platformResult{Platform: string(p)} + d, ok := o.dispatchers[p] + if !ok { + res.Error = "no dispatcher registered for platform" + results[i] = res + return nil + } + campaign, err := d.Dispatch(gctx, brief, p, config) + if err != nil { + res.Error = err.Error() + results[i] = res + return nil + } + // Stamp ownership before persisting so a dispatcher can't cause a + // campaign to be written with missing/wrong ownership. Set on a + // fresh reference the dispatcher returned; the invariant is one + // campaign per (brief, platform) owned by exactly this job. + campaign.JobID = &jobID + campaign.BriefID = brief.ID + campaign.ProjectID = brief.ProjectID + campaign.Platform = p + if _, err := o.campaigns.UpsertCampaign(gctx, campaign); err != nil { + res.Error = "persist campaign: " + err.Error() + results[i] = res + return nil + } + res.OK = true + res.CampaignID = campaign.PlatformCampaignID + results[i] = res + return nil + }) + } + // Individual goroutines never return an error (per-platform failures are + // recorded in results), so a non-nil group error means the errgroup context + // was cancelled (e.g. pod shutdown) — surface it rather than dropping it. + if werr := g.Wait(); werr != nil { + slog.ErrorContext(ctx, "campaign dispatch interrupted", "job_id", jobID, "error", werr) + } + + status := aggregateStatus(results) + payload, err := json.Marshal(results) + if err != nil { + // Don't store a null result (which would make the job unpollable); + // record the marshal failure in the job's error field and fail the job. + slog.ErrorContext(ctx, "failed to marshal job result", "job_id", jobID, "error", err) + if uerr := o.jobs.UpdateJobStatus(ctx, jobID, model.JobFailed, nil, "failed to serialize job result: "+err.Error()); uerr != nil { + slog.ErrorContext(ctx, "failed to finalize campaign job", "job_id", jobID, "error", uerr) + } + return + } + if err := o.jobs.UpdateJobStatus(ctx, jobID, status, payload, ""); err != nil { + slog.ErrorContext(ctx, "failed to finalize campaign job", "job_id", jobID, "error", err) + } +} + +// aggregateStatus folds per-platform outcomes into the job's terminal status. +func aggregateStatus(results []platformResult) model.JobStatus { + var ok, failed int + for _, r := range results { + if r.OK { + ok++ + } else { + failed++ + } + } + switch { + case failed == 0: + return model.JobSucceeded + case ok == 0: + return model.JobFailed + default: + return model.JobPartial + } +} diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go new file mode 100644 index 00000000..e5633d1f --- /dev/null +++ b/internal/service/orchestrator_test.go @@ -0,0 +1,170 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +package service + +import ( + "context" + "encoding/json" + "errors" + "sync" + "testing" + "time" + + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" +) + +// fakeJobRepo records job status transitions. +type fakeJobRepo struct { + mu sync.Mutex + jobs map[string]*model.CampaignJob + counter int +} + +func newFakeJobRepo() *fakeJobRepo { return &fakeJobRepo{jobs: map[string]*model.CampaignJob{}} } + +func (r *fakeJobRepo) CreateJob(_ context.Context, briefID string) (*model.CampaignJob, error) { + r.mu.Lock() + defer r.mu.Unlock() + r.counter++ + id := "job-" + string(rune('a'+r.counter)) + j := &model.CampaignJob{ID: id, BriefID: briefID, Status: model.JobQueued} + r.jobs[id] = j + return j, nil +} + +func (r *fakeJobRepo) GetJob(_ context.Context, id string) (*model.CampaignJob, error) { + r.mu.Lock() + defer r.mu.Unlock() + j, ok := r.jobs[id] + if !ok { + return nil, errors.New("not found") + } + // Return a snapshot so callers don't race with concurrent UpdateJobStatus. + cp := *j + return &cp, nil +} + +func (r *fakeJobRepo) UpdateJobStatus(_ context.Context, id string, status model.JobStatus, result []byte, jobErr string) error { + r.mu.Lock() + defer r.mu.Unlock() + j := r.jobs[id] + j.Status = status + j.Result = result + j.Error = jobErr + return nil +} + +// fakeCampaignRepo records upserted campaigns. +type fakeCampaignRepo struct { + mu sync.Mutex + upserted []*model.Campaign +} + +func (r *fakeCampaignRepo) GetCampaign(context.Context, string, string, string) (*model.Campaign, error) { + return nil, errors.New("unused") +} +func (r *fakeCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { + r.mu.Lock() + defer r.mu.Unlock() + c.Version = 1 + r.upserted = append(r.upserted, c) + return c, nil +} +func (r *fakeCampaignRepo) ReplaceCampaign(context.Context, *model.Campaign, int64) (*model.Campaign, error) { + return nil, errors.New("unused") +} + +// okDispatcher always succeeds. +type okDispatcher struct{} + +func (okDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + return &model.Campaign{PlatformCampaignID: "pc-" + string(p), Status: "active", CampaignName: "n"}, nil +} + +// failDispatcher always fails. +type failDispatcher struct{} + +func (failDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ model.Provider, _ json.RawMessage) (*model.Campaign, error) { + return nil, errors.New("boom") +} + +func waitForTerminal(t *testing.T, jobs *fakeJobRepo, id string) *model.CampaignJob { + t.Helper() + for i := 0; i < 100; i++ { + j, _ := jobs.GetJob(context.Background(), id) + if j.Status.Terminal() { + return j + } + time.Sleep(5 * time.Millisecond) + } + t.Fatal("job did not reach terminal status") + return nil +} + +func TestOrchestrator_AllSucceed(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(nil, camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: okDispatcher{}, + model.ProviderLinkedInAds: okDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, err := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + if err != nil { + t.Fatalf("Start: %v", err) + } + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobSucceeded { + t.Errorf("status = %s, want succeeded", j.Status) + } + if len(camps.upserted) != 2 { + t.Errorf("upserted %d campaigns, want 2", len(camps.upserted)) + } +} + +func TestOrchestrator_PartialFailure(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(nil, camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: okDispatcher{}, + model.ProviderLinkedInAds: failDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobPartial { + t.Errorf("status = %s, want partial", j.Status) + } +} + +func TestOrchestrator_NoDispatcherFails(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(nil, camps, jobs, nil) // no dispatchers + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } +} + +func TestAggregateStatus(t *testing.T) { + cases := []struct { + name string + results []platformResult + want model.JobStatus + }{ + {"all ok", []platformResult{{OK: true}, {OK: true}}, model.JobSucceeded}, + {"all fail", []platformResult{{OK: false}, {OK: false}}, model.JobFailed}, + {"mixed", []platformResult{{OK: true}, {OK: false}}, model.JobPartial}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if got := aggregateStatus(tc.results); got != tc.want { + t.Errorf("aggregateStatus = %s, want %s", got, tc.want) + } + }) + } +} From d3c3541be4b66335641713c004f0340015e01bbe Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 11:18:32 -0700 Subject: [PATCH 02/46] fix(briefs): archived-slug reuse + surface transient 412 re-fetch errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address the 3 Copilot findings that were open on #10 (merged) — fix them here in the stacked #11 since it owns this area: - migration 000002: replace the full UNIQUE (project_id, event_slug) with a partial unique index excluding archived rows, so archiving a brief frees its (project_id, event_slug) slot and a new brief for the same event can be created. Mirrors the connection tables' partial-unique pattern. - brief_repo / campaign_repo: on the version-mismatch path, surface a non-nil, non-ErrNotFound re-fetch error instead of masking it as 412, consistent with ConnectionRepo.Update (a transient DB error shouldn't tell the caller to retry with a fresh ETag). LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- internal/infrastructure/postgres/brief_repo.go | 13 +++++++++++-- internal/infrastructure/postgres/campaign_repo.go | 11 +++++++++-- .../000002_create_brief_campaign_tables.up.sql | 13 +++++++++---- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/internal/infrastructure/postgres/brief_repo.go b/internal/infrastructure/postgres/brief_repo.go index f1c55059..97679835 100644 --- a/internal/infrastructure/postgres/brief_repo.go +++ b/internal/infrastructure/postgres/brief_repo.go @@ -80,10 +80,19 @@ func (r *BriefRepo) ReplaceBrief(ctx context.Context, b *model.CampaignBrief, ex return nil, fmt.Errorf("replace brief: %w", err) } if tag.RowsAffected() == 0 { - if _, gerr := r.GetBrief(ctx, b.ProjectID, b.ID); errors.Is(gerr, domain.ErrNotFound) { + // Distinguish missing from stale version. Surface a transient re-fetch + // error rather than masking it as a precondition failure (which would make + // the caller retry with a fresh ETag instead of backing off on a server + // error), consistent with ConnectionRepo.Update. + _, gerr := r.GetBrief(ctx, b.ProjectID, b.ID) + switch { + case errors.Is(gerr, domain.ErrNotFound): return nil, domain.ErrNotFound + case gerr != nil: + return nil, gerr + default: + return nil, domain.ErrPreconditionFailed } - return nil, domain.ErrPreconditionFailed } return r.GetBrief(ctx, b.ProjectID, b.ID) } diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index 9e7784a2..87f2ac8b 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -82,10 +82,17 @@ func (r *CampaignRepo) ReplaceCampaign(ctx context.Context, c *model.Campaign, e return nil, fmt.Errorf("replace campaign: %w", err) } if tag.RowsAffected() == 0 { - if _, gerr := r.GetCampaign(ctx, c.ProjectID, c.BriefID, c.ID); errors.Is(gerr, domain.ErrNotFound) { + // Surface a transient re-fetch error rather than masking it as a + // precondition failure, consistent with ConnectionRepo.Update. + _, gerr := r.GetCampaign(ctx, c.ProjectID, c.BriefID, c.ID) + switch { + case errors.Is(gerr, domain.ErrNotFound): return nil, domain.ErrNotFound + case gerr != nil: + return nil, gerr + default: + return nil, domain.ErrPreconditionFailed } - return nil, domain.ErrPreconditionFailed } return r.GetCampaign(ctx, c.ProjectID, c.BriefID, c.ID) } diff --git a/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql b/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql index cb393205..6c32bb7e 100644 --- a/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql +++ b/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql @@ -23,11 +23,16 @@ CREATE TABLE IF NOT EXISTS campaign_briefs ( approved_by JSONB, approved_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), - UNIQUE (project_id, event_slug) + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); --- No standalone project_id index: UNIQUE (project_id, event_slug) already --- indexes project_id as its leftmost column, covering project_id-only lookups. +-- Singleton per (project, event) but only among live briefs: a partial unique +-- index that excludes archived rows, so archiving a brief frees its +-- (project_id, event_slug) slot and a new brief for the same event can be +-- created (a full UNIQUE constraint would permanently reserve the slot). Mirrors +-- the connection tables' partial-unique pattern. This index also covers +-- project_id-only lookups as its leftmost column, so no standalone index needed. +CREATE UNIQUE INDEX IF NOT EXISTS uq_campaign_briefs_project_event + ON campaign_briefs (project_id, event_slug) WHERE status <> 'archived'; CREATE TABLE IF NOT EXISTS campaign_jobs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), From 04f5ea7bb6c1f125181fc31bf65d83924737ab24 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 11:25:55 -0700 Subject: [PATCH 03/46] fix(briefs): tenant-scope GetJob, 400 on empty token, 503 no-db, tests Address 4 Copilot findings on PR #11: - GetJob ignored projectId (route is /projects/{project_id}/jobs/{job_id}), so a caller authorized for one project who learned a job UUID could read another project's job. Scope the lookup by joining campaign_jobs -> campaign_briefs on project_id (tenant isolation). - Empty bearer token returned 500; return 400 BadRequest instead (client fault, consistent with the connection service). - Brief service is now wired with a nil repo in the no-database path and guarded by ensureAvailable(), so brief routes return the typed 503 instead of 404. - Add BriefService unit tests (nil-repo 503 across handlers, empty-token 400). LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- internal/container/container.go | 7 +-- internal/domain/brief_port.go | 2 +- internal/infrastructure/postgres/job_repo.go | 15 +++++-- internal/service/brief.go | 42 ++++++++++++++++- internal/service/brief_test.go | 47 ++++++++++++++++++++ internal/service/orchestrator_test.go | 4 +- 6 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 internal/service/brief_test.go diff --git a/internal/container/container.go b/internal/container/container.go index b9d58e2b..4fbff14e 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -54,10 +54,11 @@ func NewContainer(cfg *config.Config) (*Container, error) { if cfg.DatabaseURL == "" { slog.Warn("database URL not set; connection endpoints will return 503 Service Unavailable") c.Service = service.NewCampaignService(nil) - // Wire the connection service with a nil repo so its routes are still - // mounted and return the typed 503 ServiceUnavailable advertised by the - // OpenAPI contract, rather than a bare 404 from unmounted routes. + // Wire the connection + brief services with nil repos so their routes are + // still mounted and return the typed 503 ServiceUnavailable advertised by + // the OpenAPI contract, rather than a bare 404 from unmounted routes. c.Connections = service.NewConnectionService(nil, nil) + c.Briefs = service.NewBriefService(nil, nil, nil, nil) slog.Info("dependency container initialized (no database)") return c, nil } diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index f8d68986..21db2404 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -60,7 +60,7 @@ type JobRepository interface { // CreateJob inserts a queued job for a brief. CreateJob(ctx context.Context, briefID string) (*model.CampaignJob, error) // GetJob returns a job by id, or ErrNotFound. - GetJob(ctx context.Context, id string) (*model.CampaignJob, error) + GetJob(ctx context.Context, projectID, id string) (*model.CampaignJob, error) // UpdateJobStatus sets a job's status (any JobStatus, e.g. running or a // terminal succeeded/partial/failed) and its result/error. UpdateJobStatus(ctx context.Context, id string, status model.JobStatus, result []byte, jobErr string) error diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index 46ee880d..39d8474d 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -26,6 +26,10 @@ var _ domain.JobRepository = (*JobRepo)(nil) const jobCols = `id::text, brief_id::text, status, result, error, created_at, updated_at, expires_at` +// jobColsPrefixed is jobCols with a `j.` table alias, for queries that JOIN +// campaign_jobs (aliased j) against campaign_briefs. +const jobColsPrefixed = `j.id::text, j.brief_id::text, j.status, j.result, j.error, j.created_at, j.updated_at, j.expires_at` + // CreateJob inserts a queued job for a brief. func (r *JobRepo) CreateJob(ctx context.Context, briefID string) (*model.CampaignJob, error) { q := `INSERT INTO campaign_jobs (brief_id) VALUES ($1) RETURNING ` + jobCols @@ -37,9 +41,14 @@ func (r *JobRepo) CreateJob(ctx context.Context, briefID string) (*model.Campaig } // GetJob returns a job by id. -func (r *JobRepo) GetJob(ctx context.Context, id string) (*model.CampaignJob, error) { - q := `SELECT ` + jobCols + ` FROM campaign_jobs WHERE id=$1` - j, err := scanJob(r.db.QueryRow(ctx, q, id)) +func (r *JobRepo) GetJob(ctx context.Context, projectID, id string) (*model.CampaignJob, error) { + // Scope the lookup to the caller's project by joining through the owning + // brief: a job UUID alone must not expose a job belonging to another project + // (tenant isolation — the route is /projects/{project_id}/jobs/{job_id}). + q := `SELECT ` + jobColsPrefixed + ` FROM campaign_jobs j + JOIN campaign_briefs b ON b.id = j.brief_id + WHERE j.id=$1 AND b.project_id=$2` + j, err := scanJob(r.db.QueryRow(ctx, q, id, projectID)) if err != nil { if errors.Is(err, pgx.ErrNoRows) { return nil, domain.ErrNotFound diff --git a/internal/service/brief.go b/internal/service/brief.go index cc587f15..2790fbac 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -35,11 +35,22 @@ func NewBriefService(b domain.BriefRepository, c domain.CampaignRepository, j do return &BriefService{briefs: b, campaigns: c, jobs: j, orch: orch} } +// ensureAvailable returns the typed 503 ServiceUnavailable error when the +// service has no database wired (DATABASE_URL unset). The brief routes are still +// mounted in that mode so runtime matches the published OpenAPI contract, +// consistent with the connection service. +func (s *BriefService) ensureAvailable() error { + if s.briefs == nil { + return &briefs.ConnServiceUnavailableError{Code: "503", Message: "brief storage is not configured"} + } + return nil +} + // JWTAuth mirrors the connection service: it records the authenticated actor // (validated by Heimdall at the gateway) into the context for attribution. func (s *BriefService) JWTAuth(ctx context.Context, token string, _ *security.JWTScheme) (context.Context, error) { if token == "" { - return ctx, &briefs.InternalServerError{Code: "500", Message: "missing bearer token"} + return ctx, &briefs.BadRequestError{Code: "400", Message: "missing bearer token"} } if a := actorFromToken(token); a != nil { ctx = context.WithValue(ctx, actorCtxKey{}, a) @@ -50,6 +61,9 @@ func (s *BriefService) JWTAuth(ctx context.Context, token string, _ *security.JW // ─── Briefs ─── func (s *BriefService) CreateBrief(ctx context.Context, p *briefs.CreateBriefPayload) (*briefs.Brief, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } in := p.Brief b := &model.CampaignBrief{ ProjectID: p.ProjectID, @@ -70,6 +84,9 @@ func (s *BriefService) CreateBrief(ctx context.Context, p *briefs.CreateBriefPay } func (s *BriefService) GetBrief(ctx context.Context, p *briefs.GetBriefPayload) (*briefs.Brief, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } b, err := s.briefs.GetBrief(ctx, p.ProjectID, p.BriefID) if err != nil { return nil, mapBriefErr(err) @@ -78,6 +95,9 @@ func (s *BriefService) GetBrief(ctx context.Context, p *briefs.GetBriefPayload) } func (s *BriefService) UpdateBrief(ctx context.Context, p *briefs.UpdateBriefPayload) (*briefs.Brief, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } version, err := parseBriefIfMatch(p.IfMatch) if err != nil { return nil, err @@ -103,6 +123,9 @@ func (s *BriefService) UpdateBrief(ctx context.Context, p *briefs.UpdateBriefPay } func (s *BriefService) ApproveBrief(ctx context.Context, p *briefs.ApproveBriefPayload) (*briefs.Brief, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } b, err := s.briefs.Approve(ctx, p.ProjectID, p.BriefID, actorFromCtx(ctx)) if err != nil { return nil, mapBriefErr(err) @@ -111,12 +134,18 @@ func (s *BriefService) ApproveBrief(ctx context.Context, p *briefs.ApproveBriefP } func (s *BriefService) DeleteBrief(ctx context.Context, p *briefs.DeleteBriefPayload) error { + if err := s.ensureAvailable(); err != nil { + return err + } return mapBriefErr(s.briefs.ArchiveBrief(ctx, p.ProjectID, p.BriefID)) } // ─── Campaigns ─── func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCampaignsPayload) (*briefs.JobCreateResponse, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } brief, err := s.briefs.GetBrief(ctx, p.ProjectID, p.BriefID) if err != nil { return nil, mapBriefErr(err) @@ -141,6 +170,9 @@ func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCamp } func (s *BriefService) GetCampaign(ctx context.Context, p *briefs.GetCampaignPayload) (*briefs.Campaign, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } c, err := s.campaigns.GetCampaign(ctx, p.ProjectID, p.BriefID, p.CampaignID) if err != nil { return nil, mapBriefErr(err) @@ -149,6 +181,9 @@ func (s *BriefService) GetCampaign(ctx context.Context, p *briefs.GetCampaignPay } func (s *BriefService) UpdateCampaign(ctx context.Context, p *briefs.UpdateCampaignPayload) (*briefs.Campaign, error) { + if err := s.ensureAvailable(); err != nil { + return nil, err + } version, err := parseBriefIfMatch(p.IfMatch) if err != nil { return nil, err @@ -169,7 +204,10 @@ func (s *BriefService) UpdateCampaign(ctx context.Context, p *briefs.UpdateCampa } func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*briefs.JobPollResponse, error) { - j, err := s.jobs.GetJob(ctx, p.JobID) + if err := s.ensureAvailable(); err != nil { + return nil, err + } + j, err := s.jobs.GetJob(ctx, p.ProjectID, p.JobID) if err != nil { return nil, mapBriefErr(err) } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go new file mode 100644 index 00000000..cdf47156 --- /dev/null +++ b/internal/service/brief_test.go @@ -0,0 +1,47 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +package service + +import ( + "context" + "testing" + + briefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" +) + +// A BriefService built with nil repos (DATABASE_URL unset) must return the typed +// 503 ServiceUnavailable for every route rather than panicking on a nil repo, so +// runtime matches the published OpenAPI contract (mirrors the connection service). +func TestBriefService_NilRepo_ReturnsServiceUnavailable(t *testing.T) { + s := NewBriefService(nil, nil, nil, nil) + ctx := context.Background() + + if _, err := s.GetBrief(ctx, &briefs.GetBriefPayload{ProjectID: "cncf", BriefID: "b1"}); !isBriefUnavailable(err) { + t.Errorf("GetBrief: expected *briefs.ConnServiceUnavailableError, got %T (%v)", err, err) + } + if _, err := s.CreateBrief(ctx, &briefs.CreateBriefPayload{ProjectID: "cncf", Brief: &briefs.BriefInput{}}); !isBriefUnavailable(err) { + t.Errorf("CreateBrief: expected *briefs.ConnServiceUnavailableError, got %T (%v)", err, err) + } + if _, err := s.GetJob(ctx, &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}); !isBriefUnavailable(err) { + t.Errorf("GetJob: expected *briefs.ConnServiceUnavailableError, got %T (%v)", err, err) + } + if err := s.DeleteBrief(ctx, &briefs.DeleteBriefPayload{ProjectID: "cncf", BriefID: "b1"}); !isBriefUnavailable(err) { + t.Errorf("DeleteBrief: expected *briefs.ConnServiceUnavailableError, got %T (%v)", err, err) + } +} + +// A missing bearer token is a client-side problem and must map to 400, not 500 +// (a 500 misrepresents it as a server fault and can trigger ops alerting). +func TestBriefService_JWTAuth_EmptyTokenIsBadRequest(t *testing.T) { + s := NewBriefService(nil, nil, nil, nil) + _, err := s.JWTAuth(context.Background(), "", nil) + if _, ok := err.(*briefs.BadRequestError); !ok { + t.Fatalf("expected *briefs.BadRequestError for empty token, got %T (%v)", err, err) + } +} + +func isBriefUnavailable(err error) bool { + _, ok := err.(*briefs.ConnServiceUnavailableError) + return ok +} diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index e5633d1f..7bf42be2 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -33,7 +33,7 @@ func (r *fakeJobRepo) CreateJob(_ context.Context, briefID string) (*model.Campa return j, nil } -func (r *fakeJobRepo) GetJob(_ context.Context, id string) (*model.CampaignJob, error) { +func (r *fakeJobRepo) GetJob(_ context.Context, _, id string) (*model.CampaignJob, error) { r.mu.Lock() defer r.mu.Unlock() j, ok := r.jobs[id] @@ -92,7 +92,7 @@ func (failDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ mode func waitForTerminal(t *testing.T, jobs *fakeJobRepo, id string) *model.CampaignJob { t.Helper() for i := 0; i < 100; i++ { - j, _ := jobs.GetJob(context.Background(), id) + j, _ := jobs.GetJob(context.Background(), "", id) if j.Status.Terminal() { return j } From ca315648fdce7289fc272e5725c6aa447d80cd49 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 11:32:46 -0700 Subject: [PATCH 04/46] fix(briefs): preserve campaign fields on update, tests, comment fixes Address the Copilot round on PR #11: - UpdateCampaign built a Campaign with only name/status/config set, but ReplaceCampaign writes every column, so a config-only edit zeroed budget, dates, platform, and result. Load the existing campaign and overlay only the client-editable fields (name/status/config) before replacing. - Add BriefService handler tests: create/get happy path and the approval-gate (CreateCampaigns rejects an unapproved brief with 400). - Rename the GetJob local var that shadowed the predeclared any identifier. - Correct the orchestrator g.Wait() comment: errgroup.Wait returns the first non-nil Go-func error, not context-cancellation; the Go funcs always return nil, so the check is a defensive guard. (GetJob tenant-scoping and empty-token 400 were already fixed in d8920a2; those threads were outdated re-comments on the prior commit.) LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- internal/service/brief.go | 27 +++++----- internal/service/brief_test.go | 93 ++++++++++++++++++++++++++++++++ internal/service/orchestrator.go | 9 ++-- 3 files changed, 113 insertions(+), 16 deletions(-) diff --git a/internal/service/brief.go b/internal/service/brief.go index 2790fbac..7b4ccf48 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -188,15 +188,18 @@ func (s *BriefService) UpdateCampaign(ctx context.Context, p *briefs.UpdateCampa if err != nil { return nil, err } - c := &model.Campaign{ - ID: p.CampaignID, - ProjectID: p.ProjectID, - BriefID: p.BriefID, - CampaignName: p.Campaign.CampaignName, - Status: p.Campaign.Status, - ConfigSnapshot: marshalAny(p.Campaign.Config), - } - updated, uerr := s.campaigns.ReplaceCampaign(ctx, c, version) + // Load the existing campaign and overlay only the client-editable fields + // (name, status, config). ReplaceCampaign writes every column, so budget, + // dates, platform, and result must be carried over from the stored row or a + // config-only edit would zero them out. + existing, gerr := s.campaigns.GetCampaign(ctx, p.ProjectID, p.BriefID, p.CampaignID) + if gerr != nil { + return nil, mapBriefErr(gerr) + } + existing.CampaignName = p.Campaign.CampaignName + existing.Status = p.Campaign.Status + existing.ConfigSnapshot = marshalAny(p.Campaign.Config) + updated, uerr := s.campaigns.ReplaceCampaign(ctx, existing, version) if uerr != nil { return nil, mapBriefErr(uerr) } @@ -213,9 +216,9 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br } resp := &briefs.JobPollResponse{JobID: j.ID, Status: string(j.Status)} if len(j.Result) > 0 { - var any any - if json.Unmarshal(j.Result, &any) == nil { - resp.Result = any + var result any + if json.Unmarshal(j.Result, &result) == nil { + resp.Result = result } } if j.Error != "" { diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index cdf47156..472c3fd6 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -8,8 +8,57 @@ import ( "testing" briefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" ) +// fakeBriefRepo is a minimal in-memory BriefRepository for handler tests. +type fakeBriefRepo struct { + briefs map[string]*model.CampaignBrief // key: projectID|id +} + +func newFakeBriefRepo() *fakeBriefRepo { + return &fakeBriefRepo{briefs: map[string]*model.CampaignBrief{}} +} + +func briefKey(projectID, id string) string { return projectID + "|" + id } + +func (r *fakeBriefRepo) GetBrief(_ context.Context, projectID, id string) (*model.CampaignBrief, error) { + b, ok := r.briefs[briefKey(projectID, id)] + if !ok { + return nil, domain.ErrNotFound + } + return b, nil +} + +func (r *fakeBriefRepo) CreateBrief(_ context.Context, b *model.CampaignBrief) (*model.CampaignBrief, error) { + b.ID = "b-new" + b.Version = 1 + r.briefs[briefKey(b.ProjectID, b.ID)] = b + return b, nil +} + +func (r *fakeBriefRepo) ReplaceBrief(_ context.Context, b *model.CampaignBrief, _ int64) (*model.CampaignBrief, error) { + r.briefs[briefKey(b.ProjectID, b.ID)] = b + return b, nil +} + +func (r *fakeBriefRepo) Approve(_ context.Context, projectID, id string, _ *model.Actor) (*model.CampaignBrief, error) { + b, ok := r.briefs[briefKey(projectID, id)] + if !ok { + return nil, domain.ErrNotFound + } + b.Status = model.BriefApproved + return b, nil +} + +func (r *fakeBriefRepo) ArchiveBrief(_ context.Context, projectID, id string) error { + if _, ok := r.briefs[briefKey(projectID, id)]; !ok { + return domain.ErrNotFound + } + return nil +} + // A BriefService built with nil repos (DATABASE_URL unset) must return the typed // 503 ServiceUnavailable for every route rather than panicking on a nil repo, so // runtime matches the published OpenAPI contract (mirrors the connection service). @@ -45,3 +94,47 @@ func isBriefUnavailable(err error) bool { _, ok := err.(*briefs.ConnServiceUnavailableError) return ok } + +func newTestBriefService(repo *fakeBriefRepo) *BriefService { + camps := &fakeCampaignRepo{} + jobs := newFakeJobRepo() + orch := NewOrchestrator(repo, camps, jobs, nil) + return NewBriefService(repo, camps, jobs, orch) +} + +func TestBriefService_CreateAndGet_HappyPath(t *testing.T) { + repo := newFakeBriefRepo() + s := newTestBriefService(repo) + created, err := s.CreateBrief(context.Background(), &briefs.CreateBriefPayload{ + ProjectID: "cncf", + Brief: &briefs.BriefInput{ProgramType: "events", EventSlug: "kubecon-2025"}, + }) + if err != nil { + t.Fatalf("CreateBrief: %v", err) + } + got, err := s.GetBrief(context.Background(), &briefs.GetBriefPayload{ProjectID: "cncf", BriefID: created.ID}) + if err != nil { + t.Fatalf("GetBrief: %v", err) + } + if got.EventSlug != "kubecon-2025" { + t.Errorf("event_slug = %q, want kubecon-2025", got.EventSlug) + } +} + +// CreateCampaigns must reject a brief that has not been approved (400), the +// approval-gate invariant from the architecture (a brief must be approved +// before campaigns can be created from it). +func TestBriefService_CreateCampaigns_RejectsUnapprovedBrief(t *testing.T) { + repo := newFakeBriefRepo() + repo.briefs[briefKey("cncf", "b1")] = &model.CampaignBrief{ + ID: "b1", ProjectID: "cncf", Status: model.BriefDraft, + } + s := newTestBriefService(repo) + _, err := s.CreateCampaigns(context.Background(), &briefs.CreateCampaignsPayload{ + ProjectID: "cncf", BriefID: "b1", + Input: &briefs.CampaignCreateInput{Platforms: []string{"google-ads"}}, + }) + if _, ok := err.(*briefs.BadRequestError); !ok { + t.Fatalf("expected *briefs.BadRequestError for unapproved brief, got %T (%v)", err, err) + } +} diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index b030af02..a8f193d0 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -113,11 +113,12 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa return nil }) } - // Individual goroutines never return an error (per-platform failures are - // recorded in results), so a non-nil group error means the errgroup context - // was cancelled (e.g. pod shutdown) — surface it rather than dropping it. + // Wait for all dispatches to finish. Each goroutine returns nil and records + // per-platform failures in results, so g.Wait() is expected to be nil; it is + // checked only as a defensive guard in case a future change starts returning + // an error from a Go func (errgroup.Wait returns the first such error). if werr := g.Wait(); werr != nil { - slog.ErrorContext(ctx, "campaign dispatch interrupted", "job_id", jobID, "error", werr) + slog.ErrorContext(ctx, "campaign dispatch returned an error", "job_id", jobID, "error", werr) } status := aggregateStatus(results) From 17928faf8b48b7dd81aab4f5401497a8bd825438 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 11:35:44 -0700 Subject: [PATCH 05/46] fix(briefs): reject empty platforms, log running-status error, align doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address the Copilot round on PR #11: - CreateCampaigns now rejects an empty platforms array with 400 rather than creating a no-op job that instantly aggregates to succeeded. Add a test. - Orchestrator.run no longer discards the error from the initial 'running' status transition; log it (dispatch still proceeds, final write corrects the status) so a stuck-at-queued job isn't silent. - design/brief.go: correct the job result doc — results are written once at terminal state, not 'as each completes'; regenerated gen/. LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- design/brief.go | 2 +- .../client/types.go | 2 +- .../server/types.go | 2 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 2 +- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 2 +- gen/lfx_v2_campaign_service_briefs/service.go | 2 +- internal/service/brief.go | 5 +++++ internal/service/brief_test.go | 17 +++++++++++++++++ internal/service/orchestrator.go | 7 ++++++- 11 files changed, 36 insertions(+), 9 deletions(-) diff --git a/design/brief.go b/design/brief.go index e6f2ca0c..ecaa17a7 100644 --- a/design/brief.go +++ b/design/brief.go @@ -73,7 +73,7 @@ var JobPollResponse = Type("job-poll-response", func() { Attribute("status", String, "Job status", func() { Enum("queued", "running", "succeeded", "partial", "failed") }) - Attribute("result", Any, "Per-platform results, populated as each completes") + Attribute("result", Any, "Per-platform results, written once when the job reaches a terminal state") Attribute("error", String, "Terminal error, if any") Required("job_id", "status") }) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index 426abd50..85724045 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -184,7 +184,7 @@ type GetJobResponseBody struct { JobID *string `form:"job_id,omitempty" json:"job_id,omitempty" xml:"job_id,omitempty"` // Job status Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` - // Per-platform results, populated as each completes + // Per-platform results, written once when the job reaches a terminal state Result any `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` // Terminal error, if any Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 0a84552f..e9d70e2f 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -184,7 +184,7 @@ type GetJobResponseBody struct { JobID string `form:"job_id" json:"job_id" xml:"job_id"` // Job status Status string `form:"status" json:"status" xml:"status"` - // Per-platform results, populated as each completes + // Per-platform results, written once when the job reaches a terminal state Result any `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` // Terminal error, if any Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 420ae6c5..4c590708 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Ut voluptas et accusamus natus."},"id":{"type":"string","description":"Brief UUID","example":"Quasi voluptatum officia quod."},"platforms":{"type":"array","items":{"type":"string","example":"Architecto vero quisquam vero labore laudantium maiores."},"description":"Suggested default platforms","example":["Dignissimos consequatur.","Qui minima."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi aperiam."},"project_id":{"type":"string","description":"Owning project","example":"Amet quia inventore est quia enim illo."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam et officia sequi et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1640913123388047084,"format":"int64"}},"example":{"event_slug":"Autem recusandae totam.","id":"Tempora voluptatem sed quia excepturi dolores.","platforms":["Necessitatibus veritatis amet ut rerum quidem ut.","Velit quo.","Modi reiciendis aliquam.","Quidem explicabo expedita sunt."],"program_type":"Officia quidem non qui voluptates natus cum.","project_id":"Delectus voluptatem voluptas ullam dolores rem.","status":"archived","url":"Rerum nisi.","version":7840037444703092578},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et adipisci cumque molestiae eos."},"event_details":{"description":"Extracted event/course details","example":"Quisquam sed."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quia est aspernatur possimus exercitationem."},"keywords":{"description":"Keyword list","example":"Aut iusto quos impedit eos."},"platforms":{"type":"array","items":{"type":"string","example":"Cumque totam nulla aut reprehenderit."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Rerum error incidunt voluptas.","Quaerat est nobis saepe fugit.","Fuga rem.","Corrupti et."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Adipisci rerum consequatur placeat ea odio."},"url":{"type":"string","description":"Event/course page URL","example":"Quo quidem."}},"example":{"copy":"Aliquam vero ducimus.","event_details":"Voluptas aspernatur aperiam.","event_slug":"Nesciunt ipsum et.","keywords":"Recusandae aut perferendis.","platforms":["Maxime maxime porro enim.","Nobis itaque est enim magnam pariatur.","Est totam qui praesentium ipsam officiis cum.","Recusandae est adipisci ullam pariatur."],"program_type":"membership","targeting":"Est eaque ipsam harum nisi nobis.","url":"Dolorum eveniet qui alias ea."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Alias ad voluptatem accusantium tempore impedit."},"campaign_name":{"type":"string","description":"Campaign name","example":"Excepturi saepe sit vel perspiciatis neque."},"id":{"type":"string","description":"Campaign UUID","example":"Numquam quidem qui."},"platform":{"type":"string","description":"Channel","example":"Et expedita itaque quos."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quos accusantium fugit."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam possimus dolor facere velit dolores."},"status":{"type":"string","description":"Campaign status","example":"Qui molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":33967422648266414,"format":"int64"}},"example":{"brief_id":"Modi nobis aliquid rerum consequatur officiis velit.","campaign_name":"Quos cum porro architecto.","id":"Minus dolor accusantium dolores cum molestias.","platform":"Dolores assumenda accusantium mollitia fugiat dolore similique.","platform_campaign_id":"Omnis voluptates quaerat.","project_id":"Voluptatibus quis adipisci aut rerum ut blanditiis.","status":"Aperiam doloribus aut.","version":6898451533262184218},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Consequatur non cumque laudantium quod modi voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Platforms to create campaigns on (binding selection)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]}},"example":{"config":"Est voluptas sequi.","platforms":["Dicta et ad non quia.","Voluptatibus tempora possimus consequatur est.","Nihil et laudantium."]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Placeat cumque iure veritatis cumque nisi."},"config":{"description":"Campaign configuration snapshot","example":"Natus placeat esse est in deserunt aliquid."},"status":{"type":"string","description":"Campaign status","example":"Distinctio ipsum ab."}},"example":{"campaign_name":"Explicabo doloremque.","config":"Id ipsa perspiciatis sunt ut velit.","status":"Sed et odio sunt totam incidunt."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur qui molestiae velit ratione nesciunt et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Neque ut rerum facilis quia molestiae ratione."},"label":{"type":"string","description":"Optional friendly name","example":"Ut mollitia accusantium dignissimos."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Illum ratione voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Fugit provident officia officiis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4206253090509603863,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Et eveniet."},"platforms":{"type":"array","items":{"type":"string","example":"Ut non odio eius sed."},"description":"Platforms this job will create on","example":["Perspiciatis nihil.","Mollitia tempora minima voluptas.","Facere aut facilis porro dolor ipsa."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Aut hic.","platforms":["Et exercitationem aut.","Deleniti odit rerum quidem accusamus.","Provident provident.","Odit iusto ad animi eos doloribus autem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Dolore suscipit reprehenderit."},"job_id":{"type":"string","description":"Job UUID","example":"Aut mollitia aut molestiae exercitationem et."},"result":{"description":"Per-platform results, populated as each completes","example":"Perspiciatis quisquam perferendis autem ut alias quis."},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Quod et aut consequatur inventore enim reiciendis.","job_id":"Aut animi laudantium ullam.","result":"Et id laboriosam nihil.","status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Ut voluptas et accusamus natus."},"id":{"type":"string","description":"Brief UUID","example":"Quasi voluptatum officia quod."},"platforms":{"type":"array","items":{"type":"string","example":"Architecto vero quisquam vero labore laudantium maiores."},"description":"Suggested default platforms","example":["Dignissimos consequatur.","Qui minima."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi aperiam."},"project_id":{"type":"string","description":"Owning project","example":"Amet quia inventore est quia enim illo."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam et officia sequi et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1640913123388047084,"format":"int64"}},"example":{"event_slug":"Autem recusandae totam.","id":"Tempora voluptatem sed quia excepturi dolores.","platforms":["Necessitatibus veritatis amet ut rerum quidem ut.","Velit quo.","Modi reiciendis aliquam.","Quidem explicabo expedita sunt."],"program_type":"Officia quidem non qui voluptates natus cum.","project_id":"Delectus voluptatem voluptas ullam dolores rem.","status":"archived","url":"Rerum nisi.","version":7840037444703092578},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et adipisci cumque molestiae eos."},"event_details":{"description":"Extracted event/course details","example":"Quisquam sed."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quia est aspernatur possimus exercitationem."},"keywords":{"description":"Keyword list","example":"Aut iusto quos impedit eos."},"platforms":{"type":"array","items":{"type":"string","example":"Cumque totam nulla aut reprehenderit."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Rerum error incidunt voluptas.","Quaerat est nobis saepe fugit.","Fuga rem.","Corrupti et."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Adipisci rerum consequatur placeat ea odio."},"url":{"type":"string","description":"Event/course page URL","example":"Quo quidem."}},"example":{"copy":"Aliquam vero ducimus.","event_details":"Voluptas aspernatur aperiam.","event_slug":"Nesciunt ipsum et.","keywords":"Recusandae aut perferendis.","platforms":["Maxime maxime porro enim.","Nobis itaque est enim magnam pariatur.","Est totam qui praesentium ipsam officiis cum.","Recusandae est adipisci ullam pariatur."],"program_type":"membership","targeting":"Est eaque ipsam harum nisi nobis.","url":"Dolorum eveniet qui alias ea."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Alias ad voluptatem accusantium tempore impedit."},"campaign_name":{"type":"string","description":"Campaign name","example":"Excepturi saepe sit vel perspiciatis neque."},"id":{"type":"string","description":"Campaign UUID","example":"Numquam quidem qui."},"platform":{"type":"string","description":"Channel","example":"Et expedita itaque quos."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quos accusantium fugit."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam possimus dolor facere velit dolores."},"status":{"type":"string","description":"Campaign status","example":"Qui molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":33967422648266414,"format":"int64"}},"example":{"brief_id":"Modi nobis aliquid rerum consequatur officiis velit.","campaign_name":"Quos cum porro architecto.","id":"Minus dolor accusantium dolores cum molestias.","platform":"Dolores assumenda accusantium mollitia fugiat dolore similique.","platform_campaign_id":"Omnis voluptates quaerat.","project_id":"Voluptatibus quis adipisci aut rerum ut blanditiis.","status":"Aperiam doloribus aut.","version":6898451533262184218},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Consequatur non cumque laudantium quod modi voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Platforms to create campaigns on (binding selection)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]}},"example":{"config":"Est voluptas sequi.","platforms":["Dicta et ad non quia.","Voluptatibus tempora possimus consequatur est.","Nihil et laudantium."]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Placeat cumque iure veritatis cumque nisi."},"config":{"description":"Campaign configuration snapshot","example":"Natus placeat esse est in deserunt aliquid."},"status":{"type":"string","description":"Campaign status","example":"Distinctio ipsum ab."}},"example":{"campaign_name":"Explicabo doloremque.","config":"Id ipsa perspiciatis sunt ut velit.","status":"Sed et odio sunt totam incidunt."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur qui molestiae velit ratione nesciunt et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Neque ut rerum facilis quia molestiae ratione."},"label":{"type":"string","description":"Optional friendly name","example":"Ut mollitia accusantium dignissimos."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Illum ratione voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Fugit provident officia officiis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4206253090509603863,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Et eveniet."},"platforms":{"type":"array","items":{"type":"string","example":"Ut non odio eius sed."},"description":"Platforms this job will create on","example":["Perspiciatis nihil.","Mollitia tempora minima voluptas.","Facere aut facilis porro dolor ipsa."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Aut hic.","platforms":["Et exercitationem aut.","Deleniti odit rerum quidem accusamus.","Provident provident.","Odit iusto ad animi eos doloribus autem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Dolore suscipit reprehenderit."},"job_id":{"type":"string","description":"Job UUID","example":"Aut mollitia aut molestiae exercitationem et."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Perspiciatis quisquam perferendis autem ut alias quis."},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Quod et aut consequatur inventore enim reiciendis.","job_id":"Aut animi laudantium ullam.","result":"Et id laboriosam nihil.","status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 42261a8f..27ad3dea 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -3970,7 +3970,7 @@ definitions: description: Job UUID example: Aut mollitia aut molestiae exercitationem et. result: - description: Per-platform results, populated as each completes + description: Per-platform results, written once when the job reaches a terminal state example: Perspiciatis quisquam perferendis autem ut alias quis. status: type: string diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index c503a375..ebc452f3 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nisi est sint consequuntur omnis."},"example":"Neque sed alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"event_slug":"Nemo perspiciatis et qui aliquam doloremque itaque.","id":"Voluptatem cupiditate voluptas aliquam facilis iste sed.","platforms":["Tenetur quia totam magni.","Repellat alias ex.","Nihil quos quo eum.","Iure praesentium ea quis."],"program_type":"Sed exercitationem ut totam ut minus.","project_id":"Laboriosam tempore vero voluptatum a quos.","status":"archived","url":"Magni autem.","version":9009752361610175063}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsum quo possimus."},"example":"Quam culpa."}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Id ducimus excepturi est et est."},"example":"Deleniti non in iure dolores et quis."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae similique assumenda ut quia."},"example":"Nam eius nulla suscipit ullam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"event_slug":"Provident itaque.","id":"Ut est nobis aspernatur.","platforms":["Cupiditate rerum magni incidunt.","Est perspiciatis soluta voluptas est.","Hic vero et.","Ut ea alias."],"program_type":"Ea enim quidem odio et sequi consequatur.","project_id":"Fugit qui tempora commodi reiciendis sit alias.","status":"draft","url":"Voluptas et accusamus quia et officiis ipsum.","version":5012609352100951313}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Corrupti sint molestiae occaecati est."},"example":"Labore est ut ratione nobis ut occaecati."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima veritatis sed impedit laborum."},"example":"Totam non qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"event_slug":"Accusantium quaerat voluptatem iure vero quam consequatur.","id":"Voluptas voluptatibus deleniti sit dolorum.","platforms":["Ex eveniet soluta adipisci occaecati.","Pariatur vero est quaerat id.","Repudiandae veniam soluta alias natus aut."],"program_type":"Illo quaerat.","project_id":"Quibusdam ut amet iusto provident sequi.","status":"approved","url":"Tempore voluptatibus quo.","version":8063317454231389303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sed magnam sed vero nulla."},"example":"Vel et et iure tempora."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum perspiciatis autem."},"example":"Sunt labore voluptate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"event_slug":"Officia et pariatur molestias autem ratione.","id":"Et ratione sit.","platforms":["Et quod porro.","Minus illo rerum ut culpa totam sequi."],"program_type":"A omnis veritatis omnis.","project_id":"Sed ipsum quia.","status":"draft","url":"Ut et veniam maiores.","version":4401871562627166296}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"example":"Consequatur laborum."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Tempora veritatis harum ab nobis fuga atque.","platforms":["Laboriosam maxime facere culpa modi.","Quod blanditiis et.","Est dolorem eos amet dolorem sed.","Architecto provident id quia porro."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Beatae non et excepturi sit minus."},"example":"Et quisquam dicta."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Eaque enim est libero enim quo."},"example":"Aut tempora dolorem neque assumenda sed."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur ipsam consequatur qui illo totam fuga."},"example":"Qui non illum expedita commodi in dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Id ducimus eius et laboriosam omnis vitae.","campaign_name":"Labore iste voluptates quos.","id":"Est voluptatum enim earum et doloribus.","platform":"Voluptatem quas non voluptas ut.","platform_campaign_id":"Modi rerum sint.","project_id":"Ea consequatur et ut.","status":"Dolorem dolor fugiat quia.","version":5825706568637163425}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Similique eaque autem impedit tenetur voluptatibus."},"example":"Libero quia quam harum molestiae cupiditate."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Et eum ex doloremque quia."},"example":"Adipisci vel."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum itaque."},"example":"Et iusto doloremque odio."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Harum distinctio reiciendis architecto atque maxime soluta.","campaign_name":"Est ut ut alias ullam fugiat deserunt.","id":"Accusantium sunt culpa libero quisquam.","platform":"Ducimus porro maxime.","platform_campaign_id":"Illo ipsam error similique quaerat.","project_id":"Rerum amet aut tempora recusandae aspernatur.","status":"Nihil iusto temporibus voluptas.","version":6352110138661359662}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ratione est omnis voluptas praesentium."},"example":"Laboriosam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Consequatur quos atque voluptates quo sit.","has_credentials":false,"id":"Autem veniam.","label":"Quam sed rem quia consequuntur ut.","login_customer_id":"Dolorum est aut blanditiis quidem qui.","project_id":"Enim unde omnis.","status":"inactive","version":8150234719088577779}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum debitis."},"example":"Occaecati quam nostrum quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quibusdam magni et rerum sed voluptatum nesciunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non dolorum odit est.","brand_kit":"Natus veritatis sint autem necessitatibus.","has_credentials":false,"id":"Tempore quo quae aut culpa impedit.","label":"Aperiam dolorem molestias natus velit.","portal_id":"Et magni adipisci magnam veniam.","project_id":"Quibusdam nulla.","sender_email":"Labore qui.","sender_name":"Et corporis architecto dolorem sapiente repellendus.","status":"deleted","version":5377129987312416334}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Totam tempora quod expedita."},"example":"Dignissimos fugiat voluptatibus natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Consequuntur omnis a dignissimos voluptate.","brand_kit":"Ab voluptatem esse.","has_credentials":false,"id":"Doloremque architecto ea et.","label":"Aliquid et in.","portal_id":"Est iste.","project_id":"Asperiores facere et exercitationem soluta possimus.","sender_email":"Ad esse neque earum modi.","sender_name":"Quis possimus placeat.","status":"inactive","version":3236501119949951161}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Dolor id.","brand_kit":"Ex id ut aut.","has_credentials":false,"id":"Modi velit vitae optio ut et consequuntur.","label":"Debitis soluta sed quod dicta aperiam eveniet.","portal_id":"Corrupti esse mollitia distinctio saepe rerum.","project_id":"Libero autem ut.","sender_email":"Eum et qui aut consequatur ut.","sender_name":"Harum maxime voluptas expedita.","status":"inactive","version":5643656240528764613}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Similique ut minima.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore vel quia cum."},"example":"Aut est et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Magni voluptas odio assumenda totam.","has_credentials":true,"id":"Ipsam vitae aut voluptatem.","label":"Iusto quis magni et velit.","org_id":"Officiis deleniti ipsam nam.","project_id":"Ab quam velit sapiente.","status":"deleted","version":6633489521806040497}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Itaque quo."},"example":"Aperiam et ab."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quae nihil magni.","has_credentials":true,"id":"Eum fugit repudiandae magnam ut.","label":"Aut tempora error.","org_id":"Voluptatem repudiandae laudantium expedita ut.","project_id":"Ab laboriosam quis sapiente ut sit.","status":"error","version":7519523340683479876}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis ea molestiae eum voluptatum."},"example":"Consequatur nemo molestiae modi ut non atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Facere harum enim consequatur id voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aperiam quia doloribus omnis."},"example":"Aut quia voluptates voluptates nisi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Mollitia a magni vel consequatur ea deserunt.","app_id":"Inventore aliquid voluptatibus iste mollitia.","has_credentials":true,"id":"Et corporis officia sint.","label":"Ratione quis.","page_id":"Occaecati eum tenetur.","project_id":"Ut in possimus quia nulla.","status":"error","version":2122032566439088184}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed commodi voluptatibus."},"example":"Fuga facilis asperiores enim nisi consequatur perspiciatis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quo sint dolorum vel.","app_id":"Dolores commodi aperiam voluptatibus.","has_credentials":false,"id":"Accusamus vero et voluptas accusamus sunt.","label":"Vel blanditiis sunt ut facere.","page_id":"Est non tenetur dolore.","project_id":"Rerum cupiditate.","status":"deleted","version":8886302108378029553}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Eius voluptatem molestiae qui suscipit rerum.","app_id":"Id facere maxime.","has_credentials":false,"id":"Saepe sit et sed qui dolorem reiciendis.","label":"Asperiores ipsum quam.","page_id":"Cum rem architecto vel quibusdam vel autem.","project_id":"Id tenetur exercitationem aperiam incidunt.","status":"error","version":3981571209223840207}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Delectus et maxime ut possimus expedita qui.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima adipisci aut quia quisquam."},"example":"Magnam nihil qui doloremque nam magnam aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Possimus dolore.","customer_id":"Vero quis consequuntur.","has_credentials":true,"id":"Autem aspernatur ea voluptatem.","label":"Dicta rerum sed perferendis.","project_id":"Voluptas eveniet assumenda accusantium aspernatur facere tempora.","status":"deleted","version":5431490552370585468}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Possimus nihil qui enim ratione voluptatem eos.","customer_id":"Debitis itaque itaque dolores nihil.","has_credentials":true,"id":"Ipsum voluptatem et quam beatae laborum omnis.","label":"Aut quis qui laudantium dolore.","project_id":"Esse aut et rem suscipit similique.","status":"inactive","version":5244933818906460264}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus accusantium expedita alias."},"example":"Iusto molestiae cupiditate quis modi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Est aut labore sint natus.","customer_id":"Quas quibusdam.","has_credentials":true,"id":"Ut fugiat magnam quia.","label":"Distinctio beatae.","project_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","status":"deleted","version":8986600307371048121}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Harum iste voluptatem et voluptatem.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et iste."},"example":"Odio eos earum fuga non est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Molestias architecto dicta quidem illo numquam.","has_credentials":false,"id":"Explicabo vero commodi.","label":"Minus ut est recusandae aspernatur eum fugit.","project_id":"Qui asperiores velit enim tempore expedita.","status":"error","version":3837864470732187499}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Exercitationem officia corrupti tempora ea."},"example":"Ipsa sint optio nobis quae corporis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Blanditiis atque rerum et officiis sapiente et.","has_credentials":true,"id":"Harum provident quia distinctio ea.","label":"Hic et sed.","project_id":"Rem harum provident provident quia laboriosam magnam.","status":"deleted","version":1429619977254656560}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Rerum reiciendis similique."},"example":"Saepe voluptatem dolores tempora qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Expedita accusantium dolorum qui sed fugiat.","has_credentials":true,"id":"Sed fugiat.","label":"Ipsam temporibus sint et necessitatibus dolorem ut.","project_id":"Eos rerum.","status":"deleted","version":3554537496380374690}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ullam temporibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Repudiandae odit."},"example":"Temporibus ipsum necessitatibus ratione possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","funding_instrument_id":"Fuga illo dolorem sit ex commodi sapiente.","has_credentials":false,"id":"Ut eveniet iusto quidem.","label":"Quaerat ut neque expedita nostrum.","project_id":"Accusamus ratione consequuntur aut et corrupti.","status":"error","version":5145245548849296683}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vero voluptates soluta."},"example":"Eligendi consequatur officia labore eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Beatae aliquam quia officiis hic ea.","funding_instrument_id":"Debitis vitae quae debitis sunt.","has_credentials":true,"id":"Aperiam et ipsam vitae.","label":"Voluptate nisi natus sint.","project_id":"Velit est quis aliquid aliquam.","status":"deleted","version":1415133980301644723}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Facilis repellat eveniet reiciendis."},"example":"Non placeat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Ut sint.","funding_instrument_id":"Rerum omnis veritatis.","has_credentials":false,"id":"Excepturi dolorem autem ipsa autem provident.","label":"Quis et odio tenetur optio.","project_id":"Iure quo culpa.","status":"inactive","version":36658389617783588}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Maxime incidunt asperiores.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsum expedita animi."},"example":"Velit at omnis autem."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Voluptas nam.","job_id":"Nesciunt asperiores et est.","result":"Facere sint totam sapiente vitae numquam ut.","status":"partial"}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos expedita voluptas qui eaque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8483228206992747737,"format":"int64"}},"example":{"etag":"Repudiandae necessitatibus dolorem enim beatae quia.","event_slug":"Consequatur in vero soluta.","id":"Laudantium nostrum ratione id eius laborum aspernatur.","platforms":["Distinctio dolore velit pariatur.","Assumenda perspiciatis dolor porro.","Et cupiditate molestiae ea ullam minima voluptatem."],"program_type":"Molestiae suscipit non iusto.","project_id":"Itaque fugit rerum cumque.","status":"draft","url":"Eius dicta.","version":5990824706789002616},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7907674416929152715,"format":"int64"}},"example":{"event_slug":"Tenetur non accusamus qui ex.","id":"Dolore est dolorem quod enim pariatur.","platforms":["Et amet sunt.","Ad quae nisi."],"program_type":"Aut architecto aliquam mollitia labore sapiente.","project_id":"Occaecati veritatis.","status":"draft","url":"Quia mollitia.","version":7441335261794230827},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Hic vel aspernatur at quam est ea."},"id":{"type":"string","description":"Brief UUID","example":"Blanditiis cum et."},"platforms":{"type":"array","items":{"type":"string","example":"Necessitatibus sit."},"description":"Suggested default platforms","example":["Aperiam deserunt nostrum consectetur.","Sed praesentium libero blanditiis qui minima.","Nulla sunt autem eos rerum provident dicta."]},"program_type":{"type":"string","description":"Funnel context","example":"Nemo nihil dolorum consequatur sed tempora qui."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum eius."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Sit dignissimos incidunt voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8003111466267168066,"format":"int64"}},"example":{"event_slug":"Veritatis itaque.","id":"Dolor dolores provident porro.","platforms":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."],"program_type":"Dolores laborum sed.","project_id":"Odio sunt esse mollitia incidunt.","status":"approved","url":"Est quis impedit.","version":9059453485160266445},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Impedit dolores."},"id":{"type":"string","description":"Brief UUID","example":"Eos iste corporis praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"At sint laborum veniam."},"description":"Suggested default platforms","example":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."]},"program_type":{"type":"string","description":"Funnel context","example":"Officia eligendi alias."},"project_id":{"type":"string","description":"Owning project","example":"Quis veniam iusto consequatur quia."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Alias minus reprehenderit dignissimos aut velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8443584423631303721,"format":"int64"}},"example":{"event_slug":"Velit quis harum recusandae est ipsum.","id":"Aperiam saepe.","platforms":["Totam voluptatem eos doloribus sint exercitationem eligendi.","Quidem sit in quia molestiae perspiciatis alias."],"program_type":"Laborum est quasi dignissimos.","project_id":"Aut animi sit esse ratione aliquid.","status":"approved","url":"Amet quaerat modi.","version":3775655592825521439},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Tempora voluptate fuga ea distinctio."},"id":{"type":"string","description":"Brief UUID","example":"Molestiae praesentium minus."},"platforms":{"type":"array","items":{"type":"string","example":"Eaque nesciunt."},"description":"Suggested default platforms","example":["Inventore in eligendi ipsam.","Vel atque eos reiciendis sit minima non.","Et itaque ut dolores in voluptas."]},"program_type":{"type":"string","description":"Funnel context","example":"Pariatur mollitia incidunt autem."},"project_id":{"type":"string","description":"Owning project","example":"Et consequuntur suscipit."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Mollitia aut tempore rerum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","url":"Nostrum similique omnis iste.","version":1280403017059047628},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et itaque rem eos et deleniti dolores."},"campaign_name":{"type":"string","description":"Campaign name","example":"Enim vitae officia dolorem odio."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus a."},"id":{"type":"string","description":"Campaign UUID","example":"Beatae velit laudantium error eum et aut."},"platform":{"type":"string","description":"Channel","example":"Facilis qui libero."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Facere qui omnis."},"project_id":{"type":"string","description":"Owning project","example":"Beatae harum similique corporis id eum."},"status":{"type":"string","description":"Campaign status","example":"Beatae quia qui excepturi minima."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5260218798443375074,"format":"int64"}},"example":{"brief_id":"Non quo necessitatibus.","campaign_name":"Exercitationem accusantium nihil.","etag":"Omnis doloremque at fugit dolor et.","id":"Quod sunt quae et nesciunt iure quis.","platform":"Molestiae est accusantium laudantium nostrum.","platform_campaign_id":"Dolores sit.","project_id":"Ut mollitia nihil ducimus.","status":"Quod alias ipsum voluptates pariatur magni.","version":2477378437106771259},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptatibus nihil nisi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Vitae illo consequuntur esse."},"id":{"type":"string","description":"Campaign UUID","example":"Hic ut sapiente harum aliquam sunt eum."},"platform":{"type":"string","description":"Channel","example":"Distinctio tempore qui velit omnis dolorem est."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quia recusandae dignissimos dolore harum totam."},"project_id":{"type":"string","description":"Owning project","example":"Eaque occaecati."},"status":{"type":"string","description":"Campaign status","example":"Libero recusandae ut ullam aliquam."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4964407865557967175,"format":"int64"}},"example":{"brief_id":"Sunt deleniti.","campaign_name":"Assumenda excepturi.","id":"Consequatur minus.","platform":"Natus quia labore non ut dolores et.","platform_campaign_id":"Voluptatem ipsa.","project_id":"Iste nemo.","status":"Tempora est eveniet sequi ea.","version":4255946399444764188},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Est et magni."},"campaign_name":{"type":"string","description":"Campaign name","example":"Repellendus eveniet veritatis impedit aut iste earum."},"id":{"type":"string","description":"Campaign UUID","example":"Consequatur possimus."},"platform":{"type":"string","description":"Channel","example":"Et provident illo non quisquam iure doloremque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Ut aliquid."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sit delectus veniam."},"status":{"type":"string","description":"Campaign status","example":"Quod exercitationem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5517772416028431681,"format":"int64"}},"example":{"brief_id":"Sunt quis odio enim nam id voluptatem.","campaign_name":"Neque quia.","id":"Saepe ab qui.","platform":"Vero alias temporibus illum.","platform_campaign_id":"Ullam eaque suscipit harum.","project_id":"Ab laboriosam sunt quis omnis.","status":"Et veniam itaque optio consequatur nulla sint.","version":6009088986580236396},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut ut odio odio sed minus quia."},"platforms":{"type":"array","items":{"type":"string","example":"Vero at ut quis."},"description":"Platforms to create campaigns on (binding selection)","example":["Aut fugit alias.","Qui maiores quia non unde deserunt.","Nihil sunt doloremque."]}},"example":{"config":"Modi voluptatum veniam molestiae quibusdam.","platforms":["Architecto autem iste.","In ipsa tempore incidunt velit provident perspiciatis.","Tempore sunt itaque omnis.","Ex sunt sit beatae."]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Sit cupiditate non."},"config":{"description":"Campaign configuration snapshot","example":"Eveniet esse officia explicabo dolor deserunt."},"status":{"type":"string","description":"Campaign status","example":"Modi possimus consequatur."}},"example":{"campaign_name":"Voluptatibus aspernatur.","config":"Hic vel ut.","status":"Accusamus nam cupiditate."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Minus autem."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Debitis eum ipsa sed.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Praesentium voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam ut sed natus et unde."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Accusamus in quod."},"project_id":{"type":"string","description":"Owning project","example":"Qui impedit temporibus eveniet eos omnis cumque."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1246943015343350087,"format":"int64"}},"example":{"account_id":"Ut quisquam nisi repellendus quos magnam.","etag":"Nihil quaerat asperiores pariatur.","has_credentials":true,"id":"Accusamus incidunt minus veritatis.","label":"Ex id corrupti sed quo perferendis.","login_customer_id":"Vel veritatis hic rerum accusamus velit error.","project_id":"Unde hic est quia pariatur odit ullam.","status":"active","version":4262114400172519549},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam eaque voluptatem omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem ut."},"label":{"type":"string","description":"Optional friendly name","example":"Qui mollitia et eum veniam."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Culpa sed minima iure."},"project_id":{"type":"string","description":"Owning project","example":"Ut recusandae modi."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2166778479612099571,"format":"int64"}},"example":{"account_id":"Soluta dolore vitae.","has_credentials":false,"id":"Enim occaecati beatae eveniet molestiae ad voluptatum.","label":"Quaerat et eius culpa magni illum consequatur.","login_customer_id":"Asperiores et maiores reiciendis laudantium dolor ipsam.","project_id":"Accusantium et.","status":"error","version":2560433690780116012},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maxime nesciunt repellendus."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium odit rerum commodi ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Magnam atque ullam qui rerum numquam quo."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem aut debitis vitae unde velit eos."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1674128305180380972,"format":"int64"}},"example":{"account_id":"Perferendis omnis ad voluptas esse.","has_credentials":false,"id":"A quia magnam culpa ipsam totam.","label":"Sequi aut veniam ratione.","login_customer_id":"Quidem quo et enim totam et.","project_id":"Quaerat molestias.","status":"inactive","version":7506513470866505325},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"In praesentium cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolorem sit."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas necessitatibus cumque non porro qui molestias."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptatum mollitia nulla perferendis possimus."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6176866709241070937,"format":"int64"}},"example":{"account_id":"Fuga atque.","has_credentials":true,"id":"Iure et.","label":"Qui omnis nesciunt qui consequuntur.","login_customer_id":"Odit provident sed quo aperiam.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"inactive","version":5760426389627270301},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Et vel beatae molestiae fuga."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Vitae consequatur eos."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Dolores quidem necessitatibus voluptatem consequatur sit."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Labore quia esse consectetur tenetur eum.","client_secret":"Aut ut sit nisi architecto.","developer_token":"Rerum et recusandae possimus quis.","refresh_token":"Sed corrupti sit."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor molestiae quia voluptatem deserunt libero."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Non illo ab in voluptatem minus est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas tenetur esse."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat ipsa voluptatem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Aut impedit a veritatis."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sed minima nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Consequuntur sed ea sunt debitis."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptas qui voluptas veniam sint voluptas."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1552956989772584247,"format":"int64"}},"example":{"account_id":"Ratione dicta.","brand_kit":"Deleniti reprehenderit saepe quas commodi qui qui.","has_credentials":true,"id":"Molestiae soluta vel ad et in voluptatem.","label":"Dolores qui.","portal_id":"Non qui ad cumque voluptas qui facere.","project_id":"Perspiciatis ea dolor.","sender_email":"Voluptatem saepe eligendi eum non.","sender_name":"Possimus totam occaecati enim eaque.","status":"inactive","version":8244843411375537375},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere iste."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Magni est officiis enim qui occaecati."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto recusandae voluptates excepturi reiciendis numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Aspernatur delectus rem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ad doloremque soluta et quam totam error."},"project_id":{"type":"string","description":"Owning project","example":"Amet dolorem qui eaque ut iste."},"sender_email":{"type":"string","description":"Default sender address","example":"Repudiandae voluptate est enim aut laborum."},"sender_name":{"type":"string","description":"Default sender name","example":"Non consequatur est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4558831950104085533,"format":"int64"}},"example":{"account_id":"Ut voluptatem velit eos aut est est.","brand_kit":"Autem aperiam quis.","has_credentials":false,"id":"Autem ullam.","label":"In eveniet explicabo voluptatem et quis totam.","portal_id":"Et molestiae blanditiis nihil dolor exercitationem.","project_id":"Quis sed consequatur velit atque nam.","sender_email":"Placeat dolores culpa sed.","sender_name":"Quae qui optio magni itaque iure.","status":"inactive","version":657346491219148846},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui dignissimos."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi vel aut rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim odit numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Beatae quis dignissimos voluptatem et labore sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ut unde dolore id."},"project_id":{"type":"string","description":"Owning project","example":"Placeat aut dolores at."},"sender_email":{"type":"string","description":"Default sender address","example":"Necessitatibus fuga ducimus dolorem ut aspernatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Ad optio magnam sequi esse."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3131513535227055982,"format":"int64"}},"example":{"account_id":"Dolor eum et consequatur.","brand_kit":"Iure odio at magnam saepe.","has_credentials":true,"id":"Ad minus vero assumenda cum nemo.","label":"Quae adipisci doloribus ullam.","portal_id":"Doloremque rerum sed consequatur dolor quia.","project_id":"Nobis assumenda aut dolorem ea veniam.","sender_email":"Vero dolorum incidunt.","sender_name":"Nihil deleniti dolores dignissimos perferendis tempore eum.","status":"error","version":3519661115667163110},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"platforms":{"type":"array","items":{"type":"string","example":"Odio praesentium perferendis eveniet sint voluptatibus quam."},"description":"Platforms this job will create on","example":["Consequuntur voluptatem est qui.","Quis iste eaque."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Debitis nam.","platforms":["Aut quia distinctio consequatur dolore dolor.","Consequatur voluptatem.","Sed reprehenderit provident."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fuga quos."},"job_id":{"type":"string","description":"Job UUID","example":"Sit qui aut aut."},"result":{"description":"Per-platform results, populated as each completes","example":"Quisquam et consequuntur ut sunt aliquam et."},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dicta libero iure culpa est possimus dolores.","job_id":"Minus officiis beatae sed aut quia.","result":"Quia qui fugiat est itaque est fugiat.","status":"queued"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex ipsa nihil esse voluptate in consectetur."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed voluptatum et impedit quod rem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia magni aut nisi est."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas dolorem necessitatibus illum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Omnis corrupti facere eum aliquid est repellat."},"project_id":{"type":"string","description":"Owning project","example":"Sint est sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2425775250383083650,"format":"int64"}},"example":{"account_id":"Quo nostrum quia.","etag":"Velit quis.","has_credentials":true,"id":"Esse sit id incidunt mollitia non sed.","label":"Perferendis culpa voluptatem nostrum eaque deleniti.","org_id":"Aliquam animi.","project_id":"Minima est distinctio accusamus.","status":"error","version":8954977623991310377},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus ut necessitatibus in."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aspernatur nihil et incidunt dolorem dolor sed."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem repellat expedita inventore."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Aliquam ratione ipsum reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Delectus harum voluptates sit est corporis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2355245747867951235,"format":"int64"}},"example":{"account_id":"Magnam voluptates molestiae libero autem quod.","has_credentials":true,"id":"Hic est odio.","label":"Esse mollitia et dolorum accusantium aspernatur quos.","org_id":"Dolores dolore id dolore sed.","project_id":"Occaecati rerum reiciendis.","status":"inactive","version":6928761352190945924},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","org_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","org_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Distinctio magnam."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Architecto deserunt vero ducimus distinctio.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quae qui inventore dolorem deserunt."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"In aut nam rerum."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Doloribus voluptas mollitia doloremque totam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos amet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eum expedita non voluptas sit voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Totam hic quibusdam eveniet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia doloremque commodi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Ab quasi tempora dolor."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8632050897094076248,"format":"int64"}},"example":{"account_id":"Molestias ducimus id.","app_id":"Laborum maiores est ea ducimus ipsum dolorem.","etag":"Et quia ex et alias ea.","has_credentials":true,"id":"Quia iusto maxime.","label":"Error sit nihil iure officiis nemo.","page_id":"Quas quis corporis.","project_id":"Illum accusamus debitis explicabo praesentium sint.","status":"deleted","version":6628357942141561962},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"app_id":{"type":"string","description":"Meta app ID","example":"In vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Error deleniti vitae molestiae qui nobis.","app_id":"Enim non asperiores velit aut.","has_credentials":false,"id":"Nobis qui sunt laboriosam ipsa.","label":"Autem eaque eaque dicta ut magni.","page_id":"Cumque quis accusantium.","project_id":"Et vel dolorum aut inventore consequatur.","status":"inactive","version":8399692053212789191},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit nihil enim sit."},"app_id":{"type":"string","description":"Meta app ID","example":"Non ipsam optio in ratione accusamus quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod minima."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dolores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Qui vitae iste."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum et et laudantium."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6379674624138849400,"format":"int64"}},"example":{"account_id":"Aut perspiciatis.","app_id":"Quibusdam ea nam aut.","has_credentials":true,"id":"Ipsam eligendi est dolore.","label":"Excepturi natus est est saepe doloribus unde.","page_id":"Sit totam ut et.","project_id":"Consequatur aut vero.","status":"active","version":6192957101395237768},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nihil at."},"app_id":{"type":"string","description":"Meta app ID","example":"Maxime eos deserunt quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolores earum."},"label":{"type":"string","description":"Optional friendly name","example":"Optio quia similique vero est impedit quo."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia tempore sit soluta quia."},"project_id":{"type":"string","description":"Owning project","example":"Est consequatur rerum neque velit nulla modi."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6683913012343616485,"format":"int64"}},"example":{"account_id":"Qui quas aut provident suscipit.","app_id":"Excepturi qui.","has_credentials":true,"id":"Sed velit distinctio.","label":"Veniam amet et quisquam voluptatem fuga.","page_id":"Molestiae id quae vero aut repellendus.","project_id":"Necessitatibus eos rerum.","status":"inactive","version":747656330949987636},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Consequatur hic voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto fugit non asperiores quidem natus."},"page_id":{"type":"string","description":"Facebook page ID","example":"Nostrum atque illum nesciunt adipisci odit corrupti."}},"example":{"account_id":"act_193556282970417","app_id":"Occaecati earum unde ut.","label":"Omnis quidem dolor ipsum voluptas.","page_id":"Occaecati id ea sunt dolorem necessitatibus neque."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Vel architecto quae error dolor placeat."},"app_secret":{"type":"string","description":"Meta app secret","example":"Minus et."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Fugiat aliquid aspernatur voluptatem in cupiditate.","app_secret":"Et dolorem quod."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos ex laborum et doloremque."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ab non sunt dolores quo est ratione."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repudiandae eum."},"label":{"type":"string","description":"Optional friendly name","example":"Quod amet itaque aut."},"project_id":{"type":"string","description":"Owning project","example":"Ut itaque voluptatem unde adipisci aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6109053107717412647,"format":"int64"}},"example":{"account_id":"Soluta beatae error enim velit voluptates officiis.","customer_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Totam dolorum quas quia quam voluptate.","label":"Aut numquam est accusantium ut vitae.","project_id":"Iste architecto voluptatem velit odio.","status":"error","version":7566507239259662295},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Officiis modi quae consequatur voluptatem et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sed dolorum cupiditate quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Dolorem ea et quidem quibusdam officiis.","customer_id":"Sed sint dolor eaque culpa quae.","has_credentials":true,"id":"Culpa veritatis ut adipisci minus.","label":"Incidunt deleniti.","project_id":"Vero eum ea perspiciatis rerum.","status":"deleted","version":1470629891228199804},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eveniet amet accusantium qui pariatur odio."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Et id sint suscipit quia ipsa voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Omnis id."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat dolores iure dolore voluptatem."},"project_id":{"type":"string","description":"Owning project","example":"Omnis aut mollitia pariatur."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1077022898145795137,"format":"int64"}},"example":{"account_id":"Sapiente perspiciatis dolores dignissimos soluta non vel.","customer_id":"Velit distinctio animi fugit provident rerum.","has_credentials":true,"id":"Non neque optio.","label":"Perspiciatis consequatur beatae sunt officiis sequi qui.","project_id":"Architecto molestiae cum.","status":"inactive","version":8699718175951963580},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Hic voluptatem ad similique sunt ratione."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Dicta et ratione impedit recusandae dolor."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Mollitia vel temporibus sunt nulla esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatem incidunt cum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vero ut et neque soluta distinctio voluptas."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Libero sapiente."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3465638753396319382,"format":"int64"}},"example":{"account_id":"Inventore ratione id vel iusto optio repellendus.","etag":"Quos rerum.","has_credentials":true,"id":"Occaecati quaerat eum quia a excepturi.","label":"Inventore aut molestiae voluptas hic.","project_id":"Ut possimus quidem eos culpa quaerat.","status":"active","version":2911200286629229215},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Cumque laborum ipsum accusantium voluptatem libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tenetur atque et et quia."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut tenetur ipsum ea ad."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6681602602405949516,"format":"int64"}},"example":{"account_id":"In iure molestiae quisquam.","has_credentials":false,"id":"Necessitatibus non eum ipsum eveniet quam.","label":"Accusamus eos neque velit.","project_id":"Aut amet aut voluptatum magnam.","status":"deleted","version":3936961167651696720},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi nostrum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam in et."},"label":{"type":"string","description":"Optional friendly name","example":"Illo ut ut ut."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem maiores ipsam dicta cum odit repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1189484283141975528,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","has_credentials":true,"id":"Debitis atque laboriosam unde facilis.","label":"Voluptatem optio.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati hic ut magnam facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Quo ullam."},"project_id":{"type":"string","description":"Owning project","example":"Ea voluptatum pariatur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4047597311733105158,"format":"int64"}},"example":{"account_id":"Perferendis et.","has_credentials":false,"id":"Sed error quisquam recusandae nesciunt et itaque.","label":"Quos qui quo et.","project_id":"A debitis ut ea.","status":"deleted","version":4664403850667403290},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem fugiat et."}},"example":{"account_id":"t2_gv9wtbfa","label":"Facere quas qui aut rerum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ab quo ullam ad."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quos et est placeat explicabo."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Rerum tenetur ut voluptatem quo."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Iste aut cum voluptatem qui et.","client_secret":"Aperiam facere voluptas quis nihil.","refresh_token":"Rem asperiores eligendi vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Earum id consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Possimus ipsam perspiciatis enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Molestiae itaque autem aliquam voluptatibus assumenda mollitia.","etag":"Nemo sint et consequatur vel quisquam libero.","funding_instrument_id":"Eum et sint possimus omnis dolorem.","has_credentials":false,"id":"Dolorum id ut molestias.","label":"Rerum non assumenda molestiae modi impedit.","project_id":"Adipisci ipsa.","status":"deleted","version":1754395146238114720},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Provident nostrum vel ut nulla et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Magnam dolor et aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod nihil quia id sed voluptas fuga."},"label":{"type":"string","description":"Optional friendly name","example":"Qui qui impedit assumenda voluptas cumque."},"project_id":{"type":"string","description":"Owning project","example":"Nulla temporibus recusandae consequatur nulla quam non."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7352010610499081653,"format":"int64"}},"example":{"account_id":"Ut et laborum.","funding_instrument_id":"Iusto reiciendis.","has_credentials":false,"id":"Magnam nemo cum delectus.","label":"Et voluptatem mollitia placeat aut laudantium.","project_id":"Minus est dolor.","status":"inactive","version":760324478171279387},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus quia facere vitae aperiam velit corrupti."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Deserunt minima quis impedit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut saepe beatae quasi temporibus in."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas doloremque nobis consectetur voluptas voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Provident corrupti ut similique."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8091372322961997197,"format":"int64"}},"example":{"account_id":"Saepe eius earum.","funding_instrument_id":"Est est molestias reprehenderit placeat.","has_credentials":false,"id":"In voluptate debitis earum voluptates repellat.","label":"Repellendus dolore expedita commodi sit omnis et.","project_id":"Aut et ut dolorem tempore.","status":"inactive","version":2286015844327380649},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed qui dolor illo facere ut voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Rerum maiores in alias est laboriosam saepe."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse odio dolorem similique sapiente ab."},"label":{"type":"string","description":"Optional friendly name","example":"Incidunt nam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Pariatur deserunt aut rem molestiae assumenda."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Quae et perspiciatis numquam.","funding_instrument_id":"Cupiditate provident molestiae quia neque atque delectus.","has_credentials":true,"id":"Perferendis placeat earum occaecati et.","label":"Assumenda quam possimus aut ipsa.","project_id":"Eaque magni omnis dolorem.","status":"error","version":413964225916483826},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Accusantium voluptas ratione dignissimos esse et labore."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus tempore rem quo."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Cumque perspiciatis quam.","label":"Iste numquam optio possimus velit."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Est magni odio aut omnis vel."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iure ducimus voluptatem."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nam sunt aut inventore impedit unde."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quia ab recusandae praesentium."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Magnam cum veritatis mollitia vel velit.","access_token_secret":"Eum perferendis qui qui soluta repudiandae quae.","consumer_key":"Ullam consequatur ut eveniet tempore est.","consumer_secret":"Iusto fugiat ad et."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nisi est sint consequuntur omnis."},"example":"Neque sed alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"event_slug":"Nemo perspiciatis et qui aliquam doloremque itaque.","id":"Voluptatem cupiditate voluptas aliquam facilis iste sed.","platforms":["Tenetur quia totam magni.","Repellat alias ex.","Nihil quos quo eum.","Iure praesentium ea quis."],"program_type":"Sed exercitationem ut totam ut minus.","project_id":"Laboriosam tempore vero voluptatum a quos.","status":"archived","url":"Magni autem.","version":9009752361610175063}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsum quo possimus."},"example":"Quam culpa."}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Id ducimus excepturi est et est."},"example":"Deleniti non in iure dolores et quis."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae similique assumenda ut quia."},"example":"Nam eius nulla suscipit ullam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"event_slug":"Provident itaque.","id":"Ut est nobis aspernatur.","platforms":["Cupiditate rerum magni incidunt.","Est perspiciatis soluta voluptas est.","Hic vero et.","Ut ea alias."],"program_type":"Ea enim quidem odio et sequi consequatur.","project_id":"Fugit qui tempora commodi reiciendis sit alias.","status":"draft","url":"Voluptas et accusamus quia et officiis ipsum.","version":5012609352100951313}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Corrupti sint molestiae occaecati est."},"example":"Labore est ut ratione nobis ut occaecati."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima veritatis sed impedit laborum."},"example":"Totam non qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"event_slug":"Accusantium quaerat voluptatem iure vero quam consequatur.","id":"Voluptas voluptatibus deleniti sit dolorum.","platforms":["Ex eveniet soluta adipisci occaecati.","Pariatur vero est quaerat id.","Repudiandae veniam soluta alias natus aut."],"program_type":"Illo quaerat.","project_id":"Quibusdam ut amet iusto provident sequi.","status":"approved","url":"Tempore voluptatibus quo.","version":8063317454231389303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sed magnam sed vero nulla."},"example":"Vel et et iure tempora."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum perspiciatis autem."},"example":"Sunt labore voluptate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"event_slug":"Officia et pariatur molestias autem ratione.","id":"Et ratione sit.","platforms":["Et quod porro.","Minus illo rerum ut culpa totam sequi."],"program_type":"A omnis veritatis omnis.","project_id":"Sed ipsum quia.","status":"draft","url":"Ut et veniam maiores.","version":4401871562627166296}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"example":"Consequatur laborum."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Tempora veritatis harum ab nobis fuga atque.","platforms":["Laboriosam maxime facere culpa modi.","Quod blanditiis et.","Est dolorem eos amet dolorem sed.","Architecto provident id quia porro."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Beatae non et excepturi sit minus."},"example":"Et quisquam dicta."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Eaque enim est libero enim quo."},"example":"Aut tempora dolorem neque assumenda sed."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur ipsam consequatur qui illo totam fuga."},"example":"Qui non illum expedita commodi in dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Id ducimus eius et laboriosam omnis vitae.","campaign_name":"Labore iste voluptates quos.","id":"Est voluptatum enim earum et doloribus.","platform":"Voluptatem quas non voluptas ut.","platform_campaign_id":"Modi rerum sint.","project_id":"Ea consequatur et ut.","status":"Dolorem dolor fugiat quia.","version":5825706568637163425}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Similique eaque autem impedit tenetur voluptatibus."},"example":"Libero quia quam harum molestiae cupiditate."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Et eum ex doloremque quia."},"example":"Adipisci vel."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum itaque."},"example":"Et iusto doloremque odio."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Harum distinctio reiciendis architecto atque maxime soluta.","campaign_name":"Est ut ut alias ullam fugiat deserunt.","id":"Accusantium sunt culpa libero quisquam.","platform":"Ducimus porro maxime.","platform_campaign_id":"Illo ipsam error similique quaerat.","project_id":"Rerum amet aut tempora recusandae aspernatur.","status":"Nihil iusto temporibus voluptas.","version":6352110138661359662}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ratione est omnis voluptas praesentium."},"example":"Laboriosam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Consequatur quos atque voluptates quo sit.","has_credentials":false,"id":"Autem veniam.","label":"Quam sed rem quia consequuntur ut.","login_customer_id":"Dolorum est aut blanditiis quidem qui.","project_id":"Enim unde omnis.","status":"inactive","version":8150234719088577779}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum debitis."},"example":"Occaecati quam nostrum quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quibusdam magni et rerum sed voluptatum nesciunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non dolorum odit est.","brand_kit":"Natus veritatis sint autem necessitatibus.","has_credentials":false,"id":"Tempore quo quae aut culpa impedit.","label":"Aperiam dolorem molestias natus velit.","portal_id":"Et magni adipisci magnam veniam.","project_id":"Quibusdam nulla.","sender_email":"Labore qui.","sender_name":"Et corporis architecto dolorem sapiente repellendus.","status":"deleted","version":5377129987312416334}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Totam tempora quod expedita."},"example":"Dignissimos fugiat voluptatibus natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Consequuntur omnis a dignissimos voluptate.","brand_kit":"Ab voluptatem esse.","has_credentials":false,"id":"Doloremque architecto ea et.","label":"Aliquid et in.","portal_id":"Est iste.","project_id":"Asperiores facere et exercitationem soluta possimus.","sender_email":"Ad esse neque earum modi.","sender_name":"Quis possimus placeat.","status":"inactive","version":3236501119949951161}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Dolor id.","brand_kit":"Ex id ut aut.","has_credentials":false,"id":"Modi velit vitae optio ut et consequuntur.","label":"Debitis soluta sed quod dicta aperiam eveniet.","portal_id":"Corrupti esse mollitia distinctio saepe rerum.","project_id":"Libero autem ut.","sender_email":"Eum et qui aut consequatur ut.","sender_name":"Harum maxime voluptas expedita.","status":"inactive","version":5643656240528764613}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Similique ut minima.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore vel quia cum."},"example":"Aut est et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Magni voluptas odio assumenda totam.","has_credentials":true,"id":"Ipsam vitae aut voluptatem.","label":"Iusto quis magni et velit.","org_id":"Officiis deleniti ipsam nam.","project_id":"Ab quam velit sapiente.","status":"deleted","version":6633489521806040497}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Itaque quo."},"example":"Aperiam et ab."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quae nihil magni.","has_credentials":true,"id":"Eum fugit repudiandae magnam ut.","label":"Aut tempora error.","org_id":"Voluptatem repudiandae laudantium expedita ut.","project_id":"Ab laboriosam quis sapiente ut sit.","status":"error","version":7519523340683479876}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis ea molestiae eum voluptatum."},"example":"Consequatur nemo molestiae modi ut non atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Facere harum enim consequatur id voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aperiam quia doloribus omnis."},"example":"Aut quia voluptates voluptates nisi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Mollitia a magni vel consequatur ea deserunt.","app_id":"Inventore aliquid voluptatibus iste mollitia.","has_credentials":true,"id":"Et corporis officia sint.","label":"Ratione quis.","page_id":"Occaecati eum tenetur.","project_id":"Ut in possimus quia nulla.","status":"error","version":2122032566439088184}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed commodi voluptatibus."},"example":"Fuga facilis asperiores enim nisi consequatur perspiciatis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quo sint dolorum vel.","app_id":"Dolores commodi aperiam voluptatibus.","has_credentials":false,"id":"Accusamus vero et voluptas accusamus sunt.","label":"Vel blanditiis sunt ut facere.","page_id":"Est non tenetur dolore.","project_id":"Rerum cupiditate.","status":"deleted","version":8886302108378029553}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Eius voluptatem molestiae qui suscipit rerum.","app_id":"Id facere maxime.","has_credentials":false,"id":"Saepe sit et sed qui dolorem reiciendis.","label":"Asperiores ipsum quam.","page_id":"Cum rem architecto vel quibusdam vel autem.","project_id":"Id tenetur exercitationem aperiam incidunt.","status":"error","version":3981571209223840207}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Delectus et maxime ut possimus expedita qui.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima adipisci aut quia quisquam."},"example":"Magnam nihil qui doloremque nam magnam aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Possimus dolore.","customer_id":"Vero quis consequuntur.","has_credentials":true,"id":"Autem aspernatur ea voluptatem.","label":"Dicta rerum sed perferendis.","project_id":"Voluptas eveniet assumenda accusantium aspernatur facere tempora.","status":"deleted","version":5431490552370585468}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Possimus nihil qui enim ratione voluptatem eos.","customer_id":"Debitis itaque itaque dolores nihil.","has_credentials":true,"id":"Ipsum voluptatem et quam beatae laborum omnis.","label":"Aut quis qui laudantium dolore.","project_id":"Esse aut et rem suscipit similique.","status":"inactive","version":5244933818906460264}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus accusantium expedita alias."},"example":"Iusto molestiae cupiditate quis modi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Est aut labore sint natus.","customer_id":"Quas quibusdam.","has_credentials":true,"id":"Ut fugiat magnam quia.","label":"Distinctio beatae.","project_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","status":"deleted","version":8986600307371048121}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Harum iste voluptatem et voluptatem.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et iste."},"example":"Odio eos earum fuga non est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Molestias architecto dicta quidem illo numquam.","has_credentials":false,"id":"Explicabo vero commodi.","label":"Minus ut est recusandae aspernatur eum fugit.","project_id":"Qui asperiores velit enim tempore expedita.","status":"error","version":3837864470732187499}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Exercitationem officia corrupti tempora ea."},"example":"Ipsa sint optio nobis quae corporis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Blanditiis atque rerum et officiis sapiente et.","has_credentials":true,"id":"Harum provident quia distinctio ea.","label":"Hic et sed.","project_id":"Rem harum provident provident quia laboriosam magnam.","status":"deleted","version":1429619977254656560}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Rerum reiciendis similique."},"example":"Saepe voluptatem dolores tempora qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Expedita accusantium dolorum qui sed fugiat.","has_credentials":true,"id":"Sed fugiat.","label":"Ipsam temporibus sint et necessitatibus dolorem ut.","project_id":"Eos rerum.","status":"deleted","version":3554537496380374690}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ullam temporibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Repudiandae odit."},"example":"Temporibus ipsum necessitatibus ratione possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","funding_instrument_id":"Fuga illo dolorem sit ex commodi sapiente.","has_credentials":false,"id":"Ut eveniet iusto quidem.","label":"Quaerat ut neque expedita nostrum.","project_id":"Accusamus ratione consequuntur aut et corrupti.","status":"error","version":5145245548849296683}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vero voluptates soluta."},"example":"Eligendi consequatur officia labore eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Beatae aliquam quia officiis hic ea.","funding_instrument_id":"Debitis vitae quae debitis sunt.","has_credentials":true,"id":"Aperiam et ipsam vitae.","label":"Voluptate nisi natus sint.","project_id":"Velit est quis aliquid aliquam.","status":"deleted","version":1415133980301644723}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Facilis repellat eveniet reiciendis."},"example":"Non placeat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Ut sint.","funding_instrument_id":"Rerum omnis veritatis.","has_credentials":false,"id":"Excepturi dolorem autem ipsa autem provident.","label":"Quis et odio tenetur optio.","project_id":"Iure quo culpa.","status":"inactive","version":36658389617783588}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Maxime incidunt asperiores.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsum expedita animi."},"example":"Velit at omnis autem."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Voluptas nam.","job_id":"Nesciunt asperiores et est.","result":"Facere sint totam sapiente vitae numquam ut.","status":"partial"}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos expedita voluptas qui eaque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8483228206992747737,"format":"int64"}},"example":{"etag":"Repudiandae necessitatibus dolorem enim beatae quia.","event_slug":"Consequatur in vero soluta.","id":"Laudantium nostrum ratione id eius laborum aspernatur.","platforms":["Distinctio dolore velit pariatur.","Assumenda perspiciatis dolor porro.","Et cupiditate molestiae ea ullam minima voluptatem."],"program_type":"Molestiae suscipit non iusto.","project_id":"Itaque fugit rerum cumque.","status":"draft","url":"Eius dicta.","version":5990824706789002616},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7907674416929152715,"format":"int64"}},"example":{"event_slug":"Tenetur non accusamus qui ex.","id":"Dolore est dolorem quod enim pariatur.","platforms":["Et amet sunt.","Ad quae nisi."],"program_type":"Aut architecto aliquam mollitia labore sapiente.","project_id":"Occaecati veritatis.","status":"draft","url":"Quia mollitia.","version":7441335261794230827},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Hic vel aspernatur at quam est ea."},"id":{"type":"string","description":"Brief UUID","example":"Blanditiis cum et."},"platforms":{"type":"array","items":{"type":"string","example":"Necessitatibus sit."},"description":"Suggested default platforms","example":["Aperiam deserunt nostrum consectetur.","Sed praesentium libero blanditiis qui minima.","Nulla sunt autem eos rerum provident dicta."]},"program_type":{"type":"string","description":"Funnel context","example":"Nemo nihil dolorum consequatur sed tempora qui."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum eius."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Sit dignissimos incidunt voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8003111466267168066,"format":"int64"}},"example":{"event_slug":"Veritatis itaque.","id":"Dolor dolores provident porro.","platforms":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."],"program_type":"Dolores laborum sed.","project_id":"Odio sunt esse mollitia incidunt.","status":"approved","url":"Est quis impedit.","version":9059453485160266445},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Impedit dolores."},"id":{"type":"string","description":"Brief UUID","example":"Eos iste corporis praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"At sint laborum veniam."},"description":"Suggested default platforms","example":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."]},"program_type":{"type":"string","description":"Funnel context","example":"Officia eligendi alias."},"project_id":{"type":"string","description":"Owning project","example":"Quis veniam iusto consequatur quia."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Alias minus reprehenderit dignissimos aut velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8443584423631303721,"format":"int64"}},"example":{"event_slug":"Velit quis harum recusandae est ipsum.","id":"Aperiam saepe.","platforms":["Totam voluptatem eos doloribus sint exercitationem eligendi.","Quidem sit in quia molestiae perspiciatis alias."],"program_type":"Laborum est quasi dignissimos.","project_id":"Aut animi sit esse ratione aliquid.","status":"approved","url":"Amet quaerat modi.","version":3775655592825521439},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Tempora voluptate fuga ea distinctio."},"id":{"type":"string","description":"Brief UUID","example":"Molestiae praesentium minus."},"platforms":{"type":"array","items":{"type":"string","example":"Eaque nesciunt."},"description":"Suggested default platforms","example":["Inventore in eligendi ipsam.","Vel atque eos reiciendis sit minima non.","Et itaque ut dolores in voluptas."]},"program_type":{"type":"string","description":"Funnel context","example":"Pariatur mollitia incidunt autem."},"project_id":{"type":"string","description":"Owning project","example":"Et consequuntur suscipit."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Mollitia aut tempore rerum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","url":"Nostrum similique omnis iste.","version":1280403017059047628},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et itaque rem eos et deleniti dolores."},"campaign_name":{"type":"string","description":"Campaign name","example":"Enim vitae officia dolorem odio."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus a."},"id":{"type":"string","description":"Campaign UUID","example":"Beatae velit laudantium error eum et aut."},"platform":{"type":"string","description":"Channel","example":"Facilis qui libero."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Facere qui omnis."},"project_id":{"type":"string","description":"Owning project","example":"Beatae harum similique corporis id eum."},"status":{"type":"string","description":"Campaign status","example":"Beatae quia qui excepturi minima."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5260218798443375074,"format":"int64"}},"example":{"brief_id":"Non quo necessitatibus.","campaign_name":"Exercitationem accusantium nihil.","etag":"Omnis doloremque at fugit dolor et.","id":"Quod sunt quae et nesciunt iure quis.","platform":"Molestiae est accusantium laudantium nostrum.","platform_campaign_id":"Dolores sit.","project_id":"Ut mollitia nihil ducimus.","status":"Quod alias ipsum voluptates pariatur magni.","version":2477378437106771259},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptatibus nihil nisi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Vitae illo consequuntur esse."},"id":{"type":"string","description":"Campaign UUID","example":"Hic ut sapiente harum aliquam sunt eum."},"platform":{"type":"string","description":"Channel","example":"Distinctio tempore qui velit omnis dolorem est."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quia recusandae dignissimos dolore harum totam."},"project_id":{"type":"string","description":"Owning project","example":"Eaque occaecati."},"status":{"type":"string","description":"Campaign status","example":"Libero recusandae ut ullam aliquam."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4964407865557967175,"format":"int64"}},"example":{"brief_id":"Sunt deleniti.","campaign_name":"Assumenda excepturi.","id":"Consequatur minus.","platform":"Natus quia labore non ut dolores et.","platform_campaign_id":"Voluptatem ipsa.","project_id":"Iste nemo.","status":"Tempora est eveniet sequi ea.","version":4255946399444764188},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Est et magni."},"campaign_name":{"type":"string","description":"Campaign name","example":"Repellendus eveniet veritatis impedit aut iste earum."},"id":{"type":"string","description":"Campaign UUID","example":"Consequatur possimus."},"platform":{"type":"string","description":"Channel","example":"Et provident illo non quisquam iure doloremque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Ut aliquid."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sit delectus veniam."},"status":{"type":"string","description":"Campaign status","example":"Quod exercitationem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5517772416028431681,"format":"int64"}},"example":{"brief_id":"Sunt quis odio enim nam id voluptatem.","campaign_name":"Neque quia.","id":"Saepe ab qui.","platform":"Vero alias temporibus illum.","platform_campaign_id":"Ullam eaque suscipit harum.","project_id":"Ab laboriosam sunt quis omnis.","status":"Et veniam itaque optio consequatur nulla sint.","version":6009088986580236396},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut ut odio odio sed minus quia."},"platforms":{"type":"array","items":{"type":"string","example":"Vero at ut quis."},"description":"Platforms to create campaigns on (binding selection)","example":["Aut fugit alias.","Qui maiores quia non unde deserunt.","Nihil sunt doloremque."]}},"example":{"config":"Modi voluptatum veniam molestiae quibusdam.","platforms":["Architecto autem iste.","In ipsa tempore incidunt velit provident perspiciatis.","Tempore sunt itaque omnis.","Ex sunt sit beatae."]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Sit cupiditate non."},"config":{"description":"Campaign configuration snapshot","example":"Eveniet esse officia explicabo dolor deserunt."},"status":{"type":"string","description":"Campaign status","example":"Modi possimus consequatur."}},"example":{"campaign_name":"Voluptatibus aspernatur.","config":"Hic vel ut.","status":"Accusamus nam cupiditate."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Minus autem."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Debitis eum ipsa sed.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Praesentium voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam ut sed natus et unde."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Accusamus in quod."},"project_id":{"type":"string","description":"Owning project","example":"Qui impedit temporibus eveniet eos omnis cumque."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1246943015343350087,"format":"int64"}},"example":{"account_id":"Ut quisquam nisi repellendus quos magnam.","etag":"Nihil quaerat asperiores pariatur.","has_credentials":true,"id":"Accusamus incidunt minus veritatis.","label":"Ex id corrupti sed quo perferendis.","login_customer_id":"Vel veritatis hic rerum accusamus velit error.","project_id":"Unde hic est quia pariatur odit ullam.","status":"active","version":4262114400172519549},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam eaque voluptatem omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem ut."},"label":{"type":"string","description":"Optional friendly name","example":"Qui mollitia et eum veniam."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Culpa sed minima iure."},"project_id":{"type":"string","description":"Owning project","example":"Ut recusandae modi."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2166778479612099571,"format":"int64"}},"example":{"account_id":"Soluta dolore vitae.","has_credentials":false,"id":"Enim occaecati beatae eveniet molestiae ad voluptatum.","label":"Quaerat et eius culpa magni illum consequatur.","login_customer_id":"Asperiores et maiores reiciendis laudantium dolor ipsam.","project_id":"Accusantium et.","status":"error","version":2560433690780116012},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maxime nesciunt repellendus."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium odit rerum commodi ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Magnam atque ullam qui rerum numquam quo."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem aut debitis vitae unde velit eos."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1674128305180380972,"format":"int64"}},"example":{"account_id":"Perferendis omnis ad voluptas esse.","has_credentials":false,"id":"A quia magnam culpa ipsam totam.","label":"Sequi aut veniam ratione.","login_customer_id":"Quidem quo et enim totam et.","project_id":"Quaerat molestias.","status":"inactive","version":7506513470866505325},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"In praesentium cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolorem sit."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas necessitatibus cumque non porro qui molestias."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptatum mollitia nulla perferendis possimus."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6176866709241070937,"format":"int64"}},"example":{"account_id":"Fuga atque.","has_credentials":true,"id":"Iure et.","label":"Qui omnis nesciunt qui consequuntur.","login_customer_id":"Odit provident sed quo aperiam.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"inactive","version":5760426389627270301},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Et vel beatae molestiae fuga."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Vitae consequatur eos."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Dolores quidem necessitatibus voluptatem consequatur sit."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Labore quia esse consectetur tenetur eum.","client_secret":"Aut ut sit nisi architecto.","developer_token":"Rerum et recusandae possimus quis.","refresh_token":"Sed corrupti sit."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor molestiae quia voluptatem deserunt libero."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Non illo ab in voluptatem minus est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas tenetur esse."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat ipsa voluptatem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Aut impedit a veritatis."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sed minima nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Consequuntur sed ea sunt debitis."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptas qui voluptas veniam sint voluptas."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1552956989772584247,"format":"int64"}},"example":{"account_id":"Ratione dicta.","brand_kit":"Deleniti reprehenderit saepe quas commodi qui qui.","has_credentials":true,"id":"Molestiae soluta vel ad et in voluptatem.","label":"Dolores qui.","portal_id":"Non qui ad cumque voluptas qui facere.","project_id":"Perspiciatis ea dolor.","sender_email":"Voluptatem saepe eligendi eum non.","sender_name":"Possimus totam occaecati enim eaque.","status":"inactive","version":8244843411375537375},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere iste."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Magni est officiis enim qui occaecati."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto recusandae voluptates excepturi reiciendis numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Aspernatur delectus rem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ad doloremque soluta et quam totam error."},"project_id":{"type":"string","description":"Owning project","example":"Amet dolorem qui eaque ut iste."},"sender_email":{"type":"string","description":"Default sender address","example":"Repudiandae voluptate est enim aut laborum."},"sender_name":{"type":"string","description":"Default sender name","example":"Non consequatur est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4558831950104085533,"format":"int64"}},"example":{"account_id":"Ut voluptatem velit eos aut est est.","brand_kit":"Autem aperiam quis.","has_credentials":false,"id":"Autem ullam.","label":"In eveniet explicabo voluptatem et quis totam.","portal_id":"Et molestiae blanditiis nihil dolor exercitationem.","project_id":"Quis sed consequatur velit atque nam.","sender_email":"Placeat dolores culpa sed.","sender_name":"Quae qui optio magni itaque iure.","status":"inactive","version":657346491219148846},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui dignissimos."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi vel aut rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim odit numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Beatae quis dignissimos voluptatem et labore sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ut unde dolore id."},"project_id":{"type":"string","description":"Owning project","example":"Placeat aut dolores at."},"sender_email":{"type":"string","description":"Default sender address","example":"Necessitatibus fuga ducimus dolorem ut aspernatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Ad optio magnam sequi esse."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3131513535227055982,"format":"int64"}},"example":{"account_id":"Dolor eum et consequatur.","brand_kit":"Iure odio at magnam saepe.","has_credentials":true,"id":"Ad minus vero assumenda cum nemo.","label":"Quae adipisci doloribus ullam.","portal_id":"Doloremque rerum sed consequatur dolor quia.","project_id":"Nobis assumenda aut dolorem ea veniam.","sender_email":"Vero dolorum incidunt.","sender_name":"Nihil deleniti dolores dignissimos perferendis tempore eum.","status":"error","version":3519661115667163110},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"platforms":{"type":"array","items":{"type":"string","example":"Odio praesentium perferendis eveniet sint voluptatibus quam."},"description":"Platforms this job will create on","example":["Consequuntur voluptatem est qui.","Quis iste eaque."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Debitis nam.","platforms":["Aut quia distinctio consequatur dolore dolor.","Consequatur voluptatem.","Sed reprehenderit provident."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fuga quos."},"job_id":{"type":"string","description":"Job UUID","example":"Sit qui aut aut."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Quisquam et consequuntur ut sunt aliquam et."},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dicta libero iure culpa est possimus dolores.","job_id":"Minus officiis beatae sed aut quia.","result":"Quia qui fugiat est itaque est fugiat.","status":"queued"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex ipsa nihil esse voluptate in consectetur."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed voluptatum et impedit quod rem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia magni aut nisi est."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas dolorem necessitatibus illum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Omnis corrupti facere eum aliquid est repellat."},"project_id":{"type":"string","description":"Owning project","example":"Sint est sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2425775250383083650,"format":"int64"}},"example":{"account_id":"Quo nostrum quia.","etag":"Velit quis.","has_credentials":true,"id":"Esse sit id incidunt mollitia non sed.","label":"Perferendis culpa voluptatem nostrum eaque deleniti.","org_id":"Aliquam animi.","project_id":"Minima est distinctio accusamus.","status":"error","version":8954977623991310377},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus ut necessitatibus in."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aspernatur nihil et incidunt dolorem dolor sed."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem repellat expedita inventore."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Aliquam ratione ipsum reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Delectus harum voluptates sit est corporis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2355245747867951235,"format":"int64"}},"example":{"account_id":"Magnam voluptates molestiae libero autem quod.","has_credentials":true,"id":"Hic est odio.","label":"Esse mollitia et dolorum accusantium aspernatur quos.","org_id":"Dolores dolore id dolore sed.","project_id":"Occaecati rerum reiciendis.","status":"inactive","version":6928761352190945924},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","org_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","org_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Distinctio magnam."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Architecto deserunt vero ducimus distinctio.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quae qui inventore dolorem deserunt."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"In aut nam rerum."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Doloribus voluptas mollitia doloremque totam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos amet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eum expedita non voluptas sit voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Totam hic quibusdam eveniet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia doloremque commodi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Ab quasi tempora dolor."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8632050897094076248,"format":"int64"}},"example":{"account_id":"Molestias ducimus id.","app_id":"Laborum maiores est ea ducimus ipsum dolorem.","etag":"Et quia ex et alias ea.","has_credentials":true,"id":"Quia iusto maxime.","label":"Error sit nihil iure officiis nemo.","page_id":"Quas quis corporis.","project_id":"Illum accusamus debitis explicabo praesentium sint.","status":"deleted","version":6628357942141561962},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"app_id":{"type":"string","description":"Meta app ID","example":"In vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Error deleniti vitae molestiae qui nobis.","app_id":"Enim non asperiores velit aut.","has_credentials":false,"id":"Nobis qui sunt laboriosam ipsa.","label":"Autem eaque eaque dicta ut magni.","page_id":"Cumque quis accusantium.","project_id":"Et vel dolorum aut inventore consequatur.","status":"inactive","version":8399692053212789191},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit nihil enim sit."},"app_id":{"type":"string","description":"Meta app ID","example":"Non ipsam optio in ratione accusamus quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod minima."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dolores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Qui vitae iste."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum et et laudantium."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6379674624138849400,"format":"int64"}},"example":{"account_id":"Aut perspiciatis.","app_id":"Quibusdam ea nam aut.","has_credentials":true,"id":"Ipsam eligendi est dolore.","label":"Excepturi natus est est saepe doloribus unde.","page_id":"Sit totam ut et.","project_id":"Consequatur aut vero.","status":"active","version":6192957101395237768},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nihil at."},"app_id":{"type":"string","description":"Meta app ID","example":"Maxime eos deserunt quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolores earum."},"label":{"type":"string","description":"Optional friendly name","example":"Optio quia similique vero est impedit quo."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia tempore sit soluta quia."},"project_id":{"type":"string","description":"Owning project","example":"Est consequatur rerum neque velit nulla modi."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6683913012343616485,"format":"int64"}},"example":{"account_id":"Qui quas aut provident suscipit.","app_id":"Excepturi qui.","has_credentials":true,"id":"Sed velit distinctio.","label":"Veniam amet et quisquam voluptatem fuga.","page_id":"Molestiae id quae vero aut repellendus.","project_id":"Necessitatibus eos rerum.","status":"inactive","version":747656330949987636},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Consequatur hic voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto fugit non asperiores quidem natus."},"page_id":{"type":"string","description":"Facebook page ID","example":"Nostrum atque illum nesciunt adipisci odit corrupti."}},"example":{"account_id":"act_193556282970417","app_id":"Occaecati earum unde ut.","label":"Omnis quidem dolor ipsum voluptas.","page_id":"Occaecati id ea sunt dolorem necessitatibus neque."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Vel architecto quae error dolor placeat."},"app_secret":{"type":"string","description":"Meta app secret","example":"Minus et."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Fugiat aliquid aspernatur voluptatem in cupiditate.","app_secret":"Et dolorem quod."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos ex laborum et doloremque."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ab non sunt dolores quo est ratione."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repudiandae eum."},"label":{"type":"string","description":"Optional friendly name","example":"Quod amet itaque aut."},"project_id":{"type":"string","description":"Owning project","example":"Ut itaque voluptatem unde adipisci aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6109053107717412647,"format":"int64"}},"example":{"account_id":"Soluta beatae error enim velit voluptates officiis.","customer_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Totam dolorum quas quia quam voluptate.","label":"Aut numquam est accusantium ut vitae.","project_id":"Iste architecto voluptatem velit odio.","status":"error","version":7566507239259662295},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Officiis modi quae consequatur voluptatem et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sed dolorum cupiditate quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Dolorem ea et quidem quibusdam officiis.","customer_id":"Sed sint dolor eaque culpa quae.","has_credentials":true,"id":"Culpa veritatis ut adipisci minus.","label":"Incidunt deleniti.","project_id":"Vero eum ea perspiciatis rerum.","status":"deleted","version":1470629891228199804},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eveniet amet accusantium qui pariatur odio."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Et id sint suscipit quia ipsa voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Omnis id."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat dolores iure dolore voluptatem."},"project_id":{"type":"string","description":"Owning project","example":"Omnis aut mollitia pariatur."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1077022898145795137,"format":"int64"}},"example":{"account_id":"Sapiente perspiciatis dolores dignissimos soluta non vel.","customer_id":"Velit distinctio animi fugit provident rerum.","has_credentials":true,"id":"Non neque optio.","label":"Perspiciatis consequatur beatae sunt officiis sequi qui.","project_id":"Architecto molestiae cum.","status":"inactive","version":8699718175951963580},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Hic voluptatem ad similique sunt ratione."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Dicta et ratione impedit recusandae dolor."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Mollitia vel temporibus sunt nulla esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatem incidunt cum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vero ut et neque soluta distinctio voluptas."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Libero sapiente."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3465638753396319382,"format":"int64"}},"example":{"account_id":"Inventore ratione id vel iusto optio repellendus.","etag":"Quos rerum.","has_credentials":true,"id":"Occaecati quaerat eum quia a excepturi.","label":"Inventore aut molestiae voluptas hic.","project_id":"Ut possimus quidem eos culpa quaerat.","status":"active","version":2911200286629229215},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Cumque laborum ipsum accusantium voluptatem libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tenetur atque et et quia."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut tenetur ipsum ea ad."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6681602602405949516,"format":"int64"}},"example":{"account_id":"In iure molestiae quisquam.","has_credentials":false,"id":"Necessitatibus non eum ipsum eveniet quam.","label":"Accusamus eos neque velit.","project_id":"Aut amet aut voluptatum magnam.","status":"deleted","version":3936961167651696720},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi nostrum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam in et."},"label":{"type":"string","description":"Optional friendly name","example":"Illo ut ut ut."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem maiores ipsam dicta cum odit repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1189484283141975528,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","has_credentials":true,"id":"Debitis atque laboriosam unde facilis.","label":"Voluptatem optio.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati hic ut magnam facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Quo ullam."},"project_id":{"type":"string","description":"Owning project","example":"Ea voluptatum pariatur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4047597311733105158,"format":"int64"}},"example":{"account_id":"Perferendis et.","has_credentials":false,"id":"Sed error quisquam recusandae nesciunt et itaque.","label":"Quos qui quo et.","project_id":"A debitis ut ea.","status":"deleted","version":4664403850667403290},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem fugiat et."}},"example":{"account_id":"t2_gv9wtbfa","label":"Facere quas qui aut rerum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ab quo ullam ad."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quos et est placeat explicabo."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Rerum tenetur ut voluptatem quo."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Iste aut cum voluptatem qui et.","client_secret":"Aperiam facere voluptas quis nihil.","refresh_token":"Rem asperiores eligendi vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Earum id consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Possimus ipsam perspiciatis enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Molestiae itaque autem aliquam voluptatibus assumenda mollitia.","etag":"Nemo sint et consequatur vel quisquam libero.","funding_instrument_id":"Eum et sint possimus omnis dolorem.","has_credentials":false,"id":"Dolorum id ut molestias.","label":"Rerum non assumenda molestiae modi impedit.","project_id":"Adipisci ipsa.","status":"deleted","version":1754395146238114720},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Provident nostrum vel ut nulla et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Magnam dolor et aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod nihil quia id sed voluptas fuga."},"label":{"type":"string","description":"Optional friendly name","example":"Qui qui impedit assumenda voluptas cumque."},"project_id":{"type":"string","description":"Owning project","example":"Nulla temporibus recusandae consequatur nulla quam non."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7352010610499081653,"format":"int64"}},"example":{"account_id":"Ut et laborum.","funding_instrument_id":"Iusto reiciendis.","has_credentials":false,"id":"Magnam nemo cum delectus.","label":"Et voluptatem mollitia placeat aut laudantium.","project_id":"Minus est dolor.","status":"inactive","version":760324478171279387},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus quia facere vitae aperiam velit corrupti."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Deserunt minima quis impedit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut saepe beatae quasi temporibus in."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas doloremque nobis consectetur voluptas voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Provident corrupti ut similique."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8091372322961997197,"format":"int64"}},"example":{"account_id":"Saepe eius earum.","funding_instrument_id":"Est est molestias reprehenderit placeat.","has_credentials":false,"id":"In voluptate debitis earum voluptates repellat.","label":"Repellendus dolore expedita commodi sit omnis et.","project_id":"Aut et ut dolorem tempore.","status":"inactive","version":2286015844327380649},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed qui dolor illo facere ut voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Rerum maiores in alias est laboriosam saepe."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse odio dolorem similique sapiente ab."},"label":{"type":"string","description":"Optional friendly name","example":"Incidunt nam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Pariatur deserunt aut rem molestiae assumenda."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Quae et perspiciatis numquam.","funding_instrument_id":"Cupiditate provident molestiae quia neque atque delectus.","has_credentials":true,"id":"Perferendis placeat earum occaecati et.","label":"Assumenda quam possimus aut ipsa.","project_id":"Eaque magni omnis dolorem.","status":"error","version":413964225916483826},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Accusantium voluptas ratione dignissimos esse et labore."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus tempore rem quo."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Cumque perspiciatis quam.","label":"Iste numquam optio possimus velit."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Est magni odio aut omnis vel."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iure ducimus voluptatem."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nam sunt aut inventore impedit unde."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quia ab recusandae praesentium."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Magnam cum veritatis mollitia vel velit.","access_token_secret":"Eum perferendis qui qui soluta repudiandae quae.","consumer_key":"Ullam consequatur ut eveniet tempore est.","consumer_secret":"Iusto fugiat ad et."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index dc766106..3608e1f6 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -5625,7 +5625,7 @@ components: description: Job UUID example: Sit qui aut aut. result: - description: Per-platform results, populated as each completes + description: Per-platform results, written once when the job reaches a terminal state example: Quisquam et consequuntur ut sunt aliquam et. status: type: string diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index 35f14b28..6b452bf8 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -237,7 +237,7 @@ type JobPollResponse struct { JobID string // Job status Status string - // Per-platform results, populated as each completes + // Per-platform results, written once when the job reaches a terminal state Result any // Terminal error, if any Error *string diff --git a/internal/service/brief.go b/internal/service/brief.go index 7b4ccf48..2641463b 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -153,6 +153,11 @@ func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCamp if brief.Status != model.BriefApproved { return nil, &briefs.BadRequestError{Code: "400", Message: "brief must be approved before creating campaigns"} } + if len(p.Input.Platforms) == 0 { + // Reject an empty platform set: it would create a job with zero dispatches + // that instantly aggregates to "succeeded" — a meaningless no-op job. + return nil, &briefs.BadRequestError{Code: "400", Message: "at least one platform is required"} + } platforms := make([]model.Provider, 0, len(p.Input.Platforms)) for _, pl := range p.Input.Platforms { prov := model.Provider(pl) diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 472c3fd6..014b9763 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -138,3 +138,20 @@ func TestBriefService_CreateCampaigns_RejectsUnapprovedBrief(t *testing.T) { t.Fatalf("expected *briefs.BadRequestError for unapproved brief, got %T (%v)", err, err) } } + +// CreateCampaigns must reject an empty platform set (400) rather than creating a +// no-op job that instantly aggregates to succeeded. +func TestBriefService_CreateCampaigns_RejectsEmptyPlatforms(t *testing.T) { + repo := newFakeBriefRepo() + repo.briefs[briefKey("cncf", "b1")] = &model.CampaignBrief{ + ID: "b1", ProjectID: "cncf", Status: model.BriefApproved, + } + s := newTestBriefService(repo) + _, err := s.CreateCampaigns(context.Background(), &briefs.CreateCampaignsPayload{ + ProjectID: "cncf", BriefID: "b1", + Input: &briefs.CampaignCreateInput{Platforms: []string{}}, + }) + if _, ok := err.(*briefs.BadRequestError); !ok { + t.Fatalf("expected *briefs.BadRequestError for empty platforms, got %T (%v)", err, err) + } +} diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index a8f193d0..96c1ddd4 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -70,7 +70,12 @@ func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, pl // run performs the parallel per-platform dispatch and finalizes the job. func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.CampaignBrief, platforms []model.Provider, config json.RawMessage) { - _ = o.jobs.UpdateJobStatus(ctx, jobID, model.JobRunning, nil, "") + // Mark the job running. Don't abort dispatch on failure (the work should still + // proceed and the final status write will correct it), but log it — silently + // dropping this can leave a job stuck at "queued" in the client's view. + if err := o.jobs.UpdateJobStatus(ctx, jobID, model.JobRunning, nil, ""); err != nil { + slog.ErrorContext(ctx, "failed to mark campaign job running", "job_id", jobID, "error", err) + } results := make([]platformResult, len(platforms)) g, gctx := errgroup.WithContext(ctx) From 92121b14fc66e1e8c202444a8684bba677b1e1fb Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 11:44:24 -0700 Subject: [PATCH 06/46] refactor(orchestrator): drop unused briefs repository dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot review on PR #11: the Orchestrator's briefs field (and the NewOrchestrator parameter) was assigned but never read — Start/run only use campaigns, jobs, and dispatchers. Remove the dead dependency and update the call sites. LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- internal/container/container.go | 2 +- internal/service/brief_test.go | 2 +- internal/service/orchestrator.go | 5 ++--- internal/service/orchestrator_test.go | 6 +++--- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/internal/container/container.go b/internal/container/container.go index 4fbff14e..7f8b0cba 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -106,7 +106,7 @@ func NewContainer(cfg *config.Config) (*Container, error) { if len(dispatchers) == 0 { slog.Warn("no platform dispatchers registered; campaign creation will record jobs but perform no upstream dispatch") } - orch := service.NewOrchestrator(briefRepo, campaignRepo, jobRepo, dispatchers) + orch := service.NewOrchestrator(campaignRepo, jobRepo, dispatchers) c.Briefs = service.NewBriefService(briefRepo, campaignRepo, jobRepo, orch) // The health service's readiness depends on the database pool (Readyz). diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 014b9763..72a9f4b3 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -98,7 +98,7 @@ func isBriefUnavailable(err error) bool { func newTestBriefService(repo *fakeBriefRepo) *BriefService { camps := &fakeCampaignRepo{} jobs := newFakeJobRepo() - orch := NewOrchestrator(repo, camps, jobs, nil) + orch := NewOrchestrator(camps, jobs, nil) return NewBriefService(repo, camps, jobs, orch) } diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 96c1ddd4..0b24408e 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -28,7 +28,6 @@ type PlatformDispatcher interface { // Orchestrator runs async multi-platform campaign creation for a brief. type Orchestrator struct { - briefs domain.BriefRepository campaigns domain.CampaignRepository jobs domain.JobRepository dispatchers map[model.Provider]PlatformDispatcher @@ -36,11 +35,11 @@ type Orchestrator struct { // NewOrchestrator constructs an Orchestrator. dispatchers may be empty; a // platform with no registered dispatcher is recorded as a failed result. -func NewOrchestrator(briefs domain.BriefRepository, campaigns domain.CampaignRepository, jobs domain.JobRepository, dispatchers map[model.Provider]PlatformDispatcher) *Orchestrator { +func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobRepository, dispatchers map[model.Provider]PlatformDispatcher) *Orchestrator { if dispatchers == nil { dispatchers = map[model.Provider]PlatformDispatcher{} } - return &Orchestrator{briefs: briefs, campaigns: campaigns, jobs: jobs, dispatchers: dispatchers} + return &Orchestrator{campaigns: campaigns, jobs: jobs, dispatchers: dispatchers} } // platformResult is the per-platform outcome recorded in the job result. diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 7bf42be2..a9d1e715 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -105,7 +105,7 @@ func waitForTerminal(t *testing.T, jobs *fakeJobRepo, id string) *model.Campaign func TestOrchestrator_AllSucceed(t *testing.T) { jobs := newFakeJobRepo() camps := &fakeCampaignRepo{} - orch := NewOrchestrator(nil, camps, jobs, map[model.Provider]PlatformDispatcher{ + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ model.ProviderGoogleAds: okDispatcher{}, model.ProviderLinkedInAds: okDispatcher{}, }) @@ -126,7 +126,7 @@ func TestOrchestrator_AllSucceed(t *testing.T) { func TestOrchestrator_PartialFailure(t *testing.T) { jobs := newFakeJobRepo() camps := &fakeCampaignRepo{} - orch := NewOrchestrator(nil, camps, jobs, map[model.Provider]PlatformDispatcher{ + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ model.ProviderGoogleAds: okDispatcher{}, model.ProviderLinkedInAds: failDispatcher{}, }) @@ -141,7 +141,7 @@ func TestOrchestrator_PartialFailure(t *testing.T) { func TestOrchestrator_NoDispatcherFails(t *testing.T) { jobs := newFakeJobRepo() camps := &fakeCampaignRepo{} - orch := NewOrchestrator(nil, camps, jobs, nil) // no dispatchers + orch := NewOrchestrator(camps, jobs, nil) // no dispatchers brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) From 42dd26c6dae5ff4b1b107e4987d228487c44087b Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Thu, 9 Jul 2026 11:56:02 -0700 Subject: [PATCH 07/46] fix(orchestrator): guard against a dispatcher returning nil campaign Address Copilot review on PR #11: a PlatformDispatcher returning (nil, nil) would reach the ownership stamp and panic on campaign.JobID = &jobID inside a detached background goroutine (context.WithoutCancel), crashing dispatch with no recovery. Treat a nil campaign as a per-platform failure recorded in results, consistent with the other error paths. Add a test. LFXV2-2626 Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- internal/service/orchestrator.go | 8 ++++++++ internal/service/orchestrator_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 0b24408e..90dab5e2 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -98,6 +98,14 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa results[i] = res return nil } + if campaign == nil { + // Defensive: a dispatcher must return a non-nil campaign on success. + // A nil campaign with no error would panic on the ownership stamp + // below (in a detached goroutine); record it as a platform failure. + res.Error = "dispatcher returned no campaign" + results[i] = res + return nil + } // Stamp ownership before persisting so a dispatcher can't cause a // campaign to be written with missing/wrong ownership. Set on a // fresh reference the dispatcher returned; the invariant is one diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index a9d1e715..724de996 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -89,6 +89,14 @@ func (failDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ mode return nil, errors.New("boom") } +// nilDispatcher returns (nil, nil) — a misbehaving dispatcher that must be +// handled as a failure rather than panicking on the ownership stamp. +type nilDispatcher struct{} + +func (nilDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ model.Provider, _ json.RawMessage) (*model.Campaign, error) { + return nil, nil //nolint:nilnil // deliberately exercises the nil-campaign guard +} + func waitForTerminal(t *testing.T, jobs *fakeJobRepo, id string) *model.CampaignJob { t.Helper() for i := 0; i < 100; i++ { @@ -150,6 +158,23 @@ func TestOrchestrator_NoDispatcherFails(t *testing.T) { } } +func TestOrchestrator_NilCampaignFailsWithoutPanic(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: nilDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + if len(camps.upserted) != 0 { + t.Errorf("upserted %d campaigns, want 0 (nil campaign must not persist)", len(camps.upserted)) + } +} + func TestAggregateStatus(t *testing.T) { cases := []struct { name string From b51d8cb8ce50a32def8ca5fd92fbc3d918de03af Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 16:44:39 -0700 Subject: [PATCH 08/46] fix(review): address Copilot findings on brief API + orchestrator (PR #11) Correctness: - CreateCampaigns rejects duplicate platforms (a duplicate would create two paid upstream campaigns; only one row survives the (brief_id, platform) unique index). - Orchestrator dispatch is now idempotent: an existing campaign with an upstream id for a (brief, platform) is reused instead of re-created, and a transient existing-campaign lookup error is recorded as a failure rather than risking a duplicate. Adds CampaignReader.GetCampaignByPlatform. - ReplaceBrief now persists event_slug (was silently dropped) and resets the brief to draft (clearing approved_by/approved_at) so replacing content invalidates a prior approval; a slug collision surfaces as 409. - briefResult returns event_details/copy/keywords/targeting (were dropped), matching the documented GET contract. Schema: - Move the (project_id, event_slug) archived-aware partial unique index out of an in-place edit to the already-merged migration 000002 and into a new migration 000003 (golang-migrate never re-runs an applied version). - 000003 also changes campaign_briefs/campaigns project_id from UUID to TEXT to match the connection tables and the UUID-or-slug API contract. API design: - Constrain the binding platforms selection to the known provider enum. - Always declare BadRequest on every brief method (JWTAuth can 400 any request), so generated encoders handle it. Docs: - Update the OKF knowledge bundle (design, internal-service, internal-container concepts + log entry). Tests: duplicate-platform rejection, brief-content round-trip, dispatch idempotency skip, transient-lookup-error failure. gen/ regenerated via make apigen; go build/vet/golangci-lint/okfvalidate/go test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 1637 ++++++- .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 4142 ++++++++++++----- cmd/campaign-service/server.go | 10 - design/brief.go | 29 +- docs/api-catalog.md | 11 +- docs/knowledge/code/design.md | 10 + docs/knowledge/code/internal-container.md | 12 +- docs/knowledge/code/internal-service.md | 13 +- docs/knowledge/log.md | 10 + gen/http/cli/lfx_v2_campaign_service/cli.go | 62 +- .../client/cli.go | 8 +- .../client/encode_decode.go | 75 + .../client/types.go | 274 +- .../server/encode_decode.go | 65 + .../server/types.go | 214 +- .../client/cli.go | 40 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 446 +- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 2366 +++++----- gen/lfx_v2_campaign_service_briefs/client.go | 5 + gen/lfx_v2_campaign_service_briefs/service.go | 8 + internal/domain/brief_port.go | 4 + .../infrastructure/postgres/brief_repo.go | 18 +- .../infrastructure/postgres/campaign_repo.go | 14 + ...000002_create_brief_campaign_tables.up.sql | 13 +- .../000003_brief_partial_unique_slug.down.sql | 15 + .../000003_brief_partial_unique_slug.up.sql | 31 + internal/service/brief.go | 44 +- internal/service/brief_test.go | 51 + internal/service/orchestrator.go | 19 + internal/service/orchestrator_test.go | 89 + 34 files changed, 6833 insertions(+), 2910 deletions(-) create mode 100644 internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql create mode 100644 internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index a91e4ac4..f63347da 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"A connection already exists for this provider on the project","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Labore aut eum porro."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Necessitatibus consequatur natus tempora ut.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut voluptatem inventore ab."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quis et maxime ipsam voluptatem repudiandae laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis ipsam."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Iusto quis magni et velit."},"project_id":{"type":"string","description":"Owning project","example":"Ut ipsum id."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8470973010316083422,"format":"int64"}},"example":{"account_id":"Aut id molestiae sit.","has_credentials":true,"id":"Magni voluptas odio assumenda totam.","label":"Nam cumque.","login_customer_id":"Qui esse.","project_id":"Est praesentium dolor officiis deleniti.","status":"active","version":7862773009082385007},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ducimus sequi."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Autem ab voluptas culpa."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Quia tenetur ducimus."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut et."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Alias non sequi consequatur dolorum.","client_secret":"Voluptatem voluptas omnis est tempora ipsum aut.","developer_token":"Harum et minus voluptas.","refresh_token":"Facere harum enim consequatur id voluptatem."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed maiores qui sed exercitationem quam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Asperiores facere et exercitationem soluta possimus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"In expedita."},"label":{"type":"string","description":"Optional friendly name","example":"Suscipit sed minus soluta quasi."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quia ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Magnam cumque quasi magni ducimus."},"sender_email":{"type":"string","description":"Default sender address","example":"Et veritatis voluptas nobis."},"sender_name":{"type":"string","description":"Default sender name","example":"Doloremque architecto ea et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4054743500330389510,"format":"int64"}},"example":{"account_id":"Est iste.","brand_kit":"Quae aut culpa impedit sit.","has_credentials":true,"id":"Aliquid et in.","label":"Distinctio aut.","portal_id":"Earum modi esse.","project_id":"Consequuntur omnis a dignissimos voluptate.","sender_email":"Possimus placeat enim ab.","sender_name":"Esse et qui et voluptatibus tempore.","status":"active","version":3449749392517333935},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Velit labore non."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem sapiente."},"label":{"type":"string","description":"Optional friendly name","example":"Nulla adipisci aperiam dolorem molestias."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Odit est esse."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea cum et magni adipisci magnam."},"sender_name":{"type":"string","description":"Default sender name","example":"Atque labore qui odio et corporis."}},"example":{"account_id":"Sint autem.","brand_kit":"Debitis soluta sed quod dicta aperiam eveniet.","label":"Aut natus.","portal_id":"Deleniti itaque voluptas magnam.","sender_email":"Voluptatem modi velit vitae optio ut.","sender_name":"Consequuntur sit libero autem ut."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Dolor id."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Accusantium sequi modi corrupti esse mollitia."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."},"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"},"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."},"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."},"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."},"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."},"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vel blanditiis sunt ut facere."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa nihil ad hic repellendus nobis voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum cupiditate."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Vel molestiae consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Vero et voluptas accusamus sunt."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4079703323268843140,"format":"int64"}},"example":{"account_id":"Et corporis officia sint.","has_credentials":false,"id":"Quidem est non tenetur dolore.","label":"Cupiditate voluptatem.","org_id":"Quia nulla autem ratione.","project_id":"Dolores commodi aperiam voluptatibus.","status":"error","version":874315130556833044},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"In mollitia a magni."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Consequatur ea deserunt tempora aut assumenda.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Occaecati eum tenetur."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Inventore aliquid voluptatibus iste mollitia."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Asperiores ipsum quam."},"app_id":{"type":"string","description":"Meta app ID","example":"Cum rem architecto vel quibusdam vel autem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero atque est non praesentium."},"label":{"type":"string","description":"Optional friendly name","example":"Id tenetur exercitationem aperiam incidunt."},"page_id":{"type":"string","description":"Facebook page ID","example":"Qui suscipit rerum quo eligendi tempora."},"project_id":{"type":"string","description":"Owning project","example":"Saepe sit et sed qui dolorem reiciendis."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5968285761891001183,"format":"int64"}},"example":{"account_id":"Quibusdam aliquam consequuntur.","app_id":"Deleniti earum magni quibusdam.","has_credentials":false,"id":"Id facere maxime.","label":"Maxime ut possimus expedita.","page_id":"Facilis facilis aut suscipit aut odio iste.","project_id":"Hic delectus.","status":"active","version":6674224742141168677},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Harum provident quia distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur velit quaerat aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut et."}},"example":{"account_id":"act_193556282970417","app_id":"Blanditiis atque rerum et officiis sapiente et.","label":"Rem harum provident provident quia laboriosam magnam.","page_id":"Hic et sed."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Itaque dolores in hic rem."},"app_secret":{"type":"string","description":"Meta app secret","example":"Eligendi ea vel consequatur nihil."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Vero commodi est qui asperiores velit enim.","app_secret":"Expedita ut minus ut est recusandae aspernatur."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum voluptatem et quam beatae laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Rem suscipit similique ipsam aut quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repudiandae voluptatem vitae iste maxime modi laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Magnam fugit."},"project_id":{"type":"string","description":"Owning project","example":"Dignissimos necessitatibus consequuntur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7512765750150729777,"format":"int64"}},"example":{"account_id":"Nobis nam.","customer_id":"Reiciendis pariatur quisquam.","has_credentials":true,"id":"Laudantium dolore.","label":"Non quidem doloribus debitis itaque itaque dolores.","project_id":"Possimus nihil qui enim ratione voluptatem eos.","status":"error","version":7616558197057713508},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Aspernatur facere."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem dicta rerum sed."},"label":{"type":"string","description":"Optional friendly name","example":"Aspernatur ea voluptatem eum voluptas eveniet assumenda."}},"example":{"account_id":"Quia vero quis consequuntur id.","customer_id":"Quo illum cum quod.","label":"Quia possimus dolore vel qui."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ut fugiat magnam quia."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ut tempora consequuntur cumque repudiandae omnis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Est aut labore sint natus."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Distinctio beatae."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ducimus debitis nesciunt quas quibusdam occaecati cum.","client_secret":"Iste voluptatem et voluptatem ut ut.","developer_token":"Quia sed omnis quaerat aut.","refresh_token":"Nostrum laborum minima."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsam temporibus sint et necessitatibus dolorem ut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Fugit voluptas molestias architecto dicta quidem illo."},"label":{"type":"string","description":"Optional friendly name","example":"Quia aut sed fugiat adipisci eos rerum."},"project_id":{"type":"string","description":"Owning project","example":"Doloremque et qui perferendis."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1442766184420227830,"format":"int64"}},"example":{"account_id":"Voluptates neque expedita.","has_credentials":false,"id":"Qui sed fugiat.","label":"Sit iusto.","project_id":"Veniam debitis aut similique ullam temporibus qui.","status":"active","version":3889986261433875806},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Quisquam ut eius."}},"example":{"account_id":"t2_gv9wtbfa","label":"Ipsum nihil cumque repellendus sint soluta."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sed quibusdam reiciendis qui vel."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Amet et eaque."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Consequatur iste sed illo adipisci sunt."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Soluta consectetur porro quo quia incidunt.","client_secret":"Aperiam et ipsam vitae.","refresh_token":"Velit est quis aliquid aliquam."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vitae quae debitis sunt aperiam ex voluptatibus."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"In fuga ut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate nisi natus sint."},"label":{"type":"string","description":"Optional friendly name","example":"Ut dolor velit."},"project_id":{"type":"string","description":"Owning project","example":"Beatae aliquam quia officiis hic ea."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6056629402053782931,"format":"int64"}},"example":{"account_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","funding_instrument_id":"Fuga illo dolorem sit ex commodi sapiente.","has_credentials":false,"id":"Iusto quidem laudantium.","label":"Quaerat ut neque expedita nostrum.","project_id":"Ratione consequuntur aut et corrupti.","status":"error","version":5145245548849296683},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Excepturi dolorem autem ipsa autem provident."},"label":{"type":"string","description":"Optional friendly name","example":"Illum tenetur numquam."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Quis et odio tenetur optio.","label":"Iure quo culpa."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Nostrum dolorum iure eaque animi."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Ut sint."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Iste eveniet laudantium rerum."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Error necessitatibus et autem doloribus est.","access_token_secret":"Maxime labore illo maxime provident.","consumer_key":"Error laudantium.","consumer_secret":"Similique odio adipisci dolore iste."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Iusto velit quo voluptatibus modi reiciendis aliquam."},"event_details":{"description":"Extracted event/course details","example":"Odit necessitatibus veritatis amet ut rerum quidem."},"event_slug":{"type":"string","description":"Event/course slug","example":"Eos voluptatibus."},"id":{"type":"string","description":"Brief UUID","example":"Vero quisquam."},"keywords":{"description":"Keyword list","example":"Quidem explicabo expedita sunt."},"platforms":{"type":"array","items":{"type":"string","example":"Ex delectus."},"description":"Suggested default platforms","example":["Ullam dolores rem.","Officia quidem non qui voluptates natus cum.","Autem recusandae totam.","Rerum nisi."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis reiciendis dignissimos consequatur iste qui minima."},"project_id":{"type":"string","description":"Owning project","example":"Labore laudantium."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Similique deserunt iusto."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptatem sed quia excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8240116664126121650,"format":"int64"}},"example":{"copy":"Placeat ea odio ea eos.","event_details":"Non adipisci rerum.","event_slug":"Adipisci quaerat est nobis.","id":"Possimus exercitationem repellendus quo quidem.","keywords":"Ipsum et delectus dolorum eveniet.","platforms":["Veritatis quisquam sed ratione et.","Cumque molestiae eos rem aut.","Quos impedit."],"program_type":"Illum rerum error incidunt.","project_id":"Cumque totam nulla aut reprehenderit.","status":"approved","targeting":"Alias ea quibusdam.","url":"Fugit non fuga rem adipisci.","version":8901460428935487189},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et eveniet."},"event_details":{"description":"Extracted event/course details","example":"Est eaque ipsam harum nisi nobis."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Enim dolorum nobis itaque est enim."},"keywords":{"description":"Keyword list","example":"Corporis ut non."},"platforms":{"type":"array","items":{"type":"string","example":"Praesentium ipsam officiis cum ipsum recusandae."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Ullam pariatur ex voluptas aspernatur.","Voluptates aliquam vero ducimus.","Recusandae aut perferendis."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eius sed qui deserunt perspiciatis nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Pariatur explicabo est totam."}},"example":{"copy":"Provident provident.","event_details":"Odit rerum quidem accusamus.","event_slug":"Tempora minima voluptas quod facere aut.","keywords":"Odit iusto ad animi eos doloribus autem.","platforms":["Hic quis facere exercitationem.","Exercitationem aut eaque."],"program_type":"membership","targeting":"Sed voluptatum laborum.","url":"Porro dolor ipsa."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut rerum ut blanditiis dolor."},"id":{"type":"string","description":"Campaign UUID","example":"Voluptatibus quos accusantium fugit."},"platform":{"type":"string","description":"Channel","example":"Molestiae minus dolor accusantium."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Cum molestias fuga voluptatibus quis."},"project_id":{"type":"string","description":"Owning project","example":"Excepturi saepe sit vel perspiciatis neque."},"status":{"type":"string","description":"Campaign status","example":"Nobis aliquid rerum consequatur officiis velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8006615023617839427,"format":"int64"}},"example":{"brief_id":"Omnis voluptates quaerat.","campaign_name":"Beatae placeat cumque iure veritatis cumque.","id":"Assumenda accusantium.","platform":"Quos cum porro architecto.","platform_campaign_id":"Aperiam doloribus aut.","project_id":"Fugiat dolore similique.","status":"Ex distinctio ipsum ab assumenda natus.","version":5157498100002718362},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Velit dolores eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"reddit-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["google-ads","linkedin-ads","hubspot","hubspot"]}},"example":{"config":"Est et expedita itaque.","platforms":["reddit-ads","microsoft-ads","microsoft-ads","reddit-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Est in deserunt."},"config":{"description":"Campaign configuration snapshot","example":"Odio sunt totam."},"status":{"type":"string","description":"Campaign status","example":"Omnis explicabo doloremque et sed."}},"example":{"campaign_name":"Sunt id ipsa perspiciatis sunt.","config":"Impedit at perspiciatis quisquam perferendis.","status":"Velit voluptatibus aut mollitia aut molestiae exercitationem."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Suscipit ut mollitia accusantium dignissimos numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Ratione nesciunt."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Qui molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6319115309163667798,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Suscipit quas sunt eos nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Qui maiores aut reiciendis ullam."},"description":"Platforms this job will create on","example":["Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur non cumque laudantium quod modi voluptas.","platforms":["Et ad.","Quia dolores voluptatibus tempora possimus consequatur.","Unde nihil et.","Quod est voluptas sequi voluptatem numquam."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Nihil ea quod et aut."},"job_id":{"type":"string","description":"Job UUID","example":"Ut alias quis nihil dolore suscipit reprehenderit."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Animi laudantium ullam omnis autem et id."},"status":{"type":"string","description":"Job status","example":"failed","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Molestiae ratione officia fugit provident officia.","job_id":"Inventore enim reiciendis.","result":"Ut rerum facilis.","status":"failed"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index b20cb445..8e0d6c4a 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -13,6 +13,679 @@ produces: - application/xml - application/gob paths: + /projects/{project_id}/briefs: + post: + tags: + - lfx-v2-campaign-service-briefs + summary: create-brief lfx-v2-campaign-service-briefs + description: Create a brief. + operationId: lfx-v2-campaign-service-briefs#create-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: Create-BriefRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody' + required: + - brief + responses: + "201": + description: Created response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-brief lfx-v2-campaign-service-briefs + description: Get a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-briefs + summary: update-brief lfx-v2-campaign-service-briefs + description: Replace a brief (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + required: false + type: string + - name: Update-BriefRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody' + required: + - brief + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "412": + description: Precondition Failed response. + schema: + $ref: '#/definitions/PreconditionFailedError' + required: + - code + - message + "428": + description: Precondition Required response. + schema: + $ref: '#/definitions/PreconditionRequiredError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + delete: + tags: + - lfx-v2-campaign-service-briefs + summary: delete-brief lfx-v2-campaign-service-briefs + description: Archive a brief (soft delete). + operationId: lfx-v2-campaign-service-briefs#delete-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "204": + description: No Content response. + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}/approve: + post: + tags: + - lfx-v2-campaign-service-briefs + summary: approve-brief lfx-v2-campaign-service-briefs + description: Approve a brief for campaign creation. + operationId: lfx-v2-campaign-service-briefs#approve-brief + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Brief' + required: + - id + - project_id + - program_type + - event_slug + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}/campaigns: + post: + tags: + - lfx-v2-campaign-service-briefs + summary: create-campaigns lfx-v2-campaign-service-briefs + description: Create campaigns across the selected platforms (async -> job). + operationId: lfx-v2-campaign-service-briefs#create-campaigns + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: Create-CampaignsRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody' + required: + - input + responses: + "202": + description: Accepted response. + schema: + $ref: '#/definitions/JobCreateResponse' + required: + - job_id + - status + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + /projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-campaign lfx-v2-campaign-service-briefs + description: Get one campaign under a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-campaign + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: campaign_id + in: path + description: Campaign UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Campaign' + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-briefs + summary: update-campaign lfx-v2-campaign-service-briefs + description: Replace a campaign (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-campaign + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: brief_id + in: path + description: Brief UUID + required: true + type: string + - name: campaign_id + in: path + description: Campaign UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + required: false + type: string + - name: Update-CampaignRequestBody + in: body + required: true + schema: + $ref: '#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody' + required: + - campaign + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/Campaign' + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + headers: + ETag: + description: ETag header value (mirrors version) + type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "412": + description: Precondition Failed response. + schema: + $ref: '#/definitions/PreconditionFailedError' + required: + - code + - message + "428": + description: Precondition Required response. + schema: + $ref: '#/definitions/PreconditionRequiredError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] /projects/{project_id}/connection-google-ads: get: tags: @@ -2659,6 +3332,76 @@ paths: - http security: - jwt_header_Authorization: [] + /projects/{project_id}/jobs/{job_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-job lfx-v2-campaign-service-briefs + description: Poll campaign-creation job status. + operationId: lfx-v2-campaign-service-briefs#get-job + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + type: string + - name: job_id + in: path + description: Job UUID + required: true + type: string + - name: Authorization + in: header + description: JWT token issued by Heimdall + required: false + type: string + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/JobPollResponse' + required: + - job_id + - status + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message + "404": + description: Not Found response. + schema: + $ref: '#/definitions/NotFoundError' + required: + - code + - message + "409": + description: Conflict response. + schema: + $ref: '#/definitions/ConflictError' + required: + - code + - message + "500": + description: Internal Server Error response. + schema: + $ref: '#/definitions/InternalServerError' + required: + - code + - message + "503": + description: Service Unavailable response. + schema: + $ref: '#/definitions/ConnServiceUnavailableError' + required: + - code + - message + schemes: + - http + security: + - jwt_header_Authorization: [] definitions: BadRequestError: title: BadRequestError @@ -2679,6 +3422,256 @@ definitions: required: - code - message + Brief: + title: Brief + type: object + properties: + copy: + description: Ad copy + example: Iusto velit quo voluptatibus modi reiciendis aliquam. + event_details: + description: Extracted event/course details + example: Odit necessitatibus veritatis amet ut rerum quidem. + event_slug: + type: string + description: Event/course slug + example: Eos voluptatibus. + id: + type: string + description: Brief UUID + example: Vero quisquam. + keywords: + description: Keyword list + example: Quidem explicabo expedita sunt. + platforms: + type: array + items: + type: string + example: Ex delectus. + description: Suggested default platforms + example: + - Ullam dolores rem. + - Officia quidem non qui voluptates natus cum. + - Autem recusandae totam. + - Rerum nisi. + program_type: + type: string + description: Funnel context + example: Facilis reiciendis dignissimos consequatur iste qui minima. + project_id: + type: string + description: Owning project + example: Labore laudantium. + status: + type: string + description: Lifecycle status + example: archived + enum: + - draft + - approved + - archived + targeting: + description: Targeting recommendation + example: Similique deserunt iusto. + url: + type: string + description: Event/course page URL + example: Voluptatem sed quia excepturi. + version: + type: integer + description: Optimistic-concurrency version + example: 8240116664126121650 + format: int64 + example: + copy: Placeat ea odio ea eos. + event_details: Non adipisci rerum. + event_slug: Adipisci quaerat est nobis. + id: Possimus exercitationem repellendus quo quidem. + keywords: Ipsum et delectus dolorum eveniet. + platforms: + - Veritatis quisquam sed ratione et. + - Cumque molestiae eos rem aut. + - Quos impedit. + program_type: Illum rerum error incidunt. + project_id: Cumque totam nulla aut reprehenderit. + status: approved + targeting: Alias ea quibusdam. + url: Fugit non fuga rem adipisci. + version: 8901460428935487189 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + BriefInput: + title: BriefInput + type: object + properties: + copy: + description: Ad copy + example: Et eveniet. + event_details: + description: Extracted event/course details + example: Est eaque ipsam harum nisi nobis. + event_slug: + type: string + description: Event/course slug (unique within the project) + example: Enim dolorum nobis itaque est enim. + keywords: + description: Keyword list + example: Corporis ut non. + platforms: + type: array + items: + type: string + example: Praesentium ipsam officiis cum ipsum recusandae. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) + example: + - Ullam pariatur ex voluptas aspernatur. + - Voluptates aliquam vero ducimus. + - Recusandae aut perferendis. + program_type: + type: string + description: Funnel context + example: events + enum: + - events + - education + - membership + targeting: + description: Targeting recommendation + example: Eius sed qui deserunt perspiciatis nihil. + url: + type: string + description: Event/course page URL + example: Pariatur explicabo est totam. + example: + copy: Provident provident. + event_details: Odit rerum quidem accusamus. + event_slug: Tempora minima voluptas quod facere aut. + keywords: Odit iusto ad animi eos doloribus autem. + platforms: + - Hic quis facere exercitationem. + - Exercitationem aut eaque. + program_type: membership + targeting: Sed voluptatum laborum. + url: Porro dolor ipsa. + required: + - program_type + - event_slug + Campaign: + title: Campaign + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Qui molestias. + campaign_name: + type: string + description: Campaign name + example: Aut rerum ut blanditiis dolor. + id: + type: string + description: Campaign UUID + example: Voluptatibus quos accusantium fugit. + platform: + type: string + description: Channel + example: Molestiae minus dolor accusantium. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Cum molestias fuga voluptatibus quis. + project_id: + type: string + description: Owning project + example: Excepturi saepe sit vel perspiciatis neque. + status: + type: string + description: Campaign status + example: Nobis aliquid rerum consequatur officiis velit. + version: + type: integer + description: Optimistic-concurrency version + example: 8006615023617839427 + format: int64 + example: + brief_id: Omnis voluptates quaerat. + campaign_name: Beatae placeat cumque iure veritatis cumque. + id: Assumenda accusantium. + platform: Quos cum porro architecto. + platform_campaign_id: Aperiam doloribus aut. + project_id: Fugiat dolore similique. + status: Ex distinctio ipsum ab assumenda natus. + version: 5157498100002718362 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + CampaignCreateInput: + title: CampaignCreateInput + type: object + properties: + config: + description: Per-platform campaign configuration + example: Velit dolores eligendi. + platforms: + type: array + items: + type: string + example: reddit-ads + enum: + - google-ads + - linkedin-ads + - meta-ads + - reddit-ads + - twitter-ads + - microsoft-ads + - hubspot + description: Platforms to create campaigns on (binding selection) + example: + - google-ads + - linkedin-ads + - hubspot + - hubspot + example: + config: Est et expedita itaque. + platforms: + - reddit-ads + - microsoft-ads + - microsoft-ads + - reddit-ads + required: + - platforms + CampaignUpdateInput: + title: CampaignUpdateInput + type: object + properties: + campaign_name: + type: string + description: Campaign name + example: Est in deserunt. + config: + description: Campaign configuration snapshot + example: Odio sunt totam. + status: + type: string + description: Campaign status + example: Omnis explicabo doloremque et sed. + example: + campaign_name: Sunt id ipsa perspiciatis sunt. + config: Impedit at perspiciatis quisquam perferendis. + status: Velit voluptatibus aut mollitia aut molestiae exercitationem. + required: + - campaign_name + - status ConflictError: title: ConflictError type: object @@ -2691,7 +3684,7 @@ definitions: type: string description: Error message example: A connection for this provider already exists on the project. - description: A connection already exists for this provider on the project + description: Conflict example: code: "409" message: A connection for this provider already exists on the project. @@ -2724,14 +3717,14 @@ definitions: message: type: string description: Human-readable detail - example: Labore aut eum porro. + example: Accusamus et atque enim. ok: type: boolean description: Whether the credential authenticated against the provider example: true example: - message: Necessitatibus consequatur natus tempora ut. - ok: true + message: Rerum dicta distinctio. + ok: false required: - ok GoogleAdsConnection: @@ -2741,31 +3734,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Aut voluptatem inventore ab. + example: Reiciendis rerum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quis et maxime ipsam voluptatem repudiandae laudantium. + example: Suscipit ut mollitia accusantium dignissimos numquam. label: type: string description: Optional friendly name - example: Nobis ipsam. + example: Ratione nesciunt. login_customer_id: type: string description: Manager account used for API access - example: Iusto quis magni et velit. + example: Voluptate mollitia. project_id: type: string description: Owning project - example: Ut ipsum id. + example: Qui molestiae. status: type: string description: Connection status - example: deleted + example: active enum: - active - inactive @@ -2774,17 +3767,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 8470973010316083422 + example: 6319115309163667798 format: int64 example: - account_id: Aut id molestiae sit. + account_id: Quisquam incidunt qui. has_credentials: true - id: Magni voluptas odio assumenda totam. - label: Nam cumque. - login_customer_id: Qui esse. - project_id: Est praesentium dolor officiis deleniti. - status: active - version: 7862773009082385007 + id: Atque dolores accusantium non dolor. + label: Nobis labore dicta. + login_customer_id: Quia exercitationem consequatur velit. + project_id: Enim qui officia id necessitatibus mollitia soluta. + status: inactive + version: 2620236536617279883 required: - id - project_id @@ -2821,25 +3814,25 @@ definitions: client_id: type: string description: OAuth client id - example: Ducimus sequi. + example: Officiis est. client_secret: type: string description: OAuth client secret - example: Autem ab voluptas culpa. + example: Qui quisquam voluptatibus sint quia. developer_token: type: string description: Google Ads developer token - example: Quia tenetur ducimus. + example: Tempore nemo illum ut maiores. refresh_token: type: string description: OAuth refresh token - example: Aut et. + example: Quia culpa iste id sit incidunt. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Alias non sequi consequatur dolorum. - client_secret: Voluptatem voluptas omnis est tempora ipsum aut. - developer_token: Harum et minus voluptas. - refresh_token: Facere harum enim consequatur id voluptatem. + client_id: Sit repudiandae aut aut ducimus dolores vel. + client_secret: Minus voluptatem sed architecto itaque doloribus. + developer_token: Consequatur quis fugiat expedita recusandae qui. + refresh_token: Accusantium enim temporibus dolor ipsam. required: - refresh_token - client_id @@ -2852,43 +3845,43 @@ definitions: account_id: type: string description: Provider account identifier - example: Sed maiores qui sed exercitationem quam. + example: Repellat assumenda nesciunt distinctio eaque aliquam. brand_kit: type: string description: Per-project brand kit selector - example: Asperiores facere et exercitationem soluta possimus. + example: Et voluptatem deserunt consequuntur omnis sed dolore. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: In expedita. + example: Quo veritatis quis delectus est. label: type: string description: Optional friendly name - example: Suscipit sed minus soluta quasi. + example: Vel voluptate. portal_id: type: string description: HubSpot portal/account ID - example: Quia ducimus. + example: In hic. project_id: type: string description: Owning project - example: Magnam cumque quasi magni ducimus. + example: Et rerum in expedita. sender_email: type: string description: Default sender address - example: Et veritatis voluptas nobis. + example: Facere ipsa et reprehenderit dignissimos voluptas. sender_name: type: string description: Default sender name - example: Doloremque architecto ea et. + example: Consequatur dignissimos itaque quia ut aperiam cum. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -2897,20 +3890,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4054743500330389510 + example: 4147907586526409625 format: int64 example: - account_id: Est iste. - brand_kit: Quae aut culpa impedit sit. + account_id: Assumenda dignissimos beatae vitae aut ea dolor. + brand_kit: Eaque voluptate reprehenderit sed voluptatem sed illo. has_credentials: true - id: Aliquid et in. - label: Distinctio aut. - portal_id: Earum modi esse. - project_id: Consequuntur omnis a dignissimos voluptate. - sender_email: Possimus placeat enim ab. - sender_name: Esse et qui et voluptatibus tempore. - status: active - version: 3449749392517333935 + id: Voluptatibus quod necessitatibus non iste ad rem. + label: Harum corporis deleniti doloribus. + portal_id: Sit architecto ut unde. + project_id: Sunt qui cupiditate ullam ab suscipit et. + sender_email: Sapiente possimus. + sender_name: Voluptates atque. + status: error + version: 6055913800302101668 required: - id - project_id @@ -2925,34 +3918,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Velit labore non. + example: Cum nisi numquam. brand_kit: type: string description: Per-project brand kit selector - example: Dolorem sapiente. + example: Blanditiis mollitia dolores illo nostrum magnam. label: type: string description: Optional friendly name - example: Nulla adipisci aperiam dolorem molestias. + example: Praesentium tenetur quas at ut necessitatibus dolor. portal_id: type: string description: HubSpot portal/account ID - example: Odit est esse. + example: Id unde veritatis officiis aut fugiat. sender_email: type: string description: Default sender address - example: Ea cum et magni adipisci magnam. + example: Ut commodi et voluptas tenetur nobis facere. sender_name: type: string description: Default sender name - example: Atque labore qui odio et corporis. + example: Quo corporis recusandae dicta quibusdam. example: - account_id: Sint autem. - brand_kit: Debitis soluta sed quod dicta aperiam eveniet. - label: Aut natus. - portal_id: Deleniti itaque voluptas magnam. - sender_email: Voluptatem modi velit vitae optio ut. - sender_name: Consequuntur sit libero autem ut. + account_id: Omnis nobis. + brand_kit: Dolorum ut architecto deleniti nostrum. + label: Nostrum tempore. + portal_id: Deserunt repellendus corrupti itaque quo sit. + sender_email: Rerum explicabo. + sender_name: Eum et ipsum expedita reprehenderit eos. required: - account_id HubspotCredentials: @@ -2962,10 +3955,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Dolor id. + example: Aperiam et nihil. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Accusantium sequi modi corrupti esse mollitia. + private_app_token: Perspiciatis porro. required: - private_app_token InternalServerError: @@ -2987,6 +3980,142 @@ definitions: required: - code - message + JobCreateResponse: + title: JobCreateResponse + type: object + properties: + job_id: + type: string + description: Poll GET /projects/{projectId}/jobs/{jobId} + example: Suscipit quas sunt eos nulla. + platforms: + type: array + items: + type: string + example: Qui maiores aut reiciendis ullam. + description: Platforms this job will create on + example: + - Et quidem nisi quasi. + - Ab deserunt quia magnam temporibus minus et. + status: + type: string + description: Initial status (always 'queued' on create) + example: queued + enum: + - queued + example: + job_id: Consequatur non cumque laudantium quod modi voluptas. + platforms: + - Et ad. + - Quia dolores voluptatibus tempora possimus consequatur. + - Unde nihil et. + - Quod est voluptas sequi voluptatem numquam. + status: queued + required: + - job_id + - status + JobPollResponse: + title: JobPollResponse + type: object + properties: + error: + type: string + description: Terminal error, if any + example: Nihil ea quod et aut. + job_id: + type: string + description: Job UUID + example: Ut alias quis nihil dolore suscipit reprehenderit. + result: + description: Per-platform results, written once when the job reaches a terminal state + example: Animi laudantium ullam omnis autem et id. + status: + type: string + description: Job status + example: failed + enum: + - queued + - running + - succeeded + - partial + - failed + example: + error: Molestiae ratione officia fugit provident officia. + job_id: Inventore enim reiciendis. + result: Ut rerum facilis. + status: failed + required: + - job_id + - status + LfxV2CampaignServiceBriefsCreateBriefRequestBody: + title: LfxV2CampaignServiceBriefsCreateBriefRequestBody + type: object + properties: + brief: + $ref: '#/definitions/BriefInput' + example: + brief: + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + platforms: + - Molestiae saepe qui. + - Commodi voluptatem expedita. + program_type: membership + targeting: Facilis iste. + url: Quia ut atque. + required: + - brief + LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: + title: LfxV2CampaignServiceBriefsCreateCampaignsRequestBody + type: object + properties: + input: + $ref: '#/definitions/CampaignCreateInput' + example: + input: + config: Est voluptatum enim earum et doloribus. + platforms: + - hubspot + - meta-ads + - reddit-ads + - twitter-ads + required: + - input + LfxV2CampaignServiceBriefsUpdateBriefRequestBody: + title: LfxV2CampaignServiceBriefsUpdateBriefRequestBody + type: object + properties: + brief: + $ref: '#/definitions/BriefInput' + example: + brief: + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + platforms: + - Molestiae saepe qui. + - Commodi voluptatem expedita. + program_type: membership + targeting: Facilis iste. + url: Quia ut atque. + required: + - brief + LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: + title: LfxV2CampaignServiceBriefsUpdateCampaignRequestBody + type: object + properties: + campaign: + $ref: '#/definitions/CampaignUpdateInput' + example: + campaign: + campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. + config: Error similique. + status: Maxime fugiat illo. + required: + - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: title: LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody type: object @@ -3001,10 +4130,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - config - credentials @@ -3018,14 +4147,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Distinctio aut. required: - config - credentials @@ -3040,10 +4169,10 @@ definitions: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Tempora error rerum quae nihil. org_id: "208777" credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - config - credentials @@ -3058,12 +4187,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - config - credentials @@ -3077,14 +4206,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. required: - config - credentials @@ -3099,11 +4228,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Provident quia distinctio. credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - config - credentials @@ -3118,13 +4247,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - config - credentials @@ -3136,10 +4265,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -3150,7 +4279,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Distinctio aut. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -3161,7 +4290,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -3172,8 +4301,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -3184,10 +4313,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -3198,9 +4327,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -3211,10 +4340,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -3238,12 +4367,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -3255,7 +4384,7 @@ definitions: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Tempora error rerum quae nihil. org_id: "208777" required: - config @@ -3268,9 +4397,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -3281,9 +4410,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -3295,7 +4424,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Provident quia distinctio. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -3307,8 +4436,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. required: - config LinkedinAdsConnection: @@ -3318,31 +4447,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Vel blanditiis sunt ut facere. + example: Velit in recusandae maiores et voluptatem voluptatem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Ipsa nihil ad hic repellendus nobis voluptatem. + example: Ut ut nisi fuga nostrum velit hic. label: type: string description: Optional friendly name - example: Rerum cupiditate. + example: Atque dolor odio labore pariatur. org_id: type: string description: LinkedIn organization URN id - example: Vel molestiae consequatur. + example: Qui consequatur et dignissimos ex. project_id: type: string description: Owning project - example: Vero et voluptas accusamus sunt. + example: Omnis reprehenderit distinctio quos ut unde. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -3351,17 +4480,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4079703323268843140 + example: 342612035894089324 format: int64 example: - account_id: Et corporis officia sint. - has_credentials: false - id: Quidem est non tenetur dolore. - label: Cupiditate voluptatem. - org_id: Quia nulla autem ratione. - project_id: Dolores commodi aperiam voluptatibus. - status: error - version: 874315130556833044 + account_id: Vel natus provident. + has_credentials: true + id: Praesentium voluptas beatae. + label: Eos et architecto voluptas. + org_id: Ut non error aut et fuga. + project_id: Officia et sint numquam accusamus. + status: inactive + version: 4235609230431250467 required: - id - project_id @@ -3380,14 +4509,14 @@ definitions: label: type: string description: Optional friendly name - example: In mollitia a magni. + example: Nihil nihil quae porro qui rem autem. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Consequatur ea deserunt tempora aut assumenda. + label: Et nulla officia vitae. org_id: "208777" required: - account_id @@ -3399,10 +4528,10 @@ definitions: access_token: type: string description: OAuth access token - example: Occaecati eum tenetur. + example: Eveniet quibusdam. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Inventore aliquid voluptatibus iste mollitia. + access_token: Ut asperiores quo aut. required: - access_token MetaAdsConnection: @@ -3412,31 +4541,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Asperiores ipsum quam. + example: Laudantium amet veritatis rerum itaque consequatur laboriosam. app_id: type: string description: Meta app ID - example: Cum rem architecto vel quibusdam vel autem. + example: Quis illo minima. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Libero atque est non praesentium. + example: Et sunt quis dicta voluptate aut in. label: type: string description: Optional friendly name - example: Id tenetur exercitationem aperiam incidunt. + example: Excepturi deleniti voluptas aperiam vel. page_id: type: string description: Facebook page ID - example: Qui suscipit rerum quo eligendi tempora. + example: Provident maiores. project_id: type: string description: Owning project - example: Saepe sit et sed qui dolorem reiciendis. + example: Provident nobis soluta culpa vitae. status: type: string description: Connection status @@ -3449,18 +4578,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 5968285761891001183 + example: 206759142589582139 format: int64 example: - account_id: Quibusdam aliquam consequuntur. - app_id: Deleniti earum magni quibusdam. + account_id: At odio incidunt distinctio sint qui. + app_id: Enim cumque saepe sint quidem odio. has_credentials: false - id: Id facere maxime. - label: Maxime ut possimus expedita. - page_id: Facilis facilis aut suscipit aut odio iste. - project_id: Hic delectus. - status: active - version: 6674224742141168677 + id: Earum eligendi. + label: Provident dicta temporibus debitis. + page_id: Non quae omnis. + project_id: Ipsum sunt assumenda ipsa dolor officia eligendi. + status: inactive + version: 1065443246813246267 required: - id - project_id @@ -3479,20 +4608,20 @@ definitions: app_id: type: string description: Meta app ID - example: Harum provident quia distinctio ea. + example: Voluptatibus deserunt. label: type: string description: Optional friendly name - example: Tenetur velit quaerat aut. + example: Accusantium aut. page_id: type: string description: Facebook page ID - example: Aut et. + example: Deleniti error pariatur consequatur esse. example: account_id: act_193556282970417 - app_id: Blanditiis atque rerum et officiis sapiente et. - label: Rem harum provident provident quia laboriosam magnam. - page_id: Hic et sed. + app_id: Et eum est molestiae necessitatibus magni. + label: Necessitatibus eos. + page_id: Et eligendi et numquam dolorum consequatur in. required: - account_id MetaAdsCredentials: @@ -3502,15 +4631,15 @@ definitions: access_token: type: string description: Meta access token - example: Itaque dolores in hic rem. + example: Molestiae praesentium perferendis deserunt ipsum dolorum. app_secret: type: string description: Meta app secret - example: Eligendi ea vel consequatur nihil. + example: Error nulla fuga fugit repellendus et accusamus. description: Meta Ads credential. Write-only; never returned. example: - access_token: Vero commodi est qui asperiores velit enim. - app_secret: Expedita ut minus ut est recusandae aspernatur. + access_token: Non sequi error assumenda quam deleniti et. + app_secret: Nam quia aperiam sunt est. required: - access_token - app_secret @@ -3521,27 +4650,27 @@ definitions: account_id: type: string description: Provider account identifier - example: Ipsum voluptatem et quam beatae laborum omnis. + example: A necessitatibus molestiae. customer_id: type: string description: Microsoft Advertising customer ID - example: Rem suscipit similique ipsam aut quis. + example: Dolorem qui explicabo consequuntur repellat non suscipit. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Repudiandae voluptatem vitae iste maxime modi laborum. + example: Quos hic doloribus. label: type: string description: Optional friendly name - example: Magnam fugit. + example: Eum et sint corrupti eos. project_id: type: string description: Owning project - example: Dignissimos necessitatibus consequuntur. + example: Neque autem ex eos. status: type: string description: Connection status @@ -3554,17 +4683,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 7512765750150729777 + example: 7747776820204091337 format: int64 example: - account_id: Nobis nam. - customer_id: Reiciendis pariatur quisquam. - has_credentials: true - id: Laudantium dolore. - label: Non quidem doloribus debitis itaque itaque dolores. - project_id: Possimus nihil qui enim ratione voluptatem eos. - status: error - version: 7616558197057713508 + account_id: Sit est dolores est et. + customer_id: Velit atque laudantium ullam rerum. + has_credentials: false + id: Sit tempore. + label: Ut quo iure. + project_id: Magnam ut similique ea minima magnam. + status: deleted + version: 7309957715046801903 required: - id - project_id @@ -3579,19 +4708,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Aspernatur facere. + example: Enim accusantium labore esse numquam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptatem dicta rerum sed. + example: Non laudantium sunt minima repudiandae illo harum. label: type: string description: Optional friendly name - example: Aspernatur ea voluptatem eum voluptas eveniet assumenda. + example: Rerum adipisci. example: - account_id: Quia vero quis consequuntur id. - customer_id: Quo illum cum quod. - label: Quia possimus dolore vel qui. + account_id: Sit dolor sunt eos nihil ipsam. + customer_id: Odio totam cum deleniti placeat fuga. + label: Dolorum deserunt. required: - account_id MicrosoftAdsCredentials: @@ -3601,25 +4730,25 @@ definitions: client_id: type: string description: OAuth client id - example: Ut fugiat magnam quia. + example: Saepe voluptatem reiciendis pariatur. client_secret: type: string description: OAuth client secret - example: Ut tempora consequuntur cumque repudiandae omnis ut. + example: Et ut quis ut. developer_token: type: string description: Microsoft Advertising developer token - example: Est aut labore sint natus. + example: Quia cum non. refresh_token: type: string description: OAuth refresh token - example: Distinctio beatae. + example: Iusto omnis. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Ducimus debitis nesciunt quas quibusdam occaecati cum. - client_secret: Iste voluptatem et voluptatem ut ut. - developer_token: Quia sed omnis quaerat aut. - refresh_token: Nostrum laborum minima. + client_id: Aut autem sint minus voluptatum. + client_secret: Tempore quae. + developer_token: Dolores tenetur ut illum. + refresh_token: Consequatur dolore unde illum. required: - client_id - client_secret @@ -3689,7 +4818,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Ipsam temporibus sint et necessitatibus dolorem ut. + example: Quam quis quam dolor occaecati earum iusto. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3697,15 +4826,15 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Fugit voluptas molestias architecto dicta quidem illo. + example: Libero ut est rerum est occaecati et. label: type: string description: Optional friendly name - example: Quia aut sed fugiat adipisci eos rerum. + example: Delectus voluptatem iste nisi in. project_id: type: string description: Owning project - example: Doloremque et qui perferendis. + example: Natus expedita aspernatur consequuntur quod ducimus molestias. status: type: string description: Connection status @@ -3718,16 +4847,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 1442766184420227830 + example: 6933590282461306362 format: int64 example: - account_id: Voluptates neque expedita. + account_id: Nostrum corporis quasi magnam. has_credentials: false - id: Qui sed fugiat. - label: Sit iusto. - project_id: Veniam debitis aut similique ullam temporibus qui. - status: active - version: 3889986261433875806 + id: Iste qui rerum est sed sed similique. + label: Expedita voluptatum commodi fuga ipsa. + project_id: Ea maiores quidem molestiae deleniti omnis. + status: inactive + version: 6739884703025890394 required: - id - project_id @@ -3746,10 +4875,10 @@ definitions: label: type: string description: Optional friendly name - example: Quisquam ut eius. + example: Sint ipsa quo. example: account_id: t2_gv9wtbfa - label: Ipsum nihil cumque repellendus sint soluta. + label: Architecto quas eligendi impedit qui sed. required: - account_id RedditAdsCredentials: @@ -3759,20 +4888,20 @@ definitions: client_id: type: string description: OAuth client id - example: Sed quibusdam reiciendis qui vel. + example: Necessitatibus laudantium est ut. client_secret: type: string description: OAuth client secret - example: Amet et eaque. + example: Neque facilis est qui possimus eligendi. refresh_token: type: string description: OAuth refresh token - example: Consequatur iste sed illo adipisci sunt. + example: Possimus et corrupti et nobis voluptas. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Soluta consectetur porro quo quia incidunt. - client_secret: Aperiam et ipsam vitae. - refresh_token: Velit est quis aliquid aliquam. + client_id: Exercitationem illum et quisquam. + client_secret: Est facilis qui. + refresh_token: Modi ut culpa excepturi blanditiis. required: - client_id - client_secret @@ -3784,31 +4913,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Vitae quae debitis sunt aperiam ex voluptatibus. + example: Rerum illo mollitia odio et dolor. funding_instrument_id: type: string description: Funding instrument for the ad account - example: In fuga ut. + example: Ipsam maiores et maiores laudantium aut perspiciatis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptate nisi natus sint. + example: Quia quisquam corrupti distinctio voluptas eius. label: type: string description: Optional friendly name - example: Ut dolor velit. + example: Nam rerum eaque eius. project_id: type: string description: Owning project - example: Beatae aliquam quia officiis hic ea. + example: Autem est est distinctio sunt aliquid harum. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -3817,17 +4946,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6056629402053782931 + example: 9024066918837864439 format: int64 example: - account_id: Non possimus quos voluptatem doloremque consequatur deleniti. - funding_instrument_id: Fuga illo dolorem sit ex commodi sapiente. - has_credentials: false - id: Iusto quidem laudantium. - label: Quaerat ut neque expedita nostrum. - project_id: Ratione consequuntur aut et corrupti. - status: error - version: 5145245548849296683 + account_id: Ad inventore voluptatum eligendi quasi. + funding_instrument_id: Aperiam velit dolores. + has_credentials: true + id: Voluptates non sint inventore iste iure ut. + label: Porro voluptate. + project_id: Facilis suscipit. + status: inactive + version: 358292288538552244 required: - id - project_id @@ -3846,15 +4975,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Excepturi dolorem autem ipsa autem provident. + example: Dignissimos non sed omnis officiis et. label: type: string description: Optional friendly name - example: Illum tenetur numquam. + example: Placeat unde distinctio ducimus qui. example: account_id: 8r7gb - funding_instrument_id: Quis et odio tenetur optio. - label: Iure quo culpa. + funding_instrument_id: Magni repudiandae. + label: Laboriosam qui id enim. required: - account_id TwitterAdsCredentials: @@ -3864,25 +4993,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + example: Eos quaerat rem aut fuga. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Nostrum dolorum iure eaque animi. + example: Est dolor ut corporis. consumer_key: type: string description: OAuth 1.0a consumer key - example: Ut sint. + example: Nihil corrupti repellat eius. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Iste eveniet laudantium rerum. + example: Qui nobis et delectus quam. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Error necessitatibus et autem doloribus est. - access_token_secret: Maxime labore illo maxime provident. - consumer_key: Error laudantium. - consumer_secret: Similique odio adipisci dolore iste. + access_token: Pariatur debitis. + access_token_secret: Explicabo possimus consequatur. + consumer_key: Cupiditate ut illo dolor quaerat totam. + consumer_secret: Illo vitae occaecati omnis. required: - consumer_key - consumer_secret diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index cfa12163..70d86339 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Inventore ratione id vel iusto optio repellendus."},"example":"Rerum eveniet nam sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Vitae qui.","has_credentials":true,"id":"Minima autem libero natus id esse.","label":"Odit eum commodi autem expedita dolorem.","login_customer_id":"In laborum vel.","project_id":"Sed adipisci eveniet et aut.","status":"active","version":4120562596096857294}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Occaecati quaerat eum quia a excepturi."},"example":"Inventore aut molestiae voluptas hic."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Corrupti reprehenderit et non totam perspiciatis.","has_credentials":false,"id":"Harum laborum est adipisci sint.","label":"Ipsa ex.","login_customer_id":"Perspiciatis voluptatibus architecto velit.","project_id":"Est impedit et tempore provident.","status":"error","version":6280538112072962831}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Inventore impedit unde voluptatem quia ab recusandae."},"example":"Vel omnis iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ut commodi asperiores.","has_credentials":false,"id":"Dignissimos non ut sed.","label":"Perferendis nam voluptatibus totam.","login_customer_id":"Voluptatem similique.","project_id":"Deleniti quam.","status":"inactive","version":2550395787104322115}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Deserunt ab itaque amet numquam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Necessitatibus quaerat minima a voluptatem ipsa et."},"example":"Pariatur perferendis explicabo expedita et velit accusamus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","brand_kit":"Distinctio vel.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","portal_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","sender_email":"Quam et voluptatibus illum dolorem.","sender_name":"Eum dolorum.","status":"active","version":3995988906528985875}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."},"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sequi non et."},"example":"Quibusdam repellendus qui numquam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Voluptates iste autem veniam et enim unde.","brand_kit":"Blanditiis quidem qui iusto sed.","has_credentials":false,"id":"Nesciunt necessitatibus ex ea ullam corrupti sunt.","label":"Modi asperiores ut libero vel.","portal_id":"Rem quia consequuntur ut.","project_id":"Omnis accusantium ad.","sender_email":"Consequatur quos atque voluptates quo sit.","sender_name":"Dolor molestias ipsa dolorum est.","status":"inactive","version":1691702820919785934}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Deleniti placeat rerum."},"example":"Recusandae totam soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Aut ratione sunt nostrum tenetur.","brand_kit":"Ab laboriosam quis sapiente ut sit.","has_credentials":true,"id":"Ipsum quaerat delectus cupiditate sit et.","label":"Magni et rerum sed voluptatum.","portal_id":"Fugit enim et sint consectetur ea minus.","project_id":"Enim est occaecati sed non dolorem distinctio.","sender_email":"Ut laborum nostrum veniam qui rerum.","sender_name":"Eum fugit repudiandae magnam ut.","status":"active","version":2378889005955898844}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Tempora error rerum quae nihil.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ea eum."},"example":"Repudiandae quae aut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Quis repellat tenetur.","has_credentials":false,"id":"Et quam veritatis consequatur sed.","label":"Ipsum fuga deleniti consequatur.","org_id":"Natus laudantium quisquam.","project_id":"Tempora aut incidunt incidunt dolorem eaque et.","status":"inactive","version":2296210645404105233}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"},"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatem doloremque ullam consequatur ut."},"example":"Ipsa magnam cum veritatis mollitia vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Totam quasi vero.","has_credentials":false,"id":"Eum quia molestiae.","label":"Est quos.","org_id":"Est est id repellat quod deleniti cupiditate.","project_id":"Rerum delectus tempora culpa.","status":"error","version":2086671994798543080}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore rem quo fuga accusantium voluptas ratione."},"example":"Numquam optio possimus velit quod."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Ipsa rerum odit et nostrum veritatis dolores.","has_credentials":false,"id":"Aut et voluptas ut officiis.","label":"Debitis voluptatem quam occaecati.","org_id":"Et tenetur sequi dolorum porro.","project_id":"In autem tempore ut esse.","status":"deleted","version":7961829707957443728}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorum voluptates placeat rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"example":"Aut repudiandae voluptatibus odit autem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Voluptatem cupiditate voluptas aliquam facilis iste sed.","app_id":"A sed exercitationem ut.","has_credentials":false,"id":"Expedita unde molestiae.","label":"Velit ullam.","page_id":"Voluptatum a.","project_id":"Voluptas dolor et incidunt pariatur quod odit.","status":"active","version":6376430019451136769}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."},"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Perspiciatis quam iste possimus ipsam."},"example":"Eveniet quia voluptatem impedit cumque doloribus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Fuga ut expedita voluptatum sit.","app_id":"Quia ut atque.","has_credentials":true,"id":"Quis perspiciatis.","label":"Similique vel nobis non molestias.","page_id":"Velit et.","project_id":"Nesciunt unde ullam occaecati maxime.","status":"active","version":8123871071866488705}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dicta qui."},"example":"Voluptate dolorum id ut molestias id."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos quo eum dignissimos iure praesentium.","app_id":"Voluptas ratione delectus ut adipisci.","has_credentials":false,"id":"Doloremque itaque eius magni autem.","label":"Ex tempore.","page_id":"Qui mollitia perferendis eveniet voluptas est et.","project_id":"Ullam tenetur quia totam magni sunt repellat.","status":"inactive","version":7772855560046758577}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aliquam animi unde.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Non eos."},"example":"Enim voluptatem inventore quasi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Optio dolorem omnis.","customer_id":"Rerum adipisci minima quibusdam autem accusantium.","has_credentials":false,"id":"Veniam eum ut libero quibusdam debitis.","label":"Commodi quam voluptates.","project_id":"Ut consectetur.","status":"deleted","version":6203614951491514230}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."},"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus enim quas id porro."},"example":"Quo repudiandae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Exercitationem rerum iste ducimus.","customer_id":"Quidem velit est explicabo est sed.","has_credentials":true,"id":"Modi rerum sint.","label":"Dolorem dolor fugiat quia.","project_id":"Labore iste voluptates quos.","status":"inactive","version":8271015532862321776}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut omnis itaque ut vero voluptatibus."},"example":"Vero dolorem qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Maxime fugiat illo.","customer_id":"Minus est ut.","has_credentials":false,"id":"Tempora recusandae.","label":"Reiciendis architecto atque maxime soluta dolorem ducimus.","project_id":"Itaque harum.","status":"deleted","version":6177609042943350629}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ullam fugiat.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"example":"Fugit eum et sint possimus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Amet iusto provident sequi est.","has_credentials":true,"id":"Voluptas non accusantium.","label":"Sit dolorum excepturi quibusdam.","project_id":"Architecto consequatur enim magnam eius voluptas voluptatibus.","status":"deleted","version":1322493338651594921}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."},"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa aut."},"example":"Impedit vitae molestiae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Ut ea alias.","has_credentials":false,"id":"Explicabo cupiditate rerum.","label":"Hic vero et.","project_id":"Incidunt ipsum est perspiciatis soluta voluptas est.","status":"inactive","version":347677279926224703}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Neque hic voluptatem ad similique sunt."},"example":"Ratione impedit recusandae dolor consequatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Saepe pariatur.","has_credentials":true,"id":"Vero quam.","label":"Eveniet soluta adipisci.","project_id":"Neque tempore voluptatibus quo quod nesciunt.","status":"active","version":779913646680513111}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Repudiandae veniam soluta alias natus aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Enim esse dolores."},"example":"Est perferendis eos et cumque nulla."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Et tempore.","funding_instrument_id":"Est et id laudantium magnam ratione.","has_credentials":false,"id":"Ipsum deserunt ut.","label":"Ut nihil quo tenetur doloribus fugiat natus.","project_id":"Sed ea.","status":"error","version":6360932954176398686}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."},"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel temporibus sunt nulla esse sed."},"example":"Facere sed ea qui pariatur adipisci."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Totam sequi.","funding_instrument_id":"Labore ut iusto dolores.","has_credentials":false,"id":"Dolor ut.","label":"Porro sed minus illo rerum ut.","project_id":"Veniam maiores dolorum sit et.","status":"active","version":5887915076445143491}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Neque maiores quo aliquam in rem."},"example":"Voluptatem possimus veniam dignissimos consequatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Est dolorem eos amet dolorem sed.","funding_instrument_id":"Quia porro.","has_credentials":false,"id":"Ab nobis fuga atque inventore fugiat.","label":"Quod blanditiis et.","project_id":"Laboriosam maxime facere culpa modi.","status":"error","version":796228352115418506}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quo aliquid nobis.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Rerum sunt eum et qui."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Ut quia harum.","ok":false},"required":["ok"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."},"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"},"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."},"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."},"credentials":{"client_id":"Voluptates odit consequatur quis.","client_secret":"Est voluptatum enim earum et doloribus.","developer_token":"Id ducimus eius et laboriosam omnis vitae.","refresh_token":"Ea consequatur et ut."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."},"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."},"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatem sed quia excepturi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ullam dolores rem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Labore laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Eos voluptatibus."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Officia quidem non qui voluptates natus cum."},"project_id":{"type":"string","description":"Owning project","example":"Facilis reiciendis dignissimos consequatur iste qui minima."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1885605882290356239,"format":"int64"}},"example":{"account_id":"Iusto velit quo voluptatibus modi reiciendis aliquam.","etag":"Sunt recusandae similique.","has_credentials":false,"id":"Autem recusandae totam.","label":"Odit necessitatibus veritatis amet ut rerum quidem.","login_customer_id":"Iusto quia.","project_id":"Rerum nisi.","status":"error","version":4043658872882310311},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Error ipsam maiores et maiores laudantium aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aliquid harum quis."},"label":{"type":"string","description":"Optional friendly name","example":"Mollitia odio et dolor et consectetur."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Sint inventore iste iure ut."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eaque eius est rerum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1681601347963415661,"format":"int64"}},"example":{"account_id":"Ipsa et dolore.","has_credentials":true,"id":"Facilis suscipit.","label":"Ad inventore voluptatum eligendi quasi.","login_customer_id":"Placeat unde distinctio ducimus qui.","project_id":"Porro voluptate.","status":"inactive","version":1820304569870851201},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nihil corrupti repellat eius."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Magni repudiandae."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Delectus quam et eos."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam qui id enim."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8134511901185890068,"format":"int64"}},"example":{"account_id":"Illo vitae occaecati omnis.","has_credentials":false,"id":"Rem aut fuga.","label":"Cupiditate ut illo dolor quaerat totam.","login_customer_id":"Explicabo possimus consequatur.","project_id":"Est dolor ut corporis.","status":"active","version":299946558233755685},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","login_customer_id":"Velit atque laudantium ullam rerum.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ut aut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Sit similique ut minima ut."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Voluptatum officia quod error amet quia inventore."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas expedita omnis ex."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Non ut voluptas et accusamus natus id.","client_secret":"Et officia sequi et quam.","developer_token":"Vero quisquam.","refresh_token":"Quia enim illo et eligendi."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus voluptatem iste nisi in."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Nostrum corporis quasi magnam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolor occaecati earum iusto rerum sit cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nam quia aperiam sunt est."},"label":{"type":"string","description":"Optional friendly name","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Iste qui rerum est sed sed similique."},"project_id":{"type":"string","description":"Owning project","example":"Libero ut est rerum est occaecati et."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea maiores quidem molestiae deleniti omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Expedita voluptatum commodi fuga ipsa."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3681253484013323435,"format":"int64"}},"example":{"account_id":"Neque facilis est qui possimus eligendi.","brand_kit":"Voluptas eius error autem est est distinctio.","etag":"Et nobis voluptas dignissimos exercitationem illum.","has_credentials":false,"id":"Qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","portal_id":"Quisquam ex est facilis qui ducimus.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","sender_email":"Ut culpa excepturi.","sender_name":"Officiis quia quisquam corrupti.","status":"inactive","version":8080806383587730069},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Magni omnis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Perferendis culpa voluptatem nostrum eaque deleniti."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatum et impedit quod."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Est repellat."},"project_id":{"type":"string","description":"Owning project","example":"Consectetur et culpa quaerat vel."},"sender_email":{"type":"string","description":"Default sender address","example":"Esse sit id incidunt mollitia non sed."},"sender_name":{"type":"string","description":"Default sender name","example":"Minima est distinctio accusamus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7333781901734102627,"format":"int64"}},"example":{"account_id":"Aliquam animi.","brand_kit":"Eos iusto fugit.","has_credentials":true,"id":"Quo nostrum quia.","label":"Velit quis.","portal_id":"Error dolor placeat et.","project_id":"Ut nobis.","sender_email":"Et esse fugiat aliquid aspernatur voluptatem in.","sender_name":"Consequatur et dolorem.","status":"error","version":2888074467672743464},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptas omnis quidem dolor ipsum voluptas sed."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Tempora dolor quis totam hic quibusdam eveniet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Asperiores quidem."},"label":{"type":"string","description":"Optional friendly name","example":"Nesciunt adipisci odit corrupti laudantium consequatur hic."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Dolorem necessitatibus neque consectetur occaecati earum."},"project_id":{"type":"string","description":"Owning project","example":"Est nostrum atque."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut sint non eum expedita non."},"sender_name":{"type":"string","description":"Default sender name","example":"Sit voluptatem ad ab."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3980984224261423037,"format":"int64"}},"example":{"account_id":"Quidem omnis totam eos non molestias.","brand_kit":"Ducimus id sint eius aut.","has_credentials":false,"id":"Doloribus voluptas mollitia doloremque totam.","label":"Quia doloremque commodi rerum.","portal_id":"Recusandae illum accusamus debitis.","project_id":"Veniam et ducimus quos amet.","sender_email":"Praesentium sint laudantium error.","sender_name":"Nihil iure officiis nemo quia.","status":"inactive","version":6150421422111226538},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ab quo ullam ad."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aperiam facere voluptas quis nihil."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et quia ex et alias ea."},"label":{"type":"string","description":"Optional friendly name","example":"Laborum maiores est ea ducimus ipsum dolorem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Placeat explicabo."},"project_id":{"type":"string","description":"Owning project","example":"Quas quis corporis."},"sender_email":{"type":"string","description":"Default sender address","example":"Rerum tenetur ut voluptatem quo."},"sender_name":{"type":"string","description":"Default sender name","example":"Iste aut cum voluptatem qui et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3448886829732168782,"format":"int64"}},"example":{"account_id":"Vero ut et neque soluta distinctio voluptas.","brand_kit":"Voluptatem incidunt cum.","has_credentials":false,"id":"Rem asperiores eligendi vero.","label":"Facere quas qui aut rerum.","portal_id":"Fugit eum.","project_id":"Voluptatem fugiat et.","sender_email":"Necessitatibus voluptatem incidunt et totam esse rerum.","sender_name":"Dolorem delectus.","status":"active","version":5717670313645740058},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Quis quis reprehenderit non quae omnis qui."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"At odio incidunt distinctio sint qui."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Cumque saepe sint quidem odio ab."},"sender_email":{"type":"string","description":"Default sender address","example":"Aut est."},"sender_name":{"type":"string","description":"Default sender name","example":"Error pariatur consequatur esse."}},"example":{"account_id":"Et eligendi et numquam dolorum consequatur in.","brand_kit":"Non sequi error assumenda quam deleniti et.","label":"Necessitatibus eos.","portal_id":"Et eum est molestiae necessitatibus magni.","sender_email":"Molestiae praesentium perferendis deserunt ipsum dolorum.","sender_name":"Error nulla fuga fugit repellendus et accusamus."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Dolor officia eligendi."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Provident dicta temporibus debitis."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Cumque molestiae eos rem aut."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non adipisci rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Adipisci quaerat est nobis."},"label":{"type":"string","description":"Optional friendly name","example":"Et veritatis quisquam sed ratione et."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Placeat ea odio ea eos."},"project_id":{"type":"string","description":"Owning project","example":"Fugit non fuga rem adipisci."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7868855978793741277,"format":"int64"}},"example":{"account_id":"Nobis itaque est enim magnam pariatur.","etag":"Praesentium ipsam officiis cum ipsum recusandae.","has_credentials":true,"id":"Ipsum et delectus dolorum eveniet.","label":"Maxime maxime porro enim.","org_id":"Adipisci ullam pariatur ex voluptas.","project_id":"Alias ea quibusdam.","status":"active","version":5465298508990820984},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolorum deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Non laudantium sunt minima repudiandae illo harum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Eos nihil ipsam ex odio totam."},"project_id":{"type":"string","description":"Owning project","example":"Enim accusantium labore esse numquam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2440284349670140496,"format":"int64"}},"example":{"account_id":"Omnis consequatur.","has_credentials":true,"id":"Deleniti placeat fuga aut saepe.","label":"Ut quis ut accusantium.","org_id":"Aut autem sint minus voluptatum.","project_id":"Reiciendis pariatur repellat.","status":"error","version":4719926195195381744},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis quis delectus est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tempore quae."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores tenetur ut illum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Expedita accusantium vel voluptate."},"project_id":{"type":"string","description":"Owning project","example":"Consequatur dolore unde illum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1676862666948614995,"format":"int64"}},"example":{"account_id":"Magni consequatur dignissimos itaque quia.","has_credentials":true,"id":"Repellat assumenda nesciunt distinctio eaque aliquam.","label":"Et reprehenderit dignissimos.","org_id":"Et voluptatem deserunt consequuntur omnis sed dolore.","project_id":"Veniam consectetur deserunt in hic dolorum facere.","status":"inactive","version":7072791787806691868},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Assumenda dignissimos beatae vitae aut ea dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatibus quod necessitatibus non iste ad rem."},"label":{"type":"string","description":"Optional friendly name","example":"Harum corporis deleniti doloribus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Sit architecto ut unde."},"project_id":{"type":"string","description":"Owning project","example":"Sunt qui cupiditate ullam ab suscipit et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6055913800302101668,"format":"int64"}},"example":{"account_id":"Praesentium tenetur quas at ut necessitatibus dolor.","has_credentials":false,"id":"Sapiente possimus.","label":"Eaque voluptate reprehenderit sed voluptatem sed illo.","org_id":"Nihil id unde veritatis officiis aut fugiat.","project_id":"Voluptates atque.","status":"error","version":446959638978499075},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Cumque totam nulla aut reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Illum rerum error incidunt.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Aspernatur possimus."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Repellendus quo quidem."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Iusto ad animi eos doloribus autem corrupti."},"app_id":{"type":"string","description":"Meta app ID","example":"Laborum eum et quidem."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Suscipit quas sunt eos nulla."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere exercitationem et exercitationem."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum quidem accusamus et provident provident omnis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Perferendis qui maiores aut reiciendis."},"project_id":{"type":"string","description":"Owning project","example":"Eaque deleniti."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1750381436080099913,"format":"int64"}},"example":{"account_id":"Ad non.","app_id":"Est voluptas sequi.","etag":"Possimus consequatur est unde.","has_credentials":false,"id":"Quasi quis ab deserunt quia magnam.","label":"Quod modi voluptas dolores commodi dicta.","page_id":"Et laudantium.","project_id":"Minus et aut consequatur non cumque.","status":"active","version":3589524561643771783},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nostrum tempore."},"app_id":{"type":"string","description":"Meta app ID","example":"Rerum explicabo."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut commodi et voluptas tenetur nobis facere."},"label":{"type":"string","description":"Optional friendly name","example":"Blanditiis mollitia dolores illo nostrum magnam."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deserunt repellendus corrupti itaque quo sit."},"project_id":{"type":"string","description":"Owning project","example":"Quo corporis recusandae dicta quibusdam."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6534648276901202778,"format":"int64"}},"example":{"account_id":"Perspiciatis porro.","app_id":"Deserunt quod.","has_credentials":false,"id":"Eum et ipsum expedita reprehenderit eos.","label":"Aperiam et nihil.","page_id":"Non rem error.","project_id":"Dolorum ut architecto deleniti nostrum.","status":"deleted","version":2783740423386270532},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptate necessitatibus enim et et itaque."},"app_id":{"type":"string","description":"Meta app ID","example":"Nihil aut rerum est vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam quos perferendis nisi blanditiis eveniet."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis omnis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum quis et modi optio labore omnis."},"project_id":{"type":"string","description":"Owning project","example":"Ea enim ut corporis dolorum consequatur eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9014435567821091487,"format":"int64"}},"example":{"account_id":"Dolor aut assumenda fugiat.","app_id":"Aut quas suscipit eos.","has_credentials":true,"id":"Rem ab corporis.","label":"Porro et.","page_id":"Inventore alias error aut maxime dicta.","project_id":"Non dolorem.","status":"deleted","version":5862072609653585869},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor et corrupti voluptas neque vitae."},"app_id":{"type":"string","description":"Meta app ID","example":"Rerum numquam amet deserunt rem quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa rerum velit et impedit."},"label":{"type":"string","description":"Optional friendly name","example":"Velit quam omnis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Mollitia est assumenda aut harum."},"project_id":{"type":"string","description":"Owning project","example":"Quaerat labore dolor."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1514261665871912761,"format":"int64"}},"example":{"account_id":"Deleniti deserunt labore.","app_id":"Molestiae deserunt voluptates.","has_credentials":true,"id":"Ipsam dolores et et qui ut.","label":"Velit esse voluptate eum laboriosam distinctio.","page_id":"Adipisci quo.","project_id":"Numquam omnis ullam facilis ab sapiente.","status":"error","version":3954861542185537606},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Eius sed qui deserunt perspiciatis nihil."},"label":{"type":"string","description":"Optional friendly name","example":"Et eveniet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corporis ut non."}},"example":{"account_id":"act_193556282970417","app_id":"Aut hic.","label":"Mollitia tempora minima voluptas.","page_id":"Facere aut facilis porro dolor ipsa."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Aperiam voluptates."},"app_secret":{"type":"string","description":"Meta app secret","example":"Vero ducimus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Recusandae aut perferendis.","app_secret":"Est eaque ipsam harum nisi nobis."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et nulla officia vitae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Et sunt quis dicta voluptate aut in."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut asperiores quo aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Perspiciatis id."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"project_id":{"type":"string","description":"Owning project","example":"Ut non error aut et fuga."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2431299518347433245,"format":"int64"}},"example":{"account_id":"Id temporibus et provident maiores neque quis.","customer_id":"Sunt assumenda.","etag":"Eligendi ut.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Earum minus autem omnis qui debitis eum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quidem necessitatibus voluptatem consequatur sit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse officia explicabo dolor deserunt aspernatur."},"label":{"type":"string","description":"Optional friendly name","example":"Cupiditate mollitia hic vel ut."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur illo accusamus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3699306814781450025,"format":"int64"}},"example":{"account_id":"Sed corrupti sit.","customer_id":"Consectetur tenetur eum.","has_credentials":true,"id":"Et vel beatae molestiae fuga.","label":"Aut ut.","project_id":"Vitae consequatur eos.","status":"active","version":436879921687162189},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui impedit temporibus eveniet eos omnis cumque."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Natus et unde."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut ut sit nisi architecto."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium voluptate."},"project_id":{"type":"string","description":"Owning project","example":"Rerum et recusandae possimus quis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1288874109548033633,"format":"int64"}},"example":{"account_id":"Hic est quia pariatur odit ullam.","customer_id":"Sed quo perferendis nemo ut quisquam.","has_credentials":true,"id":"Explicabo repudiandae aut reiciendis recusandae molestias.","label":"Quod impedit accusamus incidunt minus veritatis enim.","project_id":"Vel inventore aliquid aut non eligendi accusamus.","status":"error","version":2175885598856983154},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic rerum accusamus velit error."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem deserunt quasi in aut nam rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repellendus quos magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Pariatur repellat vel."},"project_id":{"type":"string","description":"Owning project","example":"In id voluptatem nihil quaerat."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8411140861799189617,"format":"int64"}},"example":{"account_id":"Sint est sed.","customer_id":"Illum quisquam ex ipsa.","has_credentials":true,"id":"Distinctio magnam.","label":"Quia magni aut nisi est.","project_id":"Architecto deserunt vero ducimus distinctio.","status":"active","version":6452524533918462281},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Ex quo praesentium voluptas."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Est officia et."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem mollitia omnis doloribus qui consequatur et."}},"example":{"account_id":"Eos et architecto voluptas.","customer_id":"Vel natus provident.","label":"Numquam accusamus."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Architecto itaque doloribus voluptatem consequatur quis fugiat."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Recusandae qui culpa."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Sed rerum dicta distinctio voluptas ut ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Accusamus et atque enim."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Fuga nostrum velit hic excepturi omnis.","client_secret":"Distinctio quos ut unde et atque.","developer_token":"In recusandae maiores et voluptatem.","refresh_token":"Odio labore pariatur nobis."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolores assumenda accusantium mollitia fugiat dolore similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae quos cum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Cum molestias fuga voluptatibus quis."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis aliquid rerum consequatur officiis velit."},"project_id":{"type":"string","description":"Owning project","example":"Aut rerum ut blanditiis dolor."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4135215091203906464,"format":"int64"}},"example":{"account_id":"Natus placeat esse est in deserunt aliquid.","etag":"Sed et odio sunt totam incidunt.","has_credentials":false,"id":"Architecto doloremque aperiam doloribus aut qui.","label":"Distinctio ipsum ab.","project_id":"Placeat cumque iure veritatis cumque nisi.","status":"error","version":6763438623066254599},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Assumenda harum eos eveniet ut et laboriosam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Culpa saepe necessitatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas aperiam."},"project_id":{"type":"string","description":"Owning project","example":"Dolores enim."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6456486653687697700,"format":"int64"}},"example":{"account_id":"Cumque quae.","has_credentials":false,"id":"Qui eaque ut laudantium.","label":"Laborum aspernatur voluptate itaque fugit.","project_id":"Ratione id.","status":"deleted","version":5238309974693293664},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolore velit pariatur non assumenda perspiciatis dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ullam."},"project_id":{"type":"string","description":"Owning project","example":"Vero soluta omnis eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3837313741085790100,"format":"int64"}},"example":{"account_id":"Animi molestiae aut fugit alias nisi qui.","has_credentials":false,"id":"Molestiae ea ullam minima voluptatem vel.","label":"Beatae quia minus vero at ut.","project_id":"Dolore repudiandae necessitatibus dolorem.","status":"inactive","version":8129543513726361746},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem iste ea in ipsa."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Deserunt dolorum nihil."},"label":{"type":"string","description":"Optional friendly name","example":"Odio odio sed minus quia quia ea."},"project_id":{"type":"string","description":"Owning project","example":"Doloremque explicabo ut."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4150548058954901958,"format":"int64"}},"example":{"account_id":"Quibusdam consequuntur dolorem fugiat.","has_credentials":true,"id":"Perspiciatis magni tempore sunt itaque.","label":"Sit beatae ut modi voluptatum veniam.","project_id":"Ut ex.","status":"error","version":5881477690177318757},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Qui molestias."}},"example":{"account_id":"t2_gv9wtbfa","label":"Molestiae minus dolor accusantium."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Numquam quidem qui."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Laboriosam possimus dolor facere velit dolores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Alias ad voluptatem accusantium tempore impedit."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Et expedita itaque quos.","client_secret":"Quos accusantium fugit.","refresh_token":"Excepturi saepe sit vel perspiciatis neque."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Recusandae nam autem dicta perspiciatis quod.","client_secret":"Quo voluptatem quas culpa omnis consequuntur iste.","developer_token":"Id magnam id nihil fugiat.","refresh_token":"Inventore quisquam laudantium velit."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Numquam ut nesciunt voluptas."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Amet necessitatibus corrupti quaerat molestiae maiores."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Soluta quas voluptas minus possimus quos praesentium.","app_secret":"Repudiandae consequatur fuga dolores."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Fugit qui tempora commodi reiciendis sit alias.","client_secret":"Ea enim quidem odio et sequi consequatur.","refresh_token":"Provident itaque."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Ipsum quia ad a.","access_token_secret":"Veritatis omnis excepturi.","consumer_key":"Cumque libero.","consumer_secret":"Id incidunt qui et ratione sit quaerat."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam incidunt qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia exercitationem consequatur velit."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia culpa iste id sit incidunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Mollitia atque atque dolores accusantium non dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis labore dicta."},"project_id":{"type":"string","description":"Owning project","example":"Enim qui officia id necessitatibus mollitia soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2620236536617279883,"format":"int64"}},"example":{"account_id":"Accusantium enim temporibus dolor ipsam.","etag":"Aut ducimus dolores.","funding_instrument_id":"Dolorum minus voluptatem.","has_credentials":false,"id":"Officiis est.","label":"Tempore nemo illum ut maiores.","project_id":"Qui quisquam voluptatibus sint quia.","status":"error","version":6092912427529457622},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus ex aut quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corporis consequatur voluptatem voluptates."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Soluta odit odio praesentium perferendis eveniet sint."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus quis iste eaque ratione debitis nam."},"project_id":{"type":"string","description":"Owning project","example":"Quam dicta voluptate consequuntur voluptatem est."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":629084196159484927,"format":"int64"}},"example":{"account_id":"Velit fuga quos.","funding_instrument_id":"Sed aut quia nihil est quia.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","project_id":"Aut aut eos magnam quisquam et.","status":"active","version":2879571083312014203},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit laudantium error."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Beatae harum similique corporis id eum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Fugiat est itaque."},"label":{"type":"string","description":"Optional friendly name","example":"Culpa est possimus dolores dignissimos."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aut dicta libero."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7144064222780250488,"format":"int64"}},"example":{"account_id":"Enim vitae officia dolorem odio.","funding_instrument_id":"Excepturi minima illo dolores.","has_credentials":false,"id":"Et itaque rem eos et deleniti dolores.","label":"Facere qui omnis.","project_id":"Facilis qui libero.","status":"active","version":6722562537039921847},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non quo necessitatibus."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Laudantium nostrum earum dolores sit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"A sint quod sunt quae et."},"label":{"type":"string","description":"Optional friendly name","example":"Ut mollitia nihil ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Iure quis."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3532519562043610511,"format":"int64"}},"example":{"account_id":"At fugit dolor.","funding_instrument_id":"Non exercitationem modi possimus consequatur non.","has_credentials":false,"id":"Exercitationem accusantium nihil.","label":"Amet omnis.","project_id":"Quod alias ipsum voluptates pariatur magni.","status":"error","version":5818865715898604715},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ut mollitia accusantium dignissimos."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit provident officia officiis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Rerum ut necessitatibus illum ratione.","label":"Consequatur qui molestiae velit ratione nesciunt et."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"At perspiciatis quisquam perferendis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Ut alias quis nihil dolore suscipit reprehenderit."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Id ipsa perspiciatis sunt ut velit."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Aut mollitia aut molestiae exercitationem et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Et aut consequatur inventore enim reiciendis.","access_token_secret":"Neque ut rerum facilis quia molestiae ratione.","consumer_key":"Aut animi laudantium ullam.","consumer_secret":"Autem et id laboriosam nihil ea."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Temporibus voluptas inventore sit omnis.","brand_kit":"Quis facere sint totam sapiente.","label":"Sint nihil.","portal_id":"Expedita veniam beatae autem.","sender_email":"Placeat enim.","sender_name":"Nesciunt asperiores et est."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Fugit voluptatem.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Eligendi vero temporibus.","label":"Non maiores quae sed quia.","page_id":"Facilis eum ipsam."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Sint qui praesentium ea praesentium magni.","customer_id":"Iure dolore et et aut nam.","label":"Consequuntur neque mollitia quia."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Ut est nobis aspernatur."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Eveniet dicta numquam doloremque.","label":"Ea velit et assumenda recusandae enim."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et eum ex doloremque quia."},"example":"Eum itaque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Architecto voluptas ratione delectus ut adipisci.","event_details":"Quas qui mollitia perferendis eveniet voluptas est.","event_slug":"Ullam tenetur quia totam magni sunt repellat.","id":"A quos a sed exercitationem ut.","keywords":"Temporibus aliquam animi unde.","platforms":["Quo eum dignissimos iure.","Ea quis."],"program_type":"Doloremque itaque eius magni autem.","project_id":"Ut minus in nemo perspiciatis et qui.","status":"draft","targeting":"Ut est nobis aspernatur.","url":"Ex tempore.","version":1756394405346388080}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aperiam et ab."},"example":"Tempore vel quia cum."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Recusandae recusandae est et fuga veniam natus."},"example":"Et iusto doloremque odio."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsum expedita animi."},"example":"Ratione est omnis voluptas praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolorum excepturi quibusdam.","event_details":"Enim magnam eius voluptas voluptatibus deleniti.","event_slug":"Hic vero et.","id":"Voluptas et accusamus quia et officiis ipsum.","keywords":"Amet iusto provident sequi est.","platforms":["Aspernatur qui quidem est eligendi.","Non accusantium quis architecto."],"program_type":"Incidunt ipsum est perspiciatis soluta voluptas est.","project_id":"Explicabo cupiditate rerum.","status":"draft","targeting":"Quaerat ea accusantium.","url":"Ut ea alias.","version":4496268214732198365}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aspernatur voluptatum facilis."},"example":"Laboriosam et."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Veniam maiores dolorum sit et.","event_details":"Dolor ut.","event_slug":"Et assumenda recusandae.","id":"Saepe pariatur.","keywords":"Porro sed minus illo rerum ut.","platforms":["Id incidunt qui et ratione sit quaerat.","Ipsum quia ad a.","Veritatis omnis excepturi.","Et pariatur molestias autem."],"program_type":"Soluta alias natus aut eligendi ea.","project_id":"Est quaerat id qui repudiandae.","status":"draft","targeting":"Totam sequi.","url":"Sint eveniet dicta numquam doloremque ab cumque.","version":4401871562627166296}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Earum debitis."},"example":"Perspiciatis dolor pariatur quae amet."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Occaecati quam nostrum quis."},"example":"Maxime temporibus earum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Blanditiis et qui est dolorem eos.","event_details":"Modi sed.","event_slug":"Eligendi earum qui est et id laudantium.","id":"Sed ea.","keywords":"Dolorem sed atque.","platforms":["Veritatis harum ab nobis.","Atque inventore fugiat aut laboriosam maxime facere."],"program_type":"Et tempore.","project_id":"Ut nihil quo tenetur doloribus fugiat natus.","status":"archived","targeting":"Provident id quia porro rerum.","url":"Ratione incidunt est saepe.","version":2165165569618896837}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Qui minus sit necessitatibus."},"example":"Aut est et."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Id ducimus eius et laboriosam omnis vitae.","platforms":["Non voluptas ut enim.","Rerum sint optio."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Debitis ea molestiae eum voluptatum."},"example":"Illo eveniet."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur nemo molestiae modi ut non atque."},"example":"Sed commodi voluptatibus."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ut consectetur.","campaign_name":"Est qui molestiae rerum adipisci minima quibusdam.","id":"Hic voluptas debitis error.","platform":"Commodi quam voluptates.","platform_campaign_id":"Optio dolorem omnis.","project_id":"Veniam eum ut libero quibusdam debitis.","status":"Accusantium sunt culpa libero quisquam.","version":6082718548704928320}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Aut molestias aut excepturi cumque."},"example":"Esse voluptate non autem."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut hic distinctio non recusandae et qui."},"example":"Totam unde."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Enim ea.","campaign_name":"Totam sapiente vitae numquam ut nesciunt voluptas.","id":"Necessitatibus expedita.","platform":"Asperiores et.","platform_campaign_id":"Laboriosam quis facere.","project_id":"Beatae autem autem.","status":"Exercitationem consectetur.","version":6868385032394830606}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ut nostrum officiis et accusamus provident."},"example":"Rerum reiciendis similique."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit ut repellat voluptas."},"example":"Repudiandae odit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ut laborum nostrum veniam qui rerum.","has_credentials":true,"id":"Aut ratione sunt nostrum tenetur.","label":"Fugit enim et sint consectetur ea minus.","login_customer_id":"Magnam ut et ab.","project_id":"Dolorem cum.","status":"active","version":5799897036572741099}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sapiente ut sit quod.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quo omnis et et molestiae dolorum."},"example":"Consequatur iste eum amet vel impedit et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Deleniti itaque voluptas magnam.","brand_kit":"Dolor id.","has_credentials":false,"id":"Dolorem sapiente.","label":"Sint autem.","portal_id":"Vitae optio ut et consequuntur.","project_id":"Aut natus.","sender_email":"Libero autem ut.","sender_name":"Debitis soluta sed quod dicta aperiam eveniet.","status":"error","version":7443019901611180865}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Architecto ab et libero ea aut."},"example":"Corrupti aut earum rerum ducimus dicta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Qui et.","brand_kit":"Porro ea cum et magni adipisci.","has_credentials":false,"id":"Ad esse neque earum modi.","label":"Ab voluptatem esse.","portal_id":"Aut culpa impedit sit quibusdam nulla adipisci.","project_id":"Quis possimus placeat.","sender_email":"Dolorem molestias natus velit.","sender_name":"Non dolorum odit est.","status":"active","version":8186374755967651666}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et rerum repudiandae et at iusto."},"example":"Voluptas esse qui quisquam quae est magni."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Ut aut.","brand_kit":"Ut voluptas et accusamus natus.","has_credentials":false,"id":"Saepe rerum sunt eum et qui aut.","label":"Voluptas expedita omnis ex.","portal_id":"Minima ut quasi voluptatum officia quod error.","project_id":"Ut quia harum.","sender_email":"Quia inventore est quia enim illo.","sender_name":"Eligendi aperiam.","status":"error","version":9020823344753101103}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et officia sequi et quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur sint et vel molestiae."},"example":"Natus pariatur et et sed debitis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate est illo repellat et cum repellat."},"example":"Facilis repellat eveniet reiciendis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Nobis ipsam.","label":"Velit sapiente qui iusto quis magni et.","org_id":"Officiis deleniti ipsam nam.","project_id":"Aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quaerat iure ipsam."},"example":"Minima adipisci aut quia quisquam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Minus voluptas asperiores debitis labore aut.","has_credentials":true,"id":"Enim consequatur id voluptatem adipisci alias.","label":"Tempora ipsum aut enim harum.","org_id":"Necessitatibus consequatur natus tempora ut.","project_id":"Sequi consequatur dolorum sint voluptatem voluptas omnis.","status":"error","version":7443611122231905788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Nihil ad hic repellendus nobis voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Asperiores ipsum quam.","app_id":"Cum rem architecto vel quibusdam vel autem.","has_credentials":false,"id":"Non praesentium voluptas saepe sit.","label":"Reiciendis qui id tenetur exercitationem aperiam incidunt.","page_id":"Qui suscipit rerum quo eligendi tempora.","project_id":"Sed qui.","status":"active","version":5968285761891001183}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia facilis sit."},"example":"Possimus accusantium expedita alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ratione quis.","app_id":"Aut assumenda unde occaecati eum tenetur nam.","has_credentials":true,"id":"Voluptatibus qui cupiditate voluptatem.","label":"Ut in possimus quia nulla.","page_id":"Vel consequatur ea deserunt.","project_id":"Et corporis officia sint.","status":"error","version":935673982343451083}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit harum ipsa et."},"example":"Commodi et nihil et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Aliquid ducimus quia.","app_id":"Quas tenetur velit quaerat aut.","has_credentials":true,"id":"Hic delectus.","label":"Quibusdam aliquam consequuntur.","page_id":"Aut odio iste assumenda deleniti earum magni.","project_id":"Maxime ut possimus expedita.","status":"inactive","version":7469982570284737303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et quo.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Amet qui provident."},"example":"Ut ea."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","customer_id":"Est aut labore sint natus.","has_credentials":false,"id":"Vero quis consequuntur.","label":"Ut fugiat magnam quia.","project_id":"Quis quo illum cum quod.","status":"active","version":343208040254291221}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum laboriosam dignissimos reiciendis et quisquam."},"example":"Deserunt reiciendis dolorem totam voluptatem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Autem aspernatur ea voluptatem.","customer_id":"Accusantium aspernatur facere tempora voluptatem dicta rerum.","has_credentials":true,"id":"Eos explicabo non quidem.","label":"Nam voluptas sed et doloremque reiciendis pariatur.","project_id":"Debitis itaque itaque dolores nihil.","status":"deleted","version":8497111294039610948}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laudantium doloremque aut eligendi perferendis aut."},"example":"Consectetur delectus libero id."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"In expedita.","customer_id":"Magni ducimus nulla suscipit sed minus soluta.","has_credentials":false,"id":"Iste voluptatem et voluptatem ut ut.","label":"Quia sed omnis quaerat aut.","project_id":"Nostrum laborum minima.","status":"error","version":7283482467977491974}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed maiores qui sed exercitationem quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed ipsam enim esse iure est."},"example":"Aut sunt ex et autem delectus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Ipsam temporibus sint et necessitatibus dolorem ut.","has_credentials":true,"id":"Quidem illo numquam doloremque et.","label":"Fugiat adipisci eos rerum.","project_id":"Perferendis ut quia aut.","status":"active","version":1442766184420227830}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem omnis aspernatur veritatis adipisci."},"example":"Voluptas ipsam iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Asperiores velit enim tempore expedita ut.","has_credentials":false,"id":"Sapiente et et itaque dolores in.","label":"Consequatur nihil explicabo vero commodi est.","project_id":"Rem dolores eligendi ea.","status":"deleted","version":2256150830368172012}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Adipisci omnis veritatis omnis praesentium omnis."},"example":"Natus aliquam aut quas aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Architecto unde rerum quisquam ut.","has_credentials":true,"id":"Veniam debitis aut similique ullam temporibus qui.","label":"Voluptates neque expedita.","project_id":"Sit iusto.","status":"deleted","version":2250019048790832853}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Repellendus sint.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam voluptatibus nihil."},"example":"Voluptas consequatur iusto nostrum pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Numquam quia.","funding_instrument_id":"Autem provident est.","has_credentials":true,"id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Sit ex commodi sapiente a illum.","project_id":"Pariatur voluptas odit fuga illo.","status":"active","version":4562568070495708080}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Saepe non tempore."},"example":"Tempore qui est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","funding_instrument_id":"Accusamus ratione consequuntur aut et corrupti.","has_credentials":false,"id":"Beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laborum ut magnam aut illum commodi placeat."},"example":"Voluptas libero pariatur ut qui sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Odio adipisci dolore iste ipsa.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsa sint optio nobis quae corporis."},"example":"Et iste."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Veniam et.","job_id":"Iure modi asperiores ut.","result":"Autem voluptates iste.","status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Eaque ut laudantium nostrum ratione."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non iusto odit consequatur in vero soluta."},"event_details":{"description":"Extracted event/course details","example":"Laboriosam nostrum quos expedita voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"keywords":{"description":"Keyword list","example":"Eius laborum."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Voluptate itaque fugit rerum cumque."},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7582961521318439491,"format":"int64"}},"example":{"copy":"Ut ut odio odio sed minus quia.","etag":"Itaque omnis ut.","event_details":"Nihil sunt doloremque.","event_slug":"Porro ut et cupiditate.","id":"Eius dicta.","keywords":"Ea architecto autem iste.","platforms":["Necessitatibus dolorem enim beatae.","Minus vero at ut quis.","Molestiae aut fugit alias.","Qui maiores quia non unde deserunt."],"program_type":"Non assumenda perspiciatis.","project_id":"Ullam distinctio dolore velit.","status":"draft","targeting":"In ipsa tempore incidunt velit provident perspiciatis.","url":"Ea ullam minima voluptatem vel deleniti.","version":1281384136826250351},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quod enim pariatur et occaecati veritatis voluptatem."},"event_details":{"description":"Extracted event/course details","example":"Iure enim dolore est."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"keywords":{"description":"Keyword list","example":"Architecto aliquam mollitia labore sapiente dolores tenetur."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Accusamus qui."},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1931126915939314041,"format":"int64"}},"example":{"copy":"Necessitatibus sit.","event_details":"Sit dignissimos incidunt voluptas.","event_slug":"Reiciendis enim.","id":"Mollitia ea.","keywords":"Quis aperiam deserunt nostrum consectetur et sed.","platforms":["Nemo nihil dolorum consequatur sed tempora qui.","Hic vel aspernatur at quam est ea."],"program_type":"Ad quae nisi.","project_id":"Et amet sunt.","status":"approved","targeting":"Libero blanditiis.","url":"Cum et ab ipsum.","version":1441686313140477581},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Praesentium et."},"event_details":{"description":"Extracted event/course details","example":"Dolor consectetur eos iste."},"event_slug":{"type":"string","description":"Event/course slug","example":"Dolores laborum sed."},"id":{"type":"string","description":"Brief UUID","example":"Nulla sunt autem eos rerum provident dicta."},"keywords":{"description":"Keyword list","example":"Veniam iusto consequatur quia sed officia eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"Est quis impedit."},"description":"Suggested default platforms","example":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."]},"program_type":{"type":"string","description":"Funnel context","example":"Commodi odio sunt esse mollitia incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem voluptate dolor dolores provident."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Qui impedit."},"url":{"type":"string","description":"Event/course page URL","example":"Veritatis itaque."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1624749011573187666,"format":"int64"}},"example":{"copy":"Amet quaerat modi.","event_details":"Velit quis harum recusandae est ipsum.","event_slug":"Quo necessitatibus necessitatibus.","id":"Minus reprehenderit dignissimos aut velit.","keywords":"Eum totam voluptatem eos.","platforms":["Voluptatem rerum praesentium voluptatem blanditiis non.","Temporibus in repudiandae tenetur.","Saepe vel aut animi sit esse ratione.","Blanditiis laborum est quasi dignissimos."],"program_type":"Repellendus omnis doloribus amet cum.","project_id":"At sint laborum veniam.","status":"approved","targeting":"Sint exercitationem.","url":"Sint dicta.","version":6296331077615132388},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Placeat dolores numquam molestias quibusdam aliquid."},"event_details":{"description":"Extracted event/course details","example":"Et itaque ut dolores in voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Autem quo tempora voluptate fuga."},"id":{"type":"string","description":"Brief UUID","example":"Sit in quia molestiae perspiciatis alias et."},"keywords":{"description":"Keyword list","example":"Fuga est aliquam debitis."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum cum eaque nesciunt est totam inventore."},"description":"Suggested default platforms","example":["Ipsam aut vel.","Eos reiciendis.","Minima non."]},"program_type":{"type":"string","description":"Funnel context","example":"Libero et consequuntur suscipit distinctio pariatur mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Ex molestiae praesentium."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Deleniti est natus sequi beatae consectetur."},"url":{"type":"string","description":"Event/course page URL","example":"Distinctio maiores mollitia aut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7075859053648216976,"format":"int64"}},"example":{"copy":"Distinctio tempore qui velit omnis dolorem est.","event_details":"Voluptatibus nihil nisi.","event_slug":"Est molestiae voluptates ipsum neque sapiente aliquid.","id":"Et quis consequatur dolores repellat nostrum similique.","keywords":"Quia recusandae dignissimos dolore harum totam.","platforms":["Nobis hic eos magni eos voluptatem.","Hic ut sapiente harum aliquam sunt eum.","Eaque occaecati."],"program_type":"Minima aut fugit eos et iure laudantium.","project_id":"Iste aliquid.","status":"draft","targeting":"Vitae illo consequuntur esse.","url":"Velit sunt molestiae eius.","version":7533657070215672415},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Et provident illo non quisquam iure doloremque."},"event_details":{"description":"Extracted event/course details","example":"Est et magni."},"event_slug":{"type":"string","description":"Event/course slug","example":"Voluptatem ipsa."},"id":{"type":"string","description":"Brief UUID","example":"Ut ullam aliquam dolore iure consequatur."},"keywords":{"description":"Keyword list","example":"Ut aliquid."},"platforms":{"type":"array","items":{"type":"string","example":"Tempora est eveniet sequi ea."},"description":"Suggested default platforms","example":["Consequatur possimus.","Assumenda sit delectus veniam."]},"program_type":{"type":"string","description":"Funnel context","example":"Quia labore non ut dolores et."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum iste nemo fugiat sunt deleniti officia."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Repellendus eveniet veritatis impedit aut iste earum."},"url":{"type":"string","description":"Event/course page URL","example":"Assumenda excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2088061558739708952,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Quis odio enim nam id voluptatem.","id":"Accusamus pariatur saepe.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Eaque suscipit harum sint neque quia fuga.","Veniam itaque optio consequatur nulla sint."],"program_type":"Laboriosam sunt quis omnis animi.","project_id":"Qui et.","status":"approved","targeting":"Cupiditate aut.","url":"Vero alias temporibus illum.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Facere qui omnis."},"campaign_name":{"type":"string","description":"Campaign name","example":"Dolores natus a sint quod sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa non."},"id":{"type":"string","description":"Campaign UUID","example":"Et itaque rem eos et deleniti dolores."},"platform":{"type":"string","description":"Channel","example":"Enim vitae officia dolorem odio."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Beatae quia qui excepturi minima."},"project_id":{"type":"string","description":"Owning project","example":"Facilis qui libero."},"status":{"type":"string","description":"Campaign status","example":"Et nesciunt iure quis in ut mollitia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9203456138223090094,"format":"int64"}},"example":{"brief_id":"Dolores sit.","campaign_name":"Amet omnis.","etag":"Sit cupiditate non.","id":"Necessitatibus quibusdam.","platform":"Exercitationem accusantium nihil.","platform_campaign_id":"Quod alias ipsum voluptates pariatur magni.","project_id":"Est accusantium laudantium nostrum.","status":"At fugit dolor.","version":6873369027351486557},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quaerat et eius culpa magni illum consequatur."},"campaign_name":{"type":"string","description":"Campaign name","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"id":{"type":"string","description":"Campaign UUID","example":"Minima iure quos enim occaecati beatae."},"platform":{"type":"string","description":"Channel","example":"Soluta dolore vitae."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"In commodi et asperiores et."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Campaign status","example":"Assumenda voluptatem aut debitis vitae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":529135087014785401,"format":"int64"}},"example":{"brief_id":"Et et itaque qui repudiandae magnam.","campaign_name":"Quaerat molestias.","id":"Eos eius.","platform":"Ullam qui rerum numquam quo.","platform_campaign_id":"A quia magnam culpa ipsam totam.","project_id":"Odit rerum commodi ea et.","status":"Sequi aut veniam ratione.","version":4528974556497386277},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quo et enim totam et minima dolorem."},"campaign_name":{"type":"string","description":"Campaign name","example":"In praesentium cumque."},"id":{"type":"string","description":"Campaign UUID","example":"Omnis ad voluptas esse voluptates."},"platform":{"type":"string","description":"Channel","example":"Est tempora qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Voluptas necessitatibus cumque non porro qui molestias."},"project_id":{"type":"string","description":"Owning project","example":"Cumque mollitia."},"status":{"type":"string","description":"Campaign status","example":"Pariatur odio molestias voluptatum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7642665711405677689,"format":"int64"}},"example":{"brief_id":"Qui omnis nesciunt qui consequuntur.","campaign_name":"Odit provident sed quo aperiam.","id":"Perferendis possimus deserunt iure et.","platform":"Fuga atque.","platform_campaign_id":"Sequi culpa.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"Aspernatur nihil et incidunt dolorem dolor sed.","version":7197986407230546835},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Voluptatum veniam molestiae."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","twitter-ads"]}},"example":{"config":"Aspernatur voluptatem nobis.","platforms":["google-ads","meta-ads","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Modi possimus consequatur."},"config":{"description":"Campaign configuration snapshot","example":"Voluptatibus aspernatur."},"status":{"type":"string","description":"Campaign status","example":"Eveniet esse officia explicabo dolor deserunt."}},"example":{"campaign_name":"Accusamus nam cupiditate.","config":"Earum minus autem omnis qui debitis eum.","status":"Hic vel ut."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Veniam dolores quidem necessitatibus."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Sit reiciendis et vel beatae molestiae.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic est quia pariatur odit ullam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed quo perferendis nemo ut quisquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Quod impedit accusamus incidunt minus veritatis enim."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Repellendus quos magnam."},"project_id":{"type":"string","description":"Owning project","example":"Vel inventore aliquid aut non eligendi accusamus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2175885598856983154,"format":"int64"}},"example":{"account_id":"Quae qui inventore dolorem deserunt.","etag":"Rerum sint.","has_credentials":true,"id":"In id voluptatem nihil quaerat.","label":"Hic rerum accusamus velit error.","login_customer_id":"Magnam adipisci architecto deserunt.","project_id":"Pariatur repellat vel.","status":"active","version":1017420418363680400},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem maxime hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Harum voluptates sit est corporis."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus ut necessitatibus in."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Amet hic est."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem repellat expedita inventore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7828959688196597051,"format":"int64"}},"example":{"account_id":"Libero autem quod saepe ullam ipsum.","has_credentials":false,"id":"Quaerat occaecati rerum.","label":"Aspernatur quos est magnam voluptates.","login_customer_id":"Dolore sed.","project_id":"Quae esse mollitia et dolorum.","status":"error","version":3252068377050447352},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","login_customer_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","login_customer_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sed corrupti sit."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Labore quia esse consectetur tenetur eum."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut sit nisi architecto."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Natus vitae consequatur eos sit aut ut."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Praesentium voluptate.","client_secret":"Qui impedit temporibus eveniet eos omnis cumque.","developer_token":"Ipsam ut sed natus et unde.","refresh_token":"Rerum et recusandae possimus quis."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Atque qui dignissimos aut eaque eveniet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Odit numquam quia."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Aut dolores."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptatem beatae quis dignissimos voluptatem et labore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Modi vel aut rerum.","brand_kit":"Dolor eum et consequatur.","has_credentials":false,"id":"Ut unde dolore id.","label":"Ad optio magnam sequi esse.","portal_id":"Assumenda cum nemo esse nobis.","project_id":"Necessitatibus fuga ducimus dolorem ut aspernatur.","sender_email":"Aut dolorem ea veniam.","sender_name":"Quae adipisci doloribus ullam.","status":"deleted","version":9002316743787506494},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"At magnam saepe incidunt nisi est."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Deleniti non in iure dolores et quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio enim nisi doloremque rerum sed consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus non aliquid qui."},"project_id":{"type":"string","description":"Owning project","example":"Quia amet vero dolorum incidunt officia nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Neque sed alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Id ducimus excepturi est et est."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6047270410556243251,"format":"int64"}},"example":{"account_id":"Corrupti sint molestiae occaecati est.","brand_kit":"Nesciunt sed magnam sed vero nulla.","has_credentials":true,"id":"Recusandae similique assumenda ut quia.","label":"Nam eius nulla suscipit ullam.","portal_id":"Ratione nobis ut occaecati tenetur minima veritatis.","project_id":"Nesciunt minus natus non.","sender_email":"Impedit laborum quaerat qui ut ut qui.","sender_name":"Explicabo dolorem totam non.","status":"error","version":9169545032565251193},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sunt labore voluptate."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Beatae non et excepturi sit minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel et et iure tempora."},"label":{"type":"string","description":"Optional friendly name","example":"Eum ut."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus saepe quam culpa qui."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatum perspiciatis autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Ipsa molestias."},"sender_name":{"type":"string","description":"Default sender name","example":"Nam debitis hic qui consequatur laborum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2692133725202625638,"format":"int64"}},"example":{"account_id":"Aspernatur ipsam consequatur qui illo totam fuga.","brand_kit":"Libero quia quam harum molestiae cupiditate.","has_credentials":true,"id":"Et quisquam dicta.","label":"Aut tempora dolorem neque assumenda sed.","portal_id":"Consequatur sint.","project_id":"Eaque enim est libero enim quo.","sender_email":"Non illum expedita commodi in dolores nemo.","sender_name":"Eaque autem impedit tenetur voluptatibus.","status":"inactive","version":6362542183217834869},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Odit odio praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"Sint voluptatibus quam dicta voluptate consequuntur."},"description":"Platforms this job will create on","example":["Qui temporibus quis iste eaque.","Debitis nam.","Delectus ex aut quia."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur dolore dolor corporis consequatur voluptatem voluptates.","platforms":["Repudiandae sit qui aut aut.","Magnam quisquam et consequuntur ut sunt.","Et velit fuga quos est."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fugiat aut dicta libero."},"job_id":{"type":"string","description":"Job UUID","example":"Officiis beatae sed aut."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Est quia qui fugiat est itaque."},"status":{"type":"string","description":"Job status","example":"succeeded","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Beatae harum similique corporis id eum.","job_id":"Culpa est possimus dolores dignissimos.","result":"Laudantium error eum et aut.","status":"partial"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Omnis corrupti facere eum aliquid est repellat."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt mollitia non sed hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ex ipsa nihil esse voluptate in consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Sed voluptatum et impedit quod rem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Est distinctio accusamus a perferendis."},"project_id":{"type":"string","description":"Owning project","example":"Culpa quaerat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6865823349289112261,"format":"int64"}},"example":{"account_id":"Velit quis.","etag":"Vel architecto quae error dolor placeat.","has_credentials":true,"id":"Voluptatem nostrum.","label":"Ut nobis.","org_id":"Minus et.","project_id":"Deleniti voluptas quo nostrum quia.","status":"inactive","version":7197135224651925465},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Autem eaque eaque dicta ut magni.","has_credentials":true,"id":"In vel.","label":"Et vel dolorum aut inventore consequatur.","org_id":"Molestiae qui nobis culpa.","project_id":"Nobis qui sunt laboriosam ipsa.","status":"inactive","version":32502071618905206},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolores dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Temporibus dolorem cumque quis accusantium quia enim."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsum et et laudantium."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Sit est atque qui quaerat qui vitae."},"project_id":{"type":"string","description":"Owning project","example":"Asperiores velit aut alias quod minima."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1323696837483058057,"format":"int64"}},"example":{"account_id":"Consequatur aut vero.","has_credentials":true,"id":"Optio non.","label":"Ipsam eligendi est dolore.","org_id":"Est saepe doloribus unde id.","project_id":"Optio in ratione accusamus quasi.","status":"active","version":4544790407326456577},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptas est consequatur rerum neque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Perspiciatis perferendis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Ea nam aut aut dolores."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Optio quia similique vero est impedit quo."},"project_id":{"type":"string","description":"Owning project","example":"Sapiente sit totam ut et ullam."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5284871868291627638,"format":"int64"}},"example":{"account_id":"Eos deserunt quia expedita sed velit distinctio.","has_credentials":false,"id":"Nihil at.","label":"Sit soluta quia qui.","org_id":"Natus veniam amet.","project_id":"Libero officia et quia.","status":"inactive","version":1537409143960626181},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sint est sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Voluptas dolorem necessitatibus illum.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Ducimus distinctio deserunt quia magni."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Nisi est."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia doloremque commodi rerum."},"app_id":{"type":"string","description":"Meta app ID","example":"Error sit nihil iure officiis nemo."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos non molestias laudantium quia iusto maxime."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam hic quibusdam eveniet."},"label":{"type":"string","description":"Optional friendly name","example":"Veniam et ducimus quos amet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Illum accusamus debitis explicabo praesentium sint."},"project_id":{"type":"string","description":"Owning project","example":"Doloribus voluptas mollitia doloremque totam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4075428576386055706,"format":"int64"}},"example":{"account_id":"Corporis dolorem laborum maiores est ea ducimus.","app_id":"Tenetur ut.","etag":"Quo ullam ad iusto quos.","has_credentials":false,"id":"Molestias ducimus id.","label":"Ex et alias ea asperiores quas.","page_id":"Est placeat explicabo aliquid.","project_id":"Eius aut quo et.","status":"inactive","version":7062935514847310019},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Iure aut tenetur ipsum ea ad ducimus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam voluptatem fuga quia qui."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum vel molestiae id quae vero aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et et."},"project_id":{"type":"string","description":"Owning project","example":"Aut provident suscipit incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8554261525276101559,"format":"int64"}},"example":{"account_id":"Necessitatibus non eum ipsum eveniet quam.","app_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Aut temporibus.","label":"Eligendi non.","page_id":"Voluptatum magnam.","project_id":"Laborum ipsum accusantium voluptatem libero.","status":"error","version":8043832967599792035},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Odit illo ut ut."},"app_id":{"type":"string","description":"Meta app ID","example":"Perspiciatis debitis atque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"In iure molestiae quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Assumenda alias."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam aperiam et totam in."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8618836083038100083,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","app_id":"Ea voluptatum pariatur non.","has_credentials":true,"id":"Unde facilis.","label":"Voluptatem optio.","page_id":"Maiores consequatur.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam recusandae nesciunt et."},"app_id":{"type":"string","description":"Meta app ID","example":"Perferendis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo ullam."},"label":{"type":"string","description":"Optional friendly name","example":"Facilis dolor consectetur sed."},"page_id":{"type":"string","description":"Facebook page ID","example":"Ut ea sequi quos qui quo et."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati hic ut magnam facilis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8315950268383046552,"format":"int64"}},"example":{"account_id":"Non consequuntur qui qui impedit assumenda voluptas.","app_id":"Et nemo dicta illum omnis.","has_credentials":true,"id":"Beatae facilis dolor quod nihil quia.","label":"Recusandae consequatur nulla.","page_id":"Vel ut.","project_id":"Sed voluptas fuga officia nulla.","status":"error","version":8342264622249142271},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Occaecati id ea sunt dolorem necessitatibus neque."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur hic voluptatem."},"page_id":{"type":"string","description":"Facebook page ID","example":"Omnis quidem dolor ipsum voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Ab quasi tempora dolor.","label":"Occaecati earum unde ut.","page_id":"Non eum expedita non voluptas sit voluptatem."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"app_secret":{"type":"string","description":"Meta app secret","example":"Et dolorem quod."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Iusto fugit non asperiores quidem natus.","app_secret":"Nostrum atque illum nesciunt adipisci odit corrupti."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","customer_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","customer_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Doloremque dicta."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ratione impedit recusandae dolor consequatur."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Vel temporibus sunt nulla esse sed."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Rerum eveniet nam sunt.","etag":"Voluptatem quia ab recusandae praesentium nisi.","has_credentials":true,"id":"Hic quos inventore.","label":"Ad dolorem et.","project_id":"Id vel iusto optio repellendus.","status":"deleted","version":4971099885577230620},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium eligendi ut et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Est dolor velit et voluptatem mollitia placeat."},"project_id":{"type":"string","description":"Owning project","example":"Nemo cum delectus laudantium."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7301828793581898625,"format":"int64"}},"example":{"account_id":"Necessitatibus quia facere vitae aperiam velit corrupti.","has_credentials":true,"id":"Iste iusto reiciendis ipsa ut saepe beatae.","label":"Voluptas doloremque nobis consectetur voluptas voluptas.","project_id":"Temporibus in qui provident corrupti ut similique.","status":"deleted","version":8091372322961997197},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus dolore expedita commodi sit omnis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Deserunt minima quis impedit."},"label":{"type":"string","description":"Optional friendly name","example":"Aut et ut dolorem tempore."},"project_id":{"type":"string","description":"Owning project","example":"In voluptate debitis earum voluptates repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4154692188906674111,"format":"int64"}},"example":{"account_id":"Pariatur esse.","has_credentials":false,"id":"Quo porro.","label":"Molestias reprehenderit.","project_id":"Accusantium est.","status":"error","version":1321629448594002998},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere ut voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ab ea pariatur deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Repellat sequi sed qui dolor."},"project_id":{"type":"string","description":"Owning project","example":"Rem molestiae assumenda ea incidunt."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","has_credentials":false,"id":"Rerum maiores in alias est laboriosam saepe.","label":"Eaque magni omnis dolorem.","project_id":"Perferendis placeat earum occaecati et.","status":"inactive","version":7088601354925466349},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Et neque soluta."}},"example":{"account_id":"t2_gv9wtbfa","label":"Voluptas aliquid libero sapiente aspernatur fugit eum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quo vel iste aut cum voluptatem."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et et aperiam."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas quis nihil tempora rem asperiores."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Vero natus voluptatem.","client_secret":"Et minima.","refresh_token":"Quas qui aut rerum illum vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dicta qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur voluptate dolorum id ut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Id adipisci."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"project_id":{"type":"string","description":"Owning project","example":"Minima vitae illo cumque optio impedit."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6671950557225375758,"format":"int64"}},"example":{"account_id":"Vitae nemo sint et consequatur vel quisquam.","etag":"Sint possimus.","funding_instrument_id":"Dolorem neque hic voluptatem ad similique sunt.","has_credentials":true,"id":"Aut rerum non assumenda molestiae modi.","label":"Voluptatibus assumenda mollitia molestias eos.","project_id":"Vitae molestiae itaque autem.","status":"error","version":3850958169697422368},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam numquam et natus possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Provident molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Quas quia quam voluptate nam iste.","funding_instrument_id":"Temporibus aut numquam.","has_credentials":true,"id":"Non laudantium quis ab non sunt.","label":"Beatae totam.","project_id":"Quo est.","status":"active","version":1807846651493588341},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed dolorum cupiditate quia qui dicta."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quae totam et voluptates atque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Accusantium ut vitae dolor soluta beatae."},"label":{"type":"string","description":"Optional friendly name","example":"Molestiae veniam exercitationem blanditiis ratione non."},"project_id":{"type":"string","description":"Owning project","example":"Enim velit voluptates officiis tempora possimus rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2489572558350094249,"format":"int64"}},"example":{"account_id":"Adipisci minus et vero.","funding_instrument_id":"Occaecati incidunt deleniti sunt dolorem ea.","has_credentials":false,"id":"Voluptates ab quos provident magni et.","label":"Et culpa culpa veritatis.","project_id":"Reprehenderit officiis modi quae consequatur.","status":"inactive","version":8208341011850859357},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Cumque perspiciatis quam."},"label":{"type":"string","description":"Optional friendly name","example":"Iste numquam optio possimus velit."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Eveniet quia voluptatem impedit cumque doloribus.","label":"Possimus ipsam perspiciatis enim id."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Ullam consequatur ut eveniet tempore est."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iusto fugiat ad et."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Magni odio aut omnis vel."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Iure ducimus voluptatem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Necessitatibus tempore rem quo.","access_token_secret":"Accusantium voluptas ratione dignissimos esse et labore.","consumer_key":"Magnam cum veritatis mollitia vel velit.","consumer_secret":"Eum perferendis qui qui soluta repudiandae quae."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index e05fa2db..6ea9eca3 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -7,13 +7,13 @@ servers: - url: http://localhost:80 description: Default server for lfx-v2-campaign-service paths: - /projects/{project_id}/connection-google-ads: - delete: + /projects/{project_id}/briefs: + post: tags: - - lfx-v2-campaign-service-connections - summary: delete-google-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Google Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-google-ads + - lfx-v2-campaign-service-briefs + summary: create-brief lfx-v2-campaign-service-briefs + description: Create a brief. + operationId: lfx-v2-campaign-service-briefs#create-brief parameters: - name: project_id in: path @@ -24,9 +24,63 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateBriefRequestBody' + example: + brief: + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + platforms: + - Molestiae saepe qui. + - Commodi voluptatem expedita. + program_type: membership + targeting: Facilis iste. + url: Quia ut atque. responses: - "204": - description: No Content response. + "201": + description: Created response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Et eum ex doloremque quia. + example: Eum itaque. + content: + application/json: + schema: + $ref: '#/components/schemas/Brief2' + example: + copy: Architecto voluptas ratione delectus ut adipisci. + event_details: Quas qui mollitia perferendis eveniet voluptas est. + event_slug: Ullam tenetur quia totam magni sunt repellat. + id: A quos a sed exercitationem ut. + keywords: Temporibus aliquam animi unde. + platforms: + - Quo eum dignissimos iure. + - Ea quis. + program_type: Doloremque itaque eius magni autem. + project_id: Ut minus in nemo perspiciatis et qui. + status: draft + targeting: Ut est nobis aspernatur. + url: Ex tempore. + version: 1756394405346388080 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -36,6 +90,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -56,12 +119,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - get: + /projects/{project_id}/briefs/{brief_id}: + delete: tags: - - lfx-v2-campaign-service-connections - summary: get-google-ads lfx-v2-campaign-service-connections - description: Get the project's Google Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-google-ads + - lfx-v2-campaign-service-briefs + summary: delete-brief lfx-v2-campaign-service-briefs + description: Archive a brief (soft delete). + operationId: lfx-v2-campaign-service-briefs#delete-brief parameters: - name: project_id in: path @@ -72,30 +136,27 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Aperiam et ab. + example: Tempore vel quia cum. responses: - "200": - description: OK response. - headers: - ETag: - description: ETag header value (mirrors version) - schema: - type: string - description: ETag header value (mirrors version) - example: Inventore ratione id vel iusto optio repellendus. - example: Rerum eveniet nam sunt. + "204": + description: No Content response. + "400": + description: 'BadRequest: Bad request' content: application/json: schema: - $ref: '#/components/schemas/GoogleAdsConnection3' + $ref: '#/components/schemas/BadRequestError' example: - account_id: Vitae qui. - has_credentials: true - id: Minima autem libero natus id esse. - label: Odit eum commodi autem expedita dolorem. - login_customer_id: In laborum vel. - project_id: Sed adipisci eveniet et aut. - status: active - version: 4120562596096857294 + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -105,6 +166,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -125,12 +195,12 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - post: + get: tags: - - lfx-v2-campaign-service-connections - summary: create-google-ads lfx-v2-campaign-service-connections - description: Create the project's Google Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-google-ads + - lfx-v2-campaign-service-briefs + summary: get-brief lfx-v2-campaign-service-briefs + description: Get a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-brief parameters: - name: project_id in: path @@ -141,46 +211,45 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateGoogleAdsRequestBody' - example: - config: - account_id: "8666746580" - label: TLF Main - login_customer_id: "9746983954" - credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Recusandae recusandae est et fuga veniam natus. + example: Et iusto doloremque odio. responses: - "201": - description: Created response. + "200": + description: OK response. headers: ETag: description: ETag header value (mirrors version) schema: type: string description: ETag header value (mirrors version) - example: Occaecati quaerat eum quia a excepturi. - example: Inventore aut molestiae voluptas hic. - content: - application/json: - schema: - $ref: '#/components/schemas/GoogleAdsConnection2' - example: - account_id: Corrupti reprehenderit et non totam perspiciatis. - has_credentials: false - id: Harum laborum est adipisci sint. - label: Ipsa ex. - login_customer_id: Perspiciatis voluptatibus architecto velit. - project_id: Est impedit et tempore provident. - status: error - version: 6280538112072962831 + example: Ipsum expedita animi. + example: Ratione est omnis voluptas praesentium. + content: + application/json: + schema: + $ref: '#/components/schemas/Brief3' + example: + copy: Dolorum excepturi quibusdam. + event_details: Enim magnam eius voluptas voluptatibus deleniti. + event_slug: Hic vero et. + id: Voluptas et accusamus quia et officiis ipsum. + keywords: Amet iusto provident sequi est. + platforms: + - Aspernatur qui quidem est eligendi. + - Non accusantium quis architecto. + program_type: Incidunt ipsum est perspiciatis soluta voluptas est. + project_id: Explicabo cupiditate rerum. + status: draft + targeting: Quaerat ea accusantium. + url: Ut ea alias. + version: 4496268214732198365 "400": description: 'BadRequest: Bad request' content: @@ -190,8 +259,17 @@ paths: example: code: "400" message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. "409": - description: 'Conflict: A connection already exists for this provider on the project' + description: 'Conflict: Conflict' content: application/json: schema: @@ -221,10 +299,10 @@ paths: - jwt_header_Authorization: [] put: tags: - - lfx-v2-campaign-service-connections - summary: update-google-ads lfx-v2-campaign-service-connections - description: Replace the Google Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-google-ads + - lfx-v2-campaign-service-briefs + summary: update-brief lfx-v2-campaign-service-briefs + description: Replace a brief (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-brief parameters: - name: project_id in: path @@ -235,6 +313,15 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Aspernatur voluptatum facilis. + example: Laboriosam et. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -249,12 +336,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateGoogleAdsRequestBody' + $ref: '#/components/schemas/CreateBriefRequestBody' example: - config: - account_id: "8666746580" - label: TLF Main - login_customer_id: "9746983954" + brief: + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + platforms: + - Molestiae saepe qui. + - Commodi voluptatem expedita. + program_type: membership + targeting: Facilis iste. + url: Quia ut atque. responses: "200": description: OK response. @@ -264,21 +358,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Inventore impedit unde voluptatem quia ab recusandae. - example: Vel omnis iure. - content: - application/json: - schema: - $ref: '#/components/schemas/GoogleAdsConnection4' - example: - account_id: Ut commodi asperiores. - has_credentials: false - id: Dignissimos non ut sed. - label: Perferendis nam voluptatibus totam. - login_customer_id: Voluptatem similique. - project_id: Deleniti quam. - status: inactive - version: 2550395787104322115 + example: Sapiente alias et error nobis minima. + example: Fuga maxime tempora rem. + content: + application/json: + schema: + $ref: '#/components/schemas/Brief4' + example: + copy: Veniam maiores dolorum sit et. + event_details: Dolor ut. + event_slug: Et assumenda recusandae. + id: Saepe pariatur. + keywords: Porro sed minus illo rerum ut. + platforms: + - Id incidunt qui et ratione sit quaerat. + - Ipsum quia ad a. + - Veritatis omnis excepturi. + - Et pariatur molestias autem. + program_type: Soluta alias natus aut eligendi ea. + project_id: Est quaerat id qui repudiandae. + status: draft + targeting: Totam sequi. + url: Sint eveniet dicta numquam doloremque ab cumque. + version: 4401871562627166296 "400": description: 'BadRequest: Bad request' content: @@ -297,6 +399,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "412": description: 'PreconditionFailed: ETag mismatch' content: @@ -335,13 +446,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-google-ads/set-credential: + /projects/{project_id}/briefs/{brief_id}/approve: post: tags: - - lfx-v2-campaign-service-connections - summary: set-credential-google-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-google-ads + - lfx-v2-campaign-service-briefs + summary: approve-brief lfx-v2-campaign-service-briefs + description: Approve a brief for campaign creation. + operationId: lfx-v2-campaign-service-briefs#approve-brief parameters: - name: project_id in: path @@ -352,21 +463,45 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' - example: - credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Earum debitis. + example: Perspiciatis dolor pariatur quae amet. responses: - "204": - description: No Content response. + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Occaecati quam nostrum quis. + example: Maxime temporibus earum. + content: + application/json: + schema: + $ref: '#/components/schemas/Brief5' + example: + copy: Blanditiis et qui est dolorem eos. + event_details: Modi sed. + event_slug: Eligendi earum qui est et id laudantium. + id: Sed ea. + keywords: Dolorem sed atque. + platforms: + - Veritatis harum ab nobis. + - Atque inventore fugiat aut laboriosam maxime facere. + program_type: Et tempore. + project_id: Ut nihil quo tenetur doloribus fugiat natus. + status: archived + targeting: Provident id quia porro rerum. + url: Ratione incidunt est saepe. + version: 2165165569618896837 "400": description: 'BadRequest: Bad request' content: @@ -385,6 +520,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -405,13 +549,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-google-ads/test: + /projects/{project_id}/briefs/{brief_id}/campaigns: post: tags: - - lfx-v2-campaign-service-connections - summary: test-google-ads lfx-v2-campaign-service-connections - description: Verify the stored Google Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-google-ads + - lfx-v2-campaign-service-briefs + summary: create-campaigns lfx-v2-campaign-service-briefs + description: Create campaigns across the selected platforms (async -> job). + operationId: lfx-v2-campaign-service-briefs#create-campaigns parameters: - name: project_id in: path @@ -422,16 +566,51 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Qui minus sit necessitatibus. + example: Aut est et. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateCampaignsRequestBody' + example: + input: + config: Est voluptatum enim earum et doloribus. + platforms: + - hubspot + - meta-ads + - reddit-ads + - twitter-ads responses: - "200": - description: OK response. + "202": + description: Accepted response. content: application/json: schema: - $ref: '#/components/schemas/ConnectionTestResult' + $ref: '#/components/schemas/JobCreateResponse' example: - message: Deserunt ab itaque amet numquam. - ok: true + job_id: Id ducimus eius et laboriosam omnis vitae. + platforms: + - Non voluptas ut enim. + - Rerum sint optio. + status: queued + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -441,6 +620,15 @@ paths: example: code: "404" message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. "500": description: 'InternalServerError: Internal server error' content: @@ -461,13 +649,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-hubspot: - delete: + /projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}: + get: tags: - - lfx-v2-campaign-service-connections - summary: delete-hubspot lfx-v2-campaign-service-connections - description: Soft-delete the project's HubSpot connection. - operationId: lfx-v2-campaign-service-connections#delete-hubspot + - lfx-v2-campaign-service-briefs + summary: get-campaign lfx-v2-campaign-service-briefs + description: Get one campaign under a brief; returns ETag. + operationId: lfx-v2-campaign-service-briefs#get-campaign parameters: - name: project_id in: path @@ -478,9 +666,258 @@ paths: description: Project UUID or slug that scopes the connection example: cncf example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Debitis ea molestiae eum voluptatum. + example: Illo eveniet. + - name: campaign_id + in: path + description: Campaign UUID + required: true + schema: + type: string + description: Campaign UUID + example: Consequatur nemo molestiae modi ut non atque. + example: Sed commodi voluptatibus. responses: - "204": - description: No Content response. + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Nobis est fugit ratione consectetur exercitationem. + example: Aperiam quia doloribus omnis. + content: + application/json: + schema: + $ref: '#/components/schemas/Campaign2' + example: + brief_id: Ut consectetur. + campaign_name: Est qui molestiae rerum adipisci minima quibusdam. + id: Hic voluptas debitis error. + platform: Commodi quam voluptates. + platform_campaign_id: Optio dolorem omnis. + project_id: Veniam eum ut libero quibusdam debitis. + status: Accusantium sunt culpa libero quisquam. + version: 6082718548704928320 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-briefs + summary: update-campaign lfx-v2-campaign-service-briefs + description: Replace a campaign (requires If-Match). + operationId: lfx-v2-campaign-service-briefs#update-campaign + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + - name: brief_id + in: path + description: Brief UUID + required: true + schema: + type: string + description: Brief UUID + example: Excepturi fugit. + example: Aut quia voluptates voluptates nisi. + - name: campaign_id + in: path + description: Campaign UUID + required: true + schema: + type: string + description: Campaign UUID + example: Aut molestias aut excepturi cumque. + example: Esse voluptate non autem. + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + allowEmptyValue: true + schema: + type: string + description: If-Match header carrying the current ETag/version + example: "3" + example: "3" + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCampaignRequestBody' + example: + campaign: + campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. + config: Error similique. + status: Maxime fugiat illo. + responses: + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Ut hic distinctio non recusandae et qui. + example: Totam unde. + content: + application/json: + schema: + $ref: '#/components/schemas/Campaign3' + example: + brief_id: Enim ea. + campaign_name: Totam sapiente vitae numquam ut nesciunt voluptas. + id: Necessitatibus expedita. + platform: Asperiores et. + platform_campaign_id: Laboriosam quis facere. + project_id: Beatae autem autem. + status: Exercitationem consectetur. + version: 6868385032394830606 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "412": + description: 'PreconditionFailed: ETag mismatch' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionFailedError' + example: + code: "412" + message: The supplied ETag does not match the current version. + "428": + description: 'PreconditionRequired: If-Match header required' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionRequiredError' + example: + code: "428" + message: An If-Match header is required. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-google-ads: + delete: + tags: + - lfx-v2-campaign-service-connections + summary: delete-google-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Google Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-google-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "204": + description: No Content response. "404": description: 'NotFound: Resource not found' content: @@ -513,9 +950,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-hubspot lfx-v2-campaign-service-connections - description: Get the project's HubSpot connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-hubspot + summary: get-google-ads lfx-v2-campaign-service-connections + description: Get the project's Google Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-google-ads parameters: - name: project_id in: path @@ -535,24 +972,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Necessitatibus quaerat minima a voluptatem ipsa et. - example: Pariatur perferendis explicabo expedita et velit accusamus. + example: Tempora qui incidunt tempora. + example: Vero voluptates soluta. content: application/json: schema: - $ref: '#/components/schemas/HubspotConnection3' + $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Perspiciatis saepe consequatur doloribus sequi et. - brand_kit: Distinctio vel. + account_id: Ipsum quaerat delectus cupiditate sit et. has_credentials: true - id: Nulla ut laboriosam. - label: Omnis suscipit corrupti reiciendis. - portal_id: Nihil quia omnis eaque aperiam eum. - project_id: Rerum delectus velit. - sender_email: Quam et voluptatibus illum dolorem. - sender_name: Eum dolorum. - status: active - version: 3995988906528985875 + id: Eum dolorum. + label: Veniam velit sequi sit impedit dolorum voluptas. + login_customer_id: Sed non. + project_id: Distinctio vel. + status: error + version: 4111850562907897222 "404": description: 'NotFound: Resource not found' content: @@ -585,9 +1019,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-hubspot lfx-v2-campaign-service-connections - description: Create the project's HubSpot connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-hubspot + summary: create-google-ads lfx-v2-campaign-service-connections + description: Create the project's Google Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-google-ads parameters: - name: project_id in: path @@ -603,17 +1037,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateHubspotRequestBody' + $ref: '#/components/schemas/CreateGoogleAdsRequestBody' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: "8666746580" + label: TLF Main + login_customer_id: "9746983954" credentials: - private_app_token: Numquam ut nesciunt voluptas. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. responses: "201": description: Created response. @@ -623,24 +1057,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sequi non et. - example: Quibusdam repellendus qui numquam. + example: Voluptas ut nostrum officiis et accusamus provident. + example: Rerum reiciendis similique. content: application/json: schema: - $ref: '#/components/schemas/HubspotConnection2' + $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Voluptates iste autem veniam et enim unde. - brand_kit: Blanditiis quidem qui iusto sed. - has_credentials: false - id: Nesciunt necessitatibus ex ea ullam corrupti sunt. - label: Modi asperiores ut libero vel. - portal_id: Rem quia consequuntur ut. - project_id: Omnis accusantium ad. - sender_email: Consequatur quos atque voluptates quo sit. - sender_name: Dolor molestias ipsa dolorum est. - status: inactive - version: 1691702820919785934 + account_id: Perspiciatis saepe consequatur doloribus sequi et. + has_credentials: true + id: Nulla ut laboriosam. + label: Omnis suscipit corrupti reiciendis. + login_customer_id: Nihil quia omnis eaque aperiam eum. + project_id: Rerum delectus velit. + status: active + version: 3995988906528985875 "400": description: 'BadRequest: Bad request' content: @@ -682,9 +1113,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-hubspot lfx-v2-campaign-service-connections - description: Replace the HubSpot connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-hubspot + summary: update-google-ads lfx-v2-campaign-service-connections + description: Replace the Google Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-google-ads parameters: - name: project_id in: path @@ -709,15 +1140,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateHubspotRequestBody' + $ref: '#/components/schemas/UpdateGoogleAdsRequestBody' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: "8666746580" + label: TLF Main + login_customer_id: "9746983954" responses: "200": description: OK response. @@ -727,24 +1155,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Deleniti placeat rerum. - example: Recusandae totam soluta. + example: Sit ut repellat voluptas. + example: Repudiandae odit. content: application/json: schema: - $ref: '#/components/schemas/HubspotConnection4' + $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Aut ratione sunt nostrum tenetur. - brand_kit: Ab laboriosam quis sapiente ut sit. + account_id: Ut laborum nostrum veniam qui rerum. has_credentials: true - id: Ipsum quaerat delectus cupiditate sit et. - label: Magni et rerum sed voluptatum. - portal_id: Fugit enim et sint consectetur ea minus. - project_id: Enim est occaecati sed non dolorem distinctio. - sender_email: Ut laborum nostrum veniam qui rerum. - sender_name: Eum fugit repudiandae magnam ut. + id: Aut ratione sunt nostrum tenetur. + label: Fugit enim et sint consectetur ea minus. + login_customer_id: Magnam ut et ab. + project_id: Dolorem cum. status: active - version: 2378889005955898844 + version: 5799897036572741099 "400": description: 'BadRequest: Bad request' content: @@ -801,13 +1226,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-hubspot/set-credential: + /projects/{project_id}/connection-google-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-hubspot lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-hubspot + summary: set-credential-google-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-google-ads parameters: - name: project_id in: path @@ -823,10 +1248,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialHubspotRequestBody' + $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - private_app_token: Numquam ut nesciunt voluptas. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. responses: "204": description: No Content response. @@ -868,13 +1296,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-hubspot/test: + /projects/{project_id}/connection-google-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-hubspot lfx-v2-campaign-service-connections - description: Verify the stored HubSpot credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-hubspot + summary: test-google-ads lfx-v2-campaign-service-connections + description: Verify the stored Google Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-google-ads parameters: - name: project_id in: path @@ -893,8 +1321,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Tempora error rerum quae nihil. - ok: false + message: Sapiente ut sit quod. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -924,13 +1352,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-linkedin-ads: + /projects/{project_id}/connection-hubspot: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-linkedin-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's LinkedIn Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-linkedin-ads + summary: delete-hubspot lfx-v2-campaign-service-connections + description: Soft-delete the project's HubSpot connection. + operationId: lfx-v2-campaign-service-connections#delete-hubspot parameters: - name: project_id in: path @@ -976,9 +1404,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-linkedin-ads lfx-v2-campaign-service-connections - description: Get the project's LinkedIn Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-linkedin-ads + summary: get-hubspot lfx-v2-campaign-service-connections + description: Get the project's HubSpot connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-hubspot parameters: - name: project_id in: path @@ -998,21 +1426,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ea eum. - example: Repudiandae quae aut. + example: Quo omnis et et molestiae dolorum. + example: Consequatur iste eum amet vel impedit et. content: application/json: schema: - $ref: '#/components/schemas/LinkedinAdsConnection3' + $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Quis repellat tenetur. + account_id: Deleniti itaque voluptas magnam. + brand_kit: Dolor id. has_credentials: false - id: Et quam veritatis consequatur sed. - label: Ipsum fuga deleniti consequatur. - org_id: Natus laudantium quisquam. - project_id: Tempora aut incidunt incidunt dolorem eaque et. - status: inactive - version: 2296210645404105233 + id: Dolorem sapiente. + label: Sint autem. + portal_id: Vitae optio ut et consequuntur. + project_id: Aut natus. + sender_email: Libero autem ut. + sender_name: Debitis soluta sed quod dicta aperiam eveniet. + status: error + version: 7443019901611180865 "404": description: 'NotFound: Resource not found' content: @@ -1045,9 +1476,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-linkedin-ads lfx-v2-campaign-service-connections - description: Create the project's LinkedIn Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-linkedin-ads + summary: create-hubspot lfx-v2-campaign-service-connections + description: Create the project's HubSpot connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-hubspot parameters: - name: project_id in: path @@ -1063,14 +1494,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateLinkedinAdsRequestBody' + $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: "538170226" - label: Fugit voluptatem. - org_id: "208777" + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + private_app_token: Distinctio aut. responses: "201": description: Created response. @@ -1080,21 +1514,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatem doloremque ullam consequatur ut. - example: Ipsa magnam cum veritatis mollitia vel. + example: Architecto ab et libero ea aut. + example: Corrupti aut earum rerum ducimus dicta. content: application/json: schema: - $ref: '#/components/schemas/LinkedinAdsConnection2' + $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Totam quasi vero. + account_id: Qui et. + brand_kit: Porro ea cum et magni adipisci. has_credentials: false - id: Eum quia molestiae. - label: Est quos. - org_id: Est est id repellat quod deleniti cupiditate. - project_id: Rerum delectus tempora culpa. - status: error - version: 2086671994798543080 + id: Ad esse neque earum modi. + label: Ab voluptatem esse. + portal_id: Aut culpa impedit sit quibusdam nulla adipisci. + project_id: Quis possimus placeat. + sender_email: Dolorem molestias natus velit. + sender_name: Non dolorum odit est. + status: active + version: 8186374755967651666 "400": description: 'BadRequest: Bad request' content: @@ -1136,9 +1573,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-linkedin-ads lfx-v2-campaign-service-connections - description: Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-linkedin-ads + summary: update-hubspot lfx-v2-campaign-service-connections + description: Replace the HubSpot connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-hubspot parameters: - name: project_id in: path @@ -1163,12 +1600,15 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateLinkedinAdsRequestBody' + $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: "538170226" - label: Fugit voluptatem. - org_id: "208777" + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. responses: "200": description: OK response. @@ -1178,21 +1618,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempore rem quo fuga accusantium voluptas ratione. - example: Numquam optio possimus velit quod. + example: Et rerum repudiandae et at iusto. + example: Voluptas esse qui quisquam quae est magni. content: application/json: schema: - $ref: '#/components/schemas/LinkedinAdsConnection4' + $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Ipsa rerum odit et nostrum veritatis dolores. + account_id: Ut aut. + brand_kit: Ut voluptas et accusamus natus. has_credentials: false - id: Aut et voluptas ut officiis. - label: Debitis voluptatem quam occaecati. - org_id: Et tenetur sequi dolorum porro. - project_id: In autem tempore ut esse. - status: deleted - version: 7961829707957443728 + id: Saepe rerum sunt eum et qui aut. + label: Voluptas expedita omnis ex. + portal_id: Minima ut quasi voluptatum officia quod error. + project_id: Ut quia harum. + sender_email: Quia inventore est quia enim illo. + sender_name: Eligendi aperiam. + status: error + version: 9020823344753101103 "400": description: 'BadRequest: Bad request' content: @@ -1249,13 +1692,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-linkedin-ads/set-credential: + /projects/{project_id}/connection-hubspot/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-linkedin-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-linkedin-ads + summary: set-credential-hubspot lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-hubspot parameters: - name: project_id in: path @@ -1271,10 +1714,10 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' + $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + private_app_token: Distinctio aut. responses: "204": description: No Content response. @@ -1316,13 +1759,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-linkedin-ads/test: + /projects/{project_id}/connection-hubspot/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-linkedin-ads lfx-v2-campaign-service-connections - description: Verify the stored LinkedIn Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-linkedin-ads + summary: test-hubspot lfx-v2-campaign-service-connections + description: Verify the stored HubSpot credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-hubspot parameters: - name: project_id in: path @@ -1341,7 +1784,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Dolorum voluptates placeat rerum. + message: Et officia sequi et quam. ok: true "404": description: 'NotFound: Resource not found' @@ -1372,13 +1815,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-meta-ads: + /projects/{project_id}/connection-linkedin-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-meta-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Meta Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-meta-ads + summary: delete-linkedin-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's LinkedIn Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-linkedin-ads parameters: - name: project_id in: path @@ -1424,9 +1867,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-meta-ads lfx-v2-campaign-service-connections - description: Get the project's Meta Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-meta-ads + summary: get-linkedin-ads lfx-v2-campaign-service-connections + description: Get the project's LinkedIn Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-linkedin-ads parameters: - name: project_id in: path @@ -1446,22 +1889,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel necessitatibus vel voluptates tenetur veniam repellat. - example: Aut repudiandae voluptatibus odit autem. + example: Consequatur sint et vel molestiae. + example: Natus pariatur et et sed debitis. content: application/json: schema: - $ref: '#/components/schemas/MetaAdsConnection3' + $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Voluptatem cupiditate voluptas aliquam facilis iste sed. - app_id: A sed exercitationem ut. - has_credentials: false - id: Expedita unde molestiae. - label: Velit ullam. - page_id: Voluptatum a. - project_id: Voluptas dolor et incidunt pariatur quod odit. - status: active - version: 6376430019451136769 + account_id: Ducimus sequi. + has_credentials: true + id: Et placeat. + label: Aut et. + org_id: Culpa voluptas quia tenetur. + project_id: Qui esse. + status: inactive + version: 3277300697475451657 "404": description: 'NotFound: Resource not found' content: @@ -1494,9 +1936,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-meta-ads lfx-v2-campaign-service-connections - description: Create the project's Meta Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-meta-ads + summary: create-linkedin-ads lfx-v2-campaign-service-connections + description: Create the project's LinkedIn Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-linkedin-ads parameters: - name: project_id in: path @@ -1512,16 +1954,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateMetaAdsRequestBody' + $ref: '#/components/schemas/CreateLinkedinAdsRequestBody' example: config: - account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + account_id: "538170226" + label: Tempora error rerum quae nihil. + org_id: "208777" credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. responses: "201": description: Created response. @@ -1531,22 +1971,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Perspiciatis quam iste possimus ipsam. - example: Eveniet quia voluptatem impedit cumque doloribus. + example: Cupiditate est illo repellat et cum repellat. + example: Facilis repellat eveniet reiciendis. content: application/json: schema: - $ref: '#/components/schemas/MetaAdsConnection2' + $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Fuga ut expedita voluptatum sit. - app_id: Quia ut atque. + account_id: Deserunt magni voluptas odio assumenda totam. has_credentials: true - id: Quis perspiciatis. - label: Similique vel nobis non molestias. - page_id: Velit et. - project_id: Nesciunt unde ullam occaecati maxime. - status: active - version: 8123871071866488705 + id: Nobis ipsam. + label: Velit sapiente qui iusto quis magni et. + org_id: Officiis deleniti ipsam nam. + project_id: Aut voluptatem inventore ab. + status: deleted + version: 6633489521806040497 "400": description: 'BadRequest: Bad request' content: @@ -1588,9 +2027,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-meta-ads lfx-v2-campaign-service-connections - description: Replace the Meta Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-meta-ads + summary: update-linkedin-ads lfx-v2-campaign-service-connections + description: Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-linkedin-ads parameters: - name: project_id in: path @@ -1615,13 +2054,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateMetaAdsRequestBody' + $ref: '#/components/schemas/UpdateLinkedinAdsRequestBody' example: config: - account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + account_id: "538170226" + label: Tempora error rerum quae nihil. + org_id: "208777" responses: "200": description: OK response. @@ -1631,22 +2069,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dicta qui. - example: Voluptate dolorum id ut molestias id. + example: Quaerat iure ipsam. + example: Minima adipisci aut quia quisquam. content: application/json: schema: - $ref: '#/components/schemas/MetaAdsConnection4' + $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Quos quo eum dignissimos iure praesentium. - app_id: Voluptas ratione delectus ut adipisci. - has_credentials: false - id: Doloremque itaque eius magni autem. - label: Ex tempore. - page_id: Qui mollitia perferendis eveniet voluptas est et. - project_id: Ullam tenetur quia totam magni sunt repellat. - status: inactive - version: 7772855560046758577 + account_id: Minus voluptas asperiores debitis labore aut. + has_credentials: true + id: Enim consequatur id voluptatem adipisci alias. + label: Tempora ipsum aut enim harum. + org_id: Necessitatibus consequatur natus tempora ut. + project_id: Sequi consequatur dolorum sint voluptatem voluptas omnis. + status: error + version: 7443611122231905788 "400": description: 'BadRequest: Bad request' content: @@ -1703,13 +2140,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-meta-ads/set-credential: + /projects/{project_id}/connection-linkedin-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-meta-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-meta-ads + summary: set-credential-linkedin-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-linkedin-ads parameters: - name: project_id in: path @@ -1725,11 +2162,10 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' + $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. responses: "204": description: No Content response. @@ -1771,13 +2207,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-meta-ads/test: + /projects/{project_id}/connection-linkedin-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-meta-ads lfx-v2-campaign-service-connections - description: Verify the stored Meta Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-meta-ads + summary: test-linkedin-ads lfx-v2-campaign-service-connections + description: Verify the stored LinkedIn Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-linkedin-ads parameters: - name: project_id in: path @@ -1796,7 +2232,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Aliquam animi unde. + message: Nihil ad hic repellendus nobis voluptatem. ok: true "404": description: 'NotFound: Resource not found' @@ -1827,13 +2263,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-microsoft-ads: + /projects/{project_id}/connection-meta-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-microsoft-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Microsoft Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-microsoft-ads + summary: delete-meta-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Meta Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-meta-ads parameters: - name: project_id in: path @@ -1879,9 +2315,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-microsoft-ads lfx-v2-campaign-service-connections - description: Get the project's Microsoft Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-microsoft-ads + summary: get-meta-ads lfx-v2-campaign-service-connections + description: Get the project's Meta Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-meta-ads parameters: - name: project_id in: path @@ -1901,21 +2337,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Non eos. - example: Enim voluptatem inventore quasi. + example: Incidunt sit. + example: Totam tempora quod expedita. content: application/json: schema: - $ref: '#/components/schemas/MicrosoftAdsConnection3' + $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Optio dolorem omnis. - customer_id: Rerum adipisci minima quibusdam autem accusantium. + account_id: Asperiores ipsum quam. + app_id: Cum rem architecto vel quibusdam vel autem. has_credentials: false - id: Veniam eum ut libero quibusdam debitis. - label: Commodi quam voluptates. - project_id: Ut consectetur. - status: deleted - version: 6203614951491514230 + id: Non praesentium voluptas saepe sit. + label: Reiciendis qui id tenetur exercitationem aperiam incidunt. + page_id: Qui suscipit rerum quo eligendi tempora. + project_id: Sed qui. + status: active + version: 5968285761891001183 "404": description: 'NotFound: Resource not found' content: @@ -1948,9 +2385,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-microsoft-ads lfx-v2-campaign-service-connections - description: Create the project's Microsoft Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-microsoft-ads + summary: create-meta-ads lfx-v2-campaign-service-connections + description: Create the project's Meta Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-meta-ads parameters: - name: project_id in: path @@ -1966,17 +2403,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' + $ref: '#/components/schemas/CreateMetaAdsRequestBody' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: act_193556282970417 + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. responses: "201": description: Created response. @@ -1986,21 +2422,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Delectus enim quas id porro. - example: Quo repudiandae. + example: Quia facilis sit. + example: Possimus accusantium expedita alias. content: application/json: schema: - $ref: '#/components/schemas/MicrosoftAdsConnection2' + $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Exercitationem rerum iste ducimus. - customer_id: Quidem velit est explicabo est sed. + account_id: Ratione quis. + app_id: Aut assumenda unde occaecati eum tenetur nam. has_credentials: true - id: Modi rerum sint. - label: Dolorem dolor fugiat quia. - project_id: Labore iste voluptates quos. - status: inactive - version: 8271015532862321776 + id: Voluptatibus qui cupiditate voluptatem. + label: Ut in possimus quia nulla. + page_id: Vel consequatur ea deserunt. + project_id: Et corporis officia sint. + status: error + version: 935673982343451083 "400": description: 'BadRequest: Bad request' content: @@ -2042,9 +2479,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-microsoft-ads lfx-v2-campaign-service-connections - description: Replace the Microsoft Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-microsoft-ads + summary: update-meta-ads lfx-v2-campaign-service-connections + description: Replace the Meta Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-meta-ads parameters: - name: project_id in: path @@ -2069,12 +2506,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' + $ref: '#/components/schemas/UpdateMetaAdsRequestBody' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: act_193556282970417 + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. responses: "200": description: OK response. @@ -2084,21 +2522,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut omnis itaque ut vero voluptatibus. - example: Vero dolorem qui. + example: Sit harum ipsa et. + example: Commodi et nihil et. content: application/json: schema: - $ref: '#/components/schemas/MicrosoftAdsConnection4' + $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Maxime fugiat illo. - customer_id: Minus est ut. - has_credentials: false - id: Tempora recusandae. - label: Reiciendis architecto atque maxime soluta dolorem ducimus. - project_id: Itaque harum. - status: deleted - version: 6177609042943350629 + account_id: Aliquid ducimus quia. + app_id: Quas tenetur velit quaerat aut. + has_credentials: true + id: Hic delectus. + label: Quibusdam aliquam consequuntur. + page_id: Aut odio iste assumenda deleniti earum magni. + project_id: Maxime ut possimus expedita. + status: inactive + version: 7469982570284737303 "400": description: 'BadRequest: Bad request' content: @@ -2155,13 +2594,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-microsoft-ads/set-credential: + /projects/{project_id}/connection-meta-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-microsoft-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-microsoft-ads + summary: set-credential-meta-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-meta-ads parameters: - name: project_id in: path @@ -2177,13 +2616,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' + $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. responses: "204": description: No Content response. @@ -2225,13 +2662,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-microsoft-ads/test: + /projects/{project_id}/connection-meta-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-microsoft-ads lfx-v2-campaign-service-connections - description: Verify the stored Microsoft Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-microsoft-ads + summary: test-meta-ads lfx-v2-campaign-service-connections + description: Verify the stored Meta Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-meta-ads parameters: - name: project_id in: path @@ -2250,8 +2687,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ullam fugiat. - ok: true + message: Et quo. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2281,13 +2718,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-reddit-ads: + /projects/{project_id}/connection-microsoft-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-reddit-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's Reddit Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-reddit-ads + summary: delete-microsoft-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Microsoft Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-microsoft-ads parameters: - name: project_id in: path @@ -2333,9 +2770,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-reddit-ads lfx-v2-campaign-service-connections - description: Get the project's Reddit Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-reddit-ads + summary: get-microsoft-ads lfx-v2-campaign-service-connections + description: Get the project's Microsoft Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-microsoft-ads parameters: - name: project_id in: path @@ -2355,20 +2792,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Autem aliquam voluptatibus assumenda mollitia molestias eos. - example: Fugit eum et sint possimus omnis. + example: Amet qui provident. + example: Ut ea. content: application/json: schema: - $ref: '#/components/schemas/RedditAdsConnection3' + $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Amet iusto provident sequi est. - has_credentials: true - id: Voluptas non accusantium. - label: Sit dolorum excepturi quibusdam. - project_id: Architecto consequatur enim magnam eius voluptas voluptatibus. - status: deleted - version: 1322493338651594921 + account_id: Ut tempora consequuntur cumque repudiandae omnis ut. + customer_id: Est aut labore sint natus. + has_credentials: false + id: Vero quis consequuntur. + label: Ut fugiat magnam quia. + project_id: Quis quo illum cum quod. + status: active + version: 343208040254291221 "404": description: 'NotFound: Resource not found' content: @@ -2401,9 +2839,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-reddit-ads lfx-v2-campaign-service-connections - description: Create the project's Reddit Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-reddit-ads + summary: create-microsoft-ads lfx-v2-campaign-service-connections + description: Create the project's Microsoft Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-microsoft-ads parameters: - name: project_id in: path @@ -2419,15 +2857,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateRedditAdsRequestBody' + $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. responses: "201": description: Created response. @@ -2437,20 +2877,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ipsa aut. - example: Impedit vitae molestiae. + example: Earum laboriosam dignissimos reiciendis et quisquam. + example: Deserunt reiciendis dolorem totam voluptatem. content: application/json: schema: - $ref: '#/components/schemas/RedditAdsConnection2' + $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Ut ea alias. - has_credentials: false - id: Explicabo cupiditate rerum. - label: Hic vero et. - project_id: Incidunt ipsum est perspiciatis soluta voluptas est. - status: inactive - version: 347677279926224703 + account_id: Autem aspernatur ea voluptatem. + customer_id: Accusantium aspernatur facere tempora voluptatem dicta rerum. + has_credentials: true + id: Eos explicabo non quidem. + label: Nam voluptas sed et doloremque reiciendis pariatur. + project_id: Debitis itaque itaque dolores nihil. + status: deleted + version: 8497111294039610948 "400": description: 'BadRequest: Bad request' content: @@ -2492,9 +2933,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-reddit-ads lfx-v2-campaign-service-connections - description: Replace the Reddit Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-reddit-ads + summary: update-microsoft-ads lfx-v2-campaign-service-connections + description: Replace the Microsoft Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-microsoft-ads parameters: - name: project_id in: path @@ -2519,11 +2960,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateRedditAdsRequestBody' + $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. responses: "200": description: OK response. @@ -2533,20 +2975,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Neque hic voluptatem ad similique sunt. - example: Ratione impedit recusandae dolor consequatur. + example: Laudantium doloremque aut eligendi perferendis aut. + example: Consectetur delectus libero id. content: application/json: schema: - $ref: '#/components/schemas/RedditAdsConnection4' + $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Saepe pariatur. - has_credentials: true - id: Vero quam. - label: Eveniet soluta adipisci. - project_id: Neque tempore voluptatibus quo quod nesciunt. - status: active - version: 779913646680513111 + account_id: In expedita. + customer_id: Magni ducimus nulla suscipit sed minus soluta. + has_credentials: false + id: Iste voluptatem et voluptatem ut ut. + label: Quia sed omnis quaerat aut. + project_id: Nostrum laborum minima. + status: error + version: 7283482467977491974 "400": description: 'BadRequest: Bad request' content: @@ -2603,13 +3046,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-reddit-ads/set-credential: + /projects/{project_id}/connection-microsoft-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-reddit-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-reddit-ads + summary: set-credential-microsoft-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-microsoft-ads parameters: - name: project_id in: path @@ -2625,12 +3068,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' + $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. responses: "204": description: No Content response. @@ -2672,13 +3116,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-reddit-ads/test: + /projects/{project_id}/connection-microsoft-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-reddit-ads lfx-v2-campaign-service-connections - description: Verify the stored Reddit Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-reddit-ads + summary: test-microsoft-ads lfx-v2-campaign-service-connections + description: Verify the stored Microsoft Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-microsoft-ads parameters: - name: project_id in: path @@ -2697,7 +3141,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Repudiandae veniam soluta alias natus aut. + message: Sed maiores qui sed exercitationem quam. ok: true "404": description: 'NotFound: Resource not found' @@ -2728,13 +3172,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-twitter-ads: + /projects/{project_id}/connection-reddit-ads: delete: tags: - lfx-v2-campaign-service-connections - summary: delete-twitter-ads lfx-v2-campaign-service-connections - description: Soft-delete the project's X/Twitter Ads connection. - operationId: lfx-v2-campaign-service-connections#delete-twitter-ads + summary: delete-reddit-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's Reddit Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-reddit-ads parameters: - name: project_id in: path @@ -2780,9 +3224,9 @@ paths: get: tags: - lfx-v2-campaign-service-connections - summary: get-twitter-ads lfx-v2-campaign-service-connections - description: Get the project's X/Twitter Ads connection (credentials redacted; returns ETag). - operationId: lfx-v2-campaign-service-connections#get-twitter-ads + summary: get-reddit-ads lfx-v2-campaign-service-connections + description: Get the project's Reddit Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-reddit-ads parameters: - name: project_id in: path @@ -2802,21 +3246,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Enim esse dolores. - example: Est perferendis eos et cumque nulla. + example: Sed ipsam enim esse iure est. + example: Aut sunt ex et autem delectus. content: application/json: schema: - $ref: '#/components/schemas/TwitterAdsConnection3' + $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Et tempore. - funding_instrument_id: Est et id laudantium magnam ratione. - has_credentials: false - id: Ipsum deserunt ut. - label: Ut nihil quo tenetur doloribus fugiat natus. - project_id: Sed ea. - status: error - version: 6360932954176398686 + account_id: Ipsam temporibus sint et necessitatibus dolorem ut. + has_credentials: true + id: Quidem illo numquam doloremque et. + label: Fugiat adipisci eos rerum. + project_id: Perferendis ut quia aut. + status: active + version: 1442766184420227830 "404": description: 'NotFound: Resource not found' content: @@ -2849,9 +3292,9 @@ paths: post: tags: - lfx-v2-campaign-service-connections - summary: create-twitter-ads lfx-v2-campaign-service-connections - description: Create the project's X/Twitter Ads connection (singleton; 409 if one already exists). - operationId: lfx-v2-campaign-service-connections#create-twitter-ads + summary: create-reddit-ads lfx-v2-campaign-service-connections + description: Create the project's Reddit Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-reddit-ads parameters: - name: project_id in: path @@ -2867,17 +3310,15 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateTwitterAdsRequestBody' + $ref: '#/components/schemas/CreateRedditAdsRequestBody' example: config: - account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + account_id: t2_gv9wtbfa + label: Provident quia distinctio. credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. responses: "201": description: Created response. @@ -2887,21 +3328,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel temporibus sunt nulla esse sed. - example: Facere sed ea qui pariatur adipisci. + example: Dolorem omnis aspernatur veritatis adipisci. + example: Voluptas ipsam iste. content: application/json: schema: - $ref: '#/components/schemas/TwitterAdsConnection2' + $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Totam sequi. - funding_instrument_id: Labore ut iusto dolores. + account_id: Asperiores velit enim tempore expedita ut. has_credentials: false - id: Dolor ut. - label: Porro sed minus illo rerum ut. - project_id: Veniam maiores dolorum sit et. - status: active - version: 5887915076445143491 + id: Sapiente et et itaque dolores in. + label: Consequatur nihil explicabo vero commodi est. + project_id: Rem dolores eligendi ea. + status: deleted + version: 2256150830368172012 "400": description: 'BadRequest: Bad request' content: @@ -2943,9 +3383,9 @@ paths: put: tags: - lfx-v2-campaign-service-connections - summary: update-twitter-ads lfx-v2-campaign-service-connections - description: Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials). - operationId: lfx-v2-campaign-service-connections#update-twitter-ads + summary: update-reddit-ads lfx-v2-campaign-service-connections + description: Replace the Reddit Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-reddit-ads parameters: - name: project_id in: path @@ -2970,12 +3410,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UpdateTwitterAdsRequestBody' + $ref: '#/components/schemas/UpdateRedditAdsRequestBody' example: config: - account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + account_id: t2_gv9wtbfa + label: Provident quia distinctio. responses: "200": description: OK response. @@ -2985,21 +3424,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Neque maiores quo aliquam in rem. - example: Voluptatem possimus veniam dignissimos consequatur. + example: Adipisci omnis veritatis omnis praesentium omnis. + example: Natus aliquam aut quas aliquid. content: application/json: schema: - $ref: '#/components/schemas/TwitterAdsConnection4' + $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Est dolorem eos amet dolorem sed. - funding_instrument_id: Quia porro. - has_credentials: false - id: Ab nobis fuga atque inventore fugiat. - label: Quod blanditiis et. - project_id: Laboriosam maxime facere culpa modi. - status: error - version: 796228352115418506 + account_id: Architecto unde rerum quisquam ut. + has_credentials: true + id: Veniam debitis aut similique ullam temporibus qui. + label: Voluptates neque expedita. + project_id: Sit iusto. + status: deleted + version: 2250019048790832853 "400": description: 'BadRequest: Bad request' content: @@ -3056,13 +3494,13 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-twitter-ads/set-credential: + /projects/{project_id}/connection-reddit-ads/set-credential: post: tags: - lfx-v2-campaign-service-connections - summary: set-credential-twitter-ads lfx-v2-campaign-service-connections - description: Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. - operationId: lfx-v2-campaign-service-connections#set-credential-twitter-ads + summary: set-credential-reddit-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-reddit-ads parameters: - name: project_id in: path @@ -3078,13 +3516,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' + $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. responses: "204": description: No Content response. @@ -3126,13 +3563,186 @@ paths: message: The service is unavailable. security: - jwt_header_Authorization: [] - /projects/{project_id}/connection-twitter-ads/test: + /projects/{project_id}/connection-reddit-ads/test: post: tags: - lfx-v2-campaign-service-connections - summary: test-twitter-ads lfx-v2-campaign-service-connections - description: Verify the stored X/Twitter Ads credential against the provider. - operationId: lfx-v2-campaign-service-connections#test-twitter-ads + summary: test-reddit-ads lfx-v2-campaign-service-connections + description: Verify the stored Reddit Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-reddit-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectionTestResult' + example: + message: Repellendus sint. + ok: true + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-twitter-ads: + delete: + tags: + - lfx-v2-campaign-service-connections + summary: delete-twitter-ads lfx-v2-campaign-service-connections + description: Soft-delete the project's X/Twitter Ads connection. + operationId: lfx-v2-campaign-service-connections#delete-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "204": + description: No Content response. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + get: + tags: + - lfx-v2-campaign-service-connections + summary: get-twitter-ads lfx-v2-campaign-service-connections + description: Get the project's X/Twitter Ads connection (credentials redacted; returns ETag). + operationId: lfx-v2-campaign-service-connections#get-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Ullam voluptatibus nihil. + example: Voluptas consequatur iusto nostrum pariatur. + content: + application/json: + schema: + $ref: '#/components/schemas/TwitterAdsConnection3' + example: + account_id: Numquam quia. + funding_instrument_id: Autem provident est. + has_credentials: true + id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Sit ex commodi sapiente a illum. + project_id: Pariatur voluptas odit fuga illo. + status: active + version: 4562568070495708080 + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + post: + tags: + - lfx-v2-campaign-service-connections + summary: create-twitter-ads lfx-v2-campaign-service-connections + description: Create the project's X/Twitter Ads connection (singleton; 409 if one already exists). + operationId: lfx-v2-campaign-service-connections#create-twitter-ads parameters: - name: project_id in: path @@ -3140,67 +3750,1116 @@ paths: required: true schema: type: string - description: Project UUID or slug that scopes the connection - example: cncf - example: cncf - responses: - "200": - description: OK response. - content: - application/json: - schema: - $ref: '#/components/schemas/ConnectionTestResult' - example: - message: Quo aliquid nobis. - ok: true - "404": - description: 'NotFound: Resource not found' - content: - application/json: - schema: - $ref: '#/components/schemas/NotFoundError' - example: - code: "404" - message: The connection was not found. - "500": - description: 'InternalServerError: Internal server error' - content: - application/json: - schema: - $ref: '#/components/schemas/InternalServerError' - example: - code: "500" - message: An internal server error occurred. - "503": - description: 'ServiceUnavailable: Service unavailable' - content: - application/json: - schema: - $ref: '#/components/schemas/ConnServiceUnavailableError' - example: - code: "503" - message: The service is unavailable. - security: - - jwt_header_Authorization: [] -components: - schemas: - BadRequestError: + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateTwitterAdsRequestBody' + example: + config: + account_id: 8r7gb + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. + credentials: + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. + responses: + "201": + description: Created response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Saepe non tempore. + example: Tempore qui est. + content: + application/json: + schema: + $ref: '#/components/schemas/TwitterAdsConnection2' + example: + account_id: Est consequatur eveniet in fuga ut. + funding_instrument_id: Accusamus ratione consequuntur aut et corrupti. + has_credentials: false + id: Beatae aliquam quia officiis hic ea. + label: Vitae quae debitis sunt aperiam ex voluptatibus. + project_id: Ut dolor velit. + status: active + version: 2352400902970282412 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "409": + description: 'Conflict: A connection already exists for this provider on the project' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + put: + tags: + - lfx-v2-campaign-service-connections + summary: update-twitter-ads lfx-v2-campaign-service-connections + description: Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials). + operationId: lfx-v2-campaign-service-connections#update-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + - name: If-Match + in: header + description: If-Match header carrying the current ETag/version + allowEmptyValue: true + schema: + type: string + description: If-Match header carrying the current ETag/version + example: "3" + example: "3" + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateTwitterAdsRequestBody' + example: + config: + account_id: 8r7gb + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. + responses: + "200": + description: OK response. + headers: + ETag: + description: ETag header value (mirrors version) + schema: + type: string + description: ETag header value (mirrors version) + example: Laborum ut magnam aut illum commodi placeat. + example: Voluptas libero pariatur ut qui sint. + content: + application/json: + schema: + $ref: '#/components/schemas/TwitterAdsConnection4' + example: + account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + funding_instrument_id: Eaque animi molestias error laudantium. + has_credentials: true + id: Quis et odio tenetur optio. + label: Iste eveniet laudantium rerum. + project_id: Ut sint. + status: error + version: 7980949958307848867 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "412": + description: 'PreconditionFailed: ETag mismatch' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionFailedError' + example: + code: "412" + message: The supplied ETag does not match the current version. + "428": + description: 'PreconditionRequired: If-Match header required' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionRequiredError' + example: + code: "428" + message: An If-Match header is required. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-twitter-ads/set-credential: + post: + tags: + - lfx-v2-campaign-service-connections + summary: set-credential-twitter-ads lfx-v2-campaign-service-connections + description: Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream. + operationId: lfx-v2-campaign-service-connections#set-credential-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' + example: + credentials: + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. + responses: + "204": + description: No Content response. + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/connection-twitter-ads/test: + post: + tags: + - lfx-v2-campaign-service-connections + summary: test-twitter-ads lfx-v2-campaign-service-connections + description: Verify the stored X/Twitter Ads credential against the provider. + operationId: lfx-v2-campaign-service-connections#test-twitter-ads + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectionTestResult' + example: + message: Odio adipisci dolore iste ipsa. + ok: true + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] + /projects/{project_id}/jobs/{job_id}: + get: + tags: + - lfx-v2-campaign-service-briefs + summary: get-job lfx-v2-campaign-service-briefs + description: Poll campaign-creation job status. + operationId: lfx-v2-campaign-service-briefs#get-job + parameters: + - name: project_id + in: path + description: Project UUID or slug that scopes the connection + required: true + schema: + type: string + description: Project UUID or slug that scopes the connection + example: cncf + example: cncf + - name: job_id + in: path + description: Job UUID + required: true + schema: + type: string + description: Job UUID + example: Ipsa sint optio nobis quae corporis. + example: Et iste. + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/JobPollResponse' + example: + error: Veniam et. + job_id: Iure modi asperiores ut. + result: Autem voluptates iste. + status: running + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. + "404": + description: 'NotFound: Resource not found' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundError' + example: + code: "404" + message: The connection was not found. + "409": + description: 'Conflict: Conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ConflictError' + example: + code: "409" + message: A connection for this provider already exists on the project. + "500": + description: 'InternalServerError: Internal server error' + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + example: + code: "500" + message: An internal server error occurred. + "503": + description: 'ServiceUnavailable: Service unavailable' + content: + application/json: + schema: + $ref: '#/components/schemas/ConnServiceUnavailableError' + example: + code: "503" + message: The service is unavailable. + security: + - jwt_header_Authorization: [] +components: + schemas: + BadRequestError: + type: object + properties: + code: + type: string + description: HTTP status code + example: "400" + message: + type: string + description: Error message + example: The request was invalid. + example: + code: "400" + message: The request was invalid. + required: + - code + - message + Brief: + type: object + properties: + copy: + description: Ad copy + example: Eaque ut laudantium nostrum ratione. + etag: + type: string + description: ETag header value (mirrors version) + example: Non iusto odit consequatur in vero soluta. + event_details: + description: Extracted event/course details + example: Laboriosam nostrum quos expedita voluptas. + event_slug: + type: string + description: Event/course slug + example: Deserunt labore et id aut et adipisci. + id: + type: string + description: Brief UUID + example: Et qui ut libero numquam. + keywords: + description: Keyword list + example: Eius laborum. + platforms: + type: array + items: + type: string + example: Voluptates ut culpa saepe necessitatibus. + description: Suggested default platforms + example: + - Enim id voluptas aperiam distinctio. + - Harum eos eveniet ut. + program_type: + type: string + description: Funnel context + example: Esse voluptate eum laboriosam distinctio non. + project_id: + type: string + description: Owning project + example: Ullam facilis ab sapiente voluptatem. + status: + type: string + description: Lifecycle status + example: approved + enum: + - draft + - approved + - archived + targeting: + description: Targeting recommendation + example: Voluptate itaque fugit rerum cumque. + url: + type: string + description: Event/course page URL + example: Ut molestiae. + version: + type: integer + description: Optimistic-concurrency version + example: 7582961521318439491 + format: int64 + example: + copy: Ut ut odio odio sed minus quia. + etag: Itaque omnis ut. + event_details: Nihil sunt doloremque. + event_slug: Porro ut et cupiditate. + id: Eius dicta. + keywords: Ea architecto autem iste. + platforms: + - Necessitatibus dolorem enim beatae. + - Minus vero at ut quis. + - Molestiae aut fugit alias. + - Qui maiores quia non unde deserunt. + program_type: Non assumenda perspiciatis. + project_id: Ullam distinctio dolore velit. + status: draft + targeting: In ipsa tempore incidunt velit provident perspiciatis. + url: Ea ullam minima voluptatem vel deleniti. + version: 1281384136826250351 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief2: + type: object + properties: + copy: + description: Ad copy + example: Quod enim pariatur et occaecati veritatis voluptatem. + event_details: + description: Extracted event/course details + example: Iure enim dolore est. + event_slug: + type: string + description: Event/course slug + example: Nihil atque. + id: + type: string + description: Brief UUID + example: Et optio sed omnis aut voluptatem voluptas. + keywords: + description: Keyword list + example: Architecto aliquam mollitia labore sapiente dolores tenetur. + platforms: + type: array + items: + type: string + example: Vero ad ex consequatur dolore. + description: Suggested default platforms + example: + - Beatae eaque quo atque. + - Error eligendi incidunt accusamus excepturi inventore. + - Est ut voluptas quod. + - Dolor qui molestiae id aut. + program_type: + type: string + description: Funnel context + example: Et eum inventore quisquam. + project_id: + type: string + description: Owning project + example: Eum omnis est blanditiis maxime et. + status: + type: string + description: Lifecycle status + example: archived + enum: + - draft + - approved + - archived + targeting: + description: Targeting recommendation + example: Accusamus qui. + url: + type: string + description: Event/course page URL + example: Nihil facilis sunt. + version: + type: integer + description: Optimistic-concurrency version + example: 1931126915939314041 + format: int64 + example: + copy: Necessitatibus sit. + event_details: Sit dignissimos incidunt voluptas. + event_slug: Reiciendis enim. + id: Mollitia ea. + keywords: Quis aperiam deserunt nostrum consectetur et sed. + platforms: + - Nemo nihil dolorum consequatur sed tempora qui. + - Hic vel aspernatur at quam est ea. + program_type: Ad quae nisi. + project_id: Et amet sunt. + status: approved + targeting: Libero blanditiis. + url: Cum et ab ipsum. + version: 1441686313140477581 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief3: + type: object + properties: + copy: + description: Ad copy + example: Praesentium et. + event_details: + description: Extracted event/course details + example: Dolor consectetur eos iste. + event_slug: + type: string + description: Event/course slug + example: Dolores laborum sed. + id: + type: string + description: Brief UUID + example: Nulla sunt autem eos rerum provident dicta. + keywords: + description: Keyword list + example: Veniam iusto consequatur quia sed officia eligendi. + platforms: + type: array + items: + type: string + example: Est quis impedit. + description: Suggested default platforms + example: + - Harum et consequatur eligendi eum necessitatibus. + - Magnam ut. + - Voluptate voluptates corrupti sapiente. + - Dolorum repellat expedita ut recusandae dolor. + program_type: + type: string + description: Funnel context + example: Commodi odio sunt esse mollitia incidunt. + project_id: + type: string + description: Owning project + example: Voluptatem voluptate dolor dolores provident. + status: + type: string + description: Lifecycle status + example: draft + enum: + - draft + - approved + - archived + targeting: + description: Targeting recommendation + example: Qui impedit. + url: + type: string + description: Event/course page URL + example: Veritatis itaque. + version: + type: integer + description: Optimistic-concurrency version + example: 1624749011573187666 + format: int64 + example: + copy: Amet quaerat modi. + event_details: Velit quis harum recusandae est ipsum. + event_slug: Quo necessitatibus necessitatibus. + id: Minus reprehenderit dignissimos aut velit. + keywords: Eum totam voluptatem eos. + platforms: + - Voluptatem rerum praesentium voluptatem blanditiis non. + - Temporibus in repudiandae tenetur. + - Saepe vel aut animi sit esse ratione. + - Blanditiis laborum est quasi dignissimos. + program_type: Repellendus omnis doloribus amet cum. + project_id: At sint laborum veniam. + status: approved + targeting: Sint exercitationem. + url: Sint dicta. + version: 6296331077615132388 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief4: + type: object + properties: + copy: + description: Ad copy + example: Placeat dolores numquam molestias quibusdam aliquid. + event_details: + description: Extracted event/course details + example: Et itaque ut dolores in voluptas. + event_slug: + type: string + description: Event/course slug + example: Autem quo tempora voluptate fuga. + id: + type: string + description: Brief UUID + example: Sit in quia molestiae perspiciatis alias et. + keywords: + description: Keyword list + example: Fuga est aliquam debitis. + platforms: + type: array + items: + type: string + example: Rerum cum eaque nesciunt est totam inventore. + description: Suggested default platforms + example: + - Ipsam aut vel. + - Eos reiciendis. + - Minima non. + program_type: + type: string + description: Funnel context + example: Libero et consequuntur suscipit distinctio pariatur mollitia. + project_id: + type: string + description: Owning project + example: Ex molestiae praesentium. + status: + type: string + description: Lifecycle status + example: draft + enum: + - draft + - approved + - archived + targeting: + description: Targeting recommendation + example: Deleniti est natus sequi beatae consectetur. + url: + type: string + description: Event/course page URL + example: Distinctio maiores mollitia aut. + version: + type: integer + description: Optimistic-concurrency version + example: 7075859053648216976 + format: int64 + example: + copy: Distinctio tempore qui velit omnis dolorem est. + event_details: Voluptatibus nihil nisi. + event_slug: Est molestiae voluptates ipsum neque sapiente aliquid. + id: Et quis consequatur dolores repellat nostrum similique. + keywords: Quia recusandae dignissimos dolore harum totam. + platforms: + - Nobis hic eos magni eos voluptatem. + - Hic ut sapiente harum aliquam sunt eum. + - Eaque occaecati. + program_type: Minima aut fugit eos et iure laudantium. + project_id: Iste aliquid. + status: draft + targeting: Vitae illo consequuntur esse. + url: Velit sunt molestiae eius. + version: 7533657070215672415 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + Brief5: + type: object + properties: + copy: + description: Ad copy + example: Et provident illo non quisquam iure doloremque. + event_details: + description: Extracted event/course details + example: Est et magni. + event_slug: + type: string + description: Event/course slug + example: Voluptatem ipsa. + id: + type: string + description: Brief UUID + example: Ut ullam aliquam dolore iure consequatur. + keywords: + description: Keyword list + example: Ut aliquid. + platforms: + type: array + items: + type: string + example: Tempora est eveniet sequi ea. + description: Suggested default platforms + example: + - Consequatur possimus. + - Assumenda sit delectus veniam. + program_type: + type: string + description: Funnel context + example: Quia labore non ut dolores et. + project_id: + type: string + description: Owning project + example: Nostrum iste nemo fugiat sunt deleniti officia. + status: + type: string + description: Lifecycle status + example: archived + enum: + - draft + - approved + - archived + targeting: + description: Targeting recommendation + example: Repellendus eveniet veritatis impedit aut iste earum. + url: + type: string + description: Event/course page URL + example: Assumenda excepturi. + version: + type: integer + description: Optimistic-concurrency version + example: 2088061558739708952 + format: int64 + example: + copy: Commodi qui mollitia et eum veniam. + event_details: Alias voluptatem ut consequatur ut recusandae. + event_slug: Quis odio enim nam id voluptatem. + id: Accusamus pariatur saepe. + keywords: Aliquam eaque voluptatem omnis. + platforms: + - Eaque suscipit harum sint neque quia fuga. + - Veniam itaque optio consequatur nulla sint. + program_type: Laboriosam sunt quis omnis animi. + project_id: Qui et. + status: approved + targeting: Cupiditate aut. + url: Vero alias temporibus illum. + version: 232152934679383541 + required: + - id + - project_id + - program_type + - event_slug + - status + - version + BriefInput: + type: object + properties: + copy: + description: Ad copy + example: Optio labore omnis. + event_details: + description: Extracted event/course details + example: Sunt omnis mollitia aut rerum quis et. + event_slug: + type: string + description: Event/course slug (unique within the project) + example: Amet enim non rem. + keywords: + description: Keyword list + example: Nihil aut rerum est vel. + platforms: + type: array + items: + type: string + example: Quos perferendis nisi blanditiis eveniet quasi ea. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) + example: + - Corporis dolorum consequatur eius perferendis. + - Omnis vel voluptate necessitatibus enim et et. + program_type: + type: string + description: Funnel context + example: membership + enum: + - events + - education + - membership + targeting: + description: Targeting recommendation + example: Rem ab corporis. + url: + type: string + description: Event/course page URL + example: Voluptas deserunt quod officiis. + example: + copy: Vitae vel omnis autem accusamus mollitia. + event_details: Corrupti voluptas. + event_slug: Dolorem repellendus porro et distinctio. + keywords: Assumenda aut harum eligendi rerum numquam amet. + platforms: + - Error aut maxime dicta qui. + - Quas suscipit eos nam ipsa. + - Velit et impedit facilis quaerat. + - Dolor ut velit quam omnis et dolor. + program_type: education + targeting: Rem quia vel ipsam dolores. + url: Aut assumenda fugiat quia eaque dolor porro. + required: + - program_type + - event_slug + Campaign: + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Facere qui omnis. + campaign_name: + type: string + description: Campaign name + example: Dolores natus a sint quod sunt. + etag: + type: string + description: ETag header value (mirrors version) + example: Ipsa non. + id: + type: string + description: Campaign UUID + example: Et itaque rem eos et deleniti dolores. + platform: + type: string + description: Channel + example: Enim vitae officia dolorem odio. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Beatae quia qui excepturi minima. + project_id: + type: string + description: Owning project + example: Facilis qui libero. + status: + type: string + description: Campaign status + example: Et nesciunt iure quis in ut mollitia. + version: + type: integer + description: Optimistic-concurrency version + example: 9203456138223090094 + format: int64 + example: + brief_id: Dolores sit. + campaign_name: Amet omnis. + etag: Sit cupiditate non. + id: Necessitatibus quibusdam. + platform: Exercitationem accusantium nihil. + platform_campaign_id: Quod alias ipsum voluptates pariatur magni. + project_id: Est accusantium laudantium nostrum. + status: At fugit dolor. + version: 6873369027351486557 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + Campaign2: + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Quaerat et eius culpa magni illum consequatur. + campaign_name: + type: string + description: Campaign name + example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. + id: + type: string + description: Campaign UUID + example: Minima iure quos enim occaecati beatae. + platform: + type: string + description: Channel + example: Soluta dolore vitae. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: In commodi et asperiores et. + project_id: + type: string + description: Owning project + example: Molestiae ad voluptatum ducimus accusantium et. + status: + type: string + description: Campaign status + example: Assumenda voluptatem aut debitis vitae. + version: + type: integer + description: Optimistic-concurrency version + example: 529135087014785401 + format: int64 + example: + brief_id: Et et itaque qui repudiandae magnam. + campaign_name: Quaerat molestias. + id: Eos eius. + platform: Ullam qui rerum numquam quo. + platform_campaign_id: A quia magnam culpa ipsam totam. + project_id: Odit rerum commodi ea et. + status: Sequi aut veniam ratione. + version: 4528974556497386277 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + Campaign3: + type: object + properties: + brief_id: + type: string + description: Parent brief + example: Quo et enim totam et minima dolorem. + campaign_name: + type: string + description: Campaign name + example: In praesentium cumque. + id: + type: string + description: Campaign UUID + example: Omnis ad voluptas esse voluptates. + platform: + type: string + description: Channel + example: Est tempora qui. + platform_campaign_id: + type: string + description: ID returned by the ad platform + example: Voluptas necessitatibus cumque non porro qui molestias. + project_id: + type: string + description: Owning project + example: Cumque mollitia. + status: + type: string + description: Campaign status + example: Pariatur odio molestias voluptatum. + version: + type: integer + description: Optimistic-concurrency version + example: 7642665711405677689 + format: int64 + example: + brief_id: Qui omnis nesciunt qui consequuntur. + campaign_name: Odit provident sed quo aperiam. + id: Perferendis possimus deserunt iure et. + platform: Fuga atque. + platform_campaign_id: Sequi culpa. + project_id: Ea quidem ducimus tempora ea molestias. + status: Aspernatur nihil et incidunt dolorem dolor sed. + version: 7197986407230546835 + required: + - id + - project_id + - brief_id + - platform + - campaign_name + - status + - version + CampaignCreateInput: type: object properties: - code: + config: + description: Per-platform campaign configuration + example: Voluptatum veniam molestiae. + platforms: + type: array + items: + type: string + example: google-ads + enum: + - google-ads + - linkedin-ads + - meta-ads + - reddit-ads + - twitter-ads + - microsoft-ads + - hubspot + description: Platforms to create campaigns on (binding selection) + example: + - meta-ads + - google-ads + - twitter-ads + example: + config: Aspernatur voluptatem nobis. + platforms: + - google-ads + - meta-ads + - microsoft-ads + required: + - platforms + CampaignUpdateInput: + type: object + properties: + campaign_name: type: string - description: HTTP status code - example: "400" - message: + description: Campaign name + example: Modi possimus consequatur. + config: + description: Campaign configuration snapshot + example: Voluptatibus aspernatur. + status: type: string - description: Error message - example: The request was invalid. + description: Campaign status + example: Eveniet esse officia explicabo dolor deserunt. example: - code: "400" - message: The request was invalid. + campaign_name: Accusamus nam cupiditate. + config: Earum minus autem omnis qui debitis eum. + status: Hic vel ut. required: - - code - - message + - campaign_name + - status ConflictError: type: object properties: @@ -3241,16 +4900,50 @@ components: message: type: string description: Human-readable detail - example: Rerum sunt eum et qui. + example: Veniam dolores quidem necessitatibus. ok: type: boolean description: Whether the credential authenticated against the provider - example: true + example: false example: - message: Ut quia harum. + message: Sit reiciendis et vel beatae molestiae. ok: false required: - ok + CreateBriefRequestBody: + type: object + properties: + brief: + $ref: '#/components/schemas/BriefInput' + example: + brief: + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + platforms: + - Molestiae saepe qui. + - Commodi voluptatem expedita. + program_type: membership + targeting: Facilis iste. + url: Quia ut atque. + required: + - brief + CreateCampaignsRequestBody: + type: object + properties: + input: + $ref: '#/components/schemas/CampaignCreateInput' + example: + input: + config: Est voluptatum enim earum et doloribus. + platforms: + - hubspot + - meta-ads + - reddit-ads + - twitter-ads + required: + - input CreateGoogleAdsRequestBody: type: object properties: @@ -3264,10 +4957,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - config - credentials @@ -3280,14 +4973,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Distinctio aut. required: - config - credentials @@ -3301,10 +4994,10 @@ components: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Tempora error rerum quae nihil. org_id: "208777" credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - config - credentials @@ -3318,12 +5011,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - config - credentials @@ -3336,14 +5029,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. credentials: - client_id: Voluptates odit consequatur quis. - client_secret: Est voluptatum enim earum et doloribus. - developer_token: Id ducimus eius et laboriosam omnis vitae. - refresh_token: Ea consequatur et ut. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. required: - config - credentials @@ -3357,11 +5050,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Provident quia distinctio. credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - config - credentials @@ -3375,13 +5068,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - config - credentials @@ -3391,11 +5084,11 @@ components: account_id: type: string description: Provider account identifier - example: Voluptatem sed quia excepturi. + example: Hic est quia pariatur odit ullam. etag: type: string description: ETag header value (mirrors version) - example: Voluptas ullam dolores rem. + example: Sed quo perferendis nemo ut quisquam. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3403,23 +5096,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Labore laudantium. + example: Explicabo repudiandae aut reiciendis recusandae molestias. label: type: string description: Optional friendly name - example: Eos voluptatibus. + example: Quod impedit accusamus incidunt minus veritatis enim. login_customer_id: type: string description: Manager account used for API access - example: Officia quidem non qui voluptates natus cum. + example: Repellendus quos magnam. project_id: type: string description: Owning project - example: Facilis reiciendis dignissimos consequatur iste qui minima. + example: Vel inventore aliquid aut non eligendi accusamus. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -3428,18 +5121,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1885605882290356239 + example: 2175885598856983154 format: int64 example: - account_id: Iusto velit quo voluptatibus modi reiciendis aliquam. - etag: Sunt recusandae similique. - has_credentials: false - id: Autem recusandae totam. - label: Odit necessitatibus veritatis amet ut rerum quidem. - login_customer_id: Iusto quia. - project_id: Rerum nisi. - status: error - version: 4043658872882310311 + account_id: Quae qui inventore dolorem deserunt. + etag: Rerum sint. + has_credentials: true + id: In id voluptatem nihil quaerat. + label: Hic rerum accusamus velit error. + login_customer_id: Magnam adipisci architecto deserunt. + project_id: Pariatur repellat vel. + status: active + version: 1017420418363680400 required: - id - project_id @@ -3454,7 +5147,7 @@ components: account_id: type: string description: Provider account identifier - example: Error ipsam maiores et maiores laudantium aut. + example: Autem maxime hic. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3462,19 +5155,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aliquid harum quis. + example: Harum voluptates sit est corporis. label: type: string description: Optional friendly name - example: Mollitia odio et dolor et consectetur. + example: Necessitatibus ut necessitatibus in. login_customer_id: type: string description: Manager account used for API access - example: Sint inventore iste iure ut. + example: Amet hic est. project_id: type: string description: Owning project - example: Rerum eaque eius est rerum. + example: Voluptatem repellat expedita inventore. status: type: string description: Connection status @@ -3487,17 +5180,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1681601347963415661 + example: 7828959688196597051 format: int64 example: - account_id: Ipsa et dolore. - has_credentials: true - id: Facilis suscipit. - label: Ad inventore voluptatum eligendi quasi. - login_customer_id: Placeat unde distinctio ducimus qui. - project_id: Porro voluptate. - status: inactive - version: 1820304569870851201 + account_id: Libero autem quod saepe ullam ipsum. + has_credentials: false + id: Quaerat occaecati rerum. + label: Aspernatur quos est magnam voluptates. + login_customer_id: Dolore sed. + project_id: Quae esse mollitia et dolorum. + status: error + version: 3252068377050447352 required: - id - project_id @@ -3511,31 +5204,31 @@ components: account_id: type: string description: Provider account identifier - example: Nihil corrupti repellat eius. + example: Est ipsam sint autem repudiandae asperiores et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Dignissimos non sed omnis officiis et. + example: Sunt accusantium totam quia. label: type: string description: Optional friendly name - example: Magni repudiandae. + example: Commodi qui. login_customer_id: type: string description: Manager account used for API access - example: Delectus quam et eos. + example: Nulla dolore quibusdam ducimus voluptas soluta. project_id: type: string description: Owning project - example: Laboriosam qui id enim. + example: Accusantium debitis adipisci qui iste explicabo. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -3544,17 +5237,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8134511901185890068 + example: 7019802315342385433 format: int64 example: - account_id: Illo vitae occaecati omnis. - has_credentials: false - id: Rem aut fuga. - label: Cupiditate ut illo dolor quaerat totam. - login_customer_id: Explicabo possimus consequatur. - project_id: Est dolor ut corporis. - status: active - version: 299946558233755685 + account_id: Ex est modi cupiditate. + has_credentials: true + id: Qui at fugiat est omnis inventore. + label: Consequatur quisquam explicabo. + login_customer_id: Consequatur molestias et et deleniti sint. + project_id: Ab totam laboriosam quos omnis deserunt. + status: error + version: 765646658236151796 required: - id - project_id @@ -3568,27 +5261,27 @@ components: account_id: type: string description: Provider account identifier - example: A necessitatibus molestiae. + example: Aliquam et asperiores quae voluptatem velit. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quos hic doloribus. + example: Odit eos. label: type: string description: Optional friendly name - example: Eum et sint corrupti eos. + example: Hic quam impedit placeat consequatur. login_customer_id: type: string description: Manager account used for API access - example: Dolorem qui explicabo consequuntur repellat non suscipit. + example: Enim voluptas numquam. project_id: type: string description: Owning project - example: Neque autem ex eos. + example: Quidem est. status: type: string description: Connection status @@ -3601,17 +5294,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7747776820204091337 + example: 5408757854107547795 format: int64 example: - account_id: Sit est dolores est et. - has_credentials: false - id: Sit tempore. - label: Ut quo iure. - login_customer_id: Velit atque laudantium ullam rerum. - project_id: Magnam ut similique ea minima magnam. - status: deleted - version: 7309957715046801903 + account_id: Officia dolorem. + has_credentials: true + id: Et iusto eius dolor magnam necessitatibus. + label: Tempora voluptatem rem fugit accusantium est necessitatibus. + login_customer_id: Aut soluta quae et est et corporis. + project_id: Mollitia earum aut qui sit rerum. + status: inactive + version: 758133864872776679 required: - id - project_id @@ -3646,25 +5339,25 @@ components: client_id: type: string description: OAuth client id - example: Ut aut. + example: Sed corrupti sit. client_secret: type: string description: OAuth client secret - example: Sit similique ut minima ut. + example: Labore quia esse consectetur tenetur eum. developer_token: type: string description: Google Ads developer token - example: Voluptatum officia quod error amet quia inventore. + example: Aut ut sit nisi architecto. refresh_token: type: string description: OAuth refresh token - example: Voluptas expedita omnis ex. + example: Natus vitae consequatur eos sit aut ut. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Non ut voluptas et accusamus natus id. - client_secret: Et officia sequi et quam. - developer_token: Vero quisquam. - refresh_token: Quia enim illo et eligendi. + client_id: Praesentium voluptate. + client_secret: Qui impedit temporibus eveniet eos omnis cumque. + developer_token: Ipsam ut sed natus et unde. + refresh_token: Rerum et recusandae possimus quis. required: - refresh_token - client_id @@ -3676,47 +5369,47 @@ components: account_id: type: string description: Provider account identifier - example: Delectus voluptatem iste nisi in. + example: Quia omnis commodi aspernatur pariatur nostrum. brand_kit: type: string description: Per-project brand kit selector - example: Nostrum corporis quasi magnam. + example: Quia omnis in qui. etag: type: string description: ETag header value (mirrors version) - example: Dolor occaecati earum iusto rerum sit cupiditate. + example: Perferendis est ipsum aut voluptas molestias. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Nam quia aperiam sunt est. + example: Dolor ea iusto eveniet velit sint odit. label: type: string description: Optional friendly name - example: Natus expedita aspernatur consequuntur quod ducimus molestias. + example: Quis quae quam enim. portal_id: type: string description: HubSpot portal/account ID - example: Iste qui rerum est sed sed similique. + example: Fuga voluptas ut vero autem consequuntur. project_id: type: string description: Owning project - example: Libero ut est rerum est occaecati et. + example: Ipsa eos nemo cupiditate et esse voluptate. sender_email: type: string description: Default sender address - example: Ea maiores quidem molestiae deleniti omnis. + example: Omnis a pariatur omnis. sender_name: type: string description: Default sender name - example: Expedita voluptatum commodi fuga ipsa. + example: Velit dolorem. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -3725,21 +5418,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3681253484013323435 + example: 1005353535355254376 format: int64 example: - account_id: Neque facilis est qui possimus eligendi. - brand_kit: Voluptas eius error autem est est distinctio. - etag: Et nobis voluptas dignissimos exercitationem illum. + account_id: Veniam molestias. + brand_kit: Hic magni. + etag: Commodi recusandae. has_credentials: false - id: Qui quidem exercitationem. - label: Sed numquam necessitatibus laudantium est ut. - portal_id: Quisquam ex est facilis qui ducimus. - project_id: Ipsa quo vel architecto quas eligendi impedit. - sender_email: Ut culpa excepturi. - sender_name: Officiis quia quisquam corrupti. - status: inactive - version: 8080806383587730069 + id: Nihil ut. + label: Minus voluptatem ab delectus porro. + portal_id: Cumque rerum. + project_id: Mollitia nulla. + sender_email: Modi esse voluptatibus. + sender_name: Fugit dolorum nulla quo veritatis id. + status: error + version: 3871826656092488452 required: - id - project_id @@ -3754,11 +5447,11 @@ components: account_id: type: string description: Provider account identifier - example: Magni omnis. + example: Itaque iure soluta autem. brand_kit: type: string description: Per-project brand kit selector - example: Perferendis culpa voluptatem nostrum eaque deleniti. + example: Atque qui dignissimos aut eaque eveniet. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3766,27 +5459,27 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Esse voluptate. + example: Est eum ut ut amet et molestiae. label: type: string description: Optional friendly name - example: Voluptatum et impedit quod. + example: Qui quae qui optio. portal_id: type: string description: HubSpot portal/account ID - example: Est repellat. + example: Odit numquam quia. project_id: type: string description: Owning project - example: Consectetur et culpa quaerat vel. + example: Nihil dolor exercitationem eum placeat dolores culpa. sender_email: type: string description: Default sender address - example: Esse sit id incidunt mollitia non sed. + example: Aut dolores. sender_name: type: string description: Default sender name - example: Minima est distinctio accusamus. + example: Voluptatem beatae quis dignissimos voluptatem et labore. status: type: string description: Connection status @@ -3799,20 +5492,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7333781901734102627 + example: 3577746410602694753 format: int64 example: - account_id: Aliquam animi. - brand_kit: Eos iusto fugit. - has_credentials: true - id: Quo nostrum quia. - label: Velit quis. - portal_id: Error dolor placeat et. - project_id: Ut nobis. - sender_email: Et esse fugiat aliquid aspernatur voluptatem in. - sender_name: Consequatur et dolorem. - status: error - version: 2888074467672743464 + account_id: Modi vel aut rerum. + brand_kit: Dolor eum et consequatur. + has_credentials: false + id: Ut unde dolore id. + label: Ad optio magnam sequi esse. + portal_id: Assumenda cum nemo esse nobis. + project_id: Necessitatibus fuga ducimus dolorem ut aspernatur. + sender_email: Aut dolorem ea veniam. + sender_name: Quae adipisci doloribus ullam. + status: deleted + version: 9002316743787506494 required: - id - project_id @@ -3826,43 +5519,43 @@ components: account_id: type: string description: Provider account identifier - example: Voluptas omnis quidem dolor ipsum voluptas sed. + example: At magnam saepe incidunt nisi est. brand_kit: type: string description: Per-project brand kit selector - example: Tempora dolor quis totam hic quibusdam eveniet. + example: Deleniti non in iure dolores et quis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Asperiores quidem. + example: Optio enim nisi doloremque rerum sed consequatur. label: type: string description: Optional friendly name - example: Nesciunt adipisci odit corrupti laudantium consequatur hic. + example: Dolores dignissimos perferendis tempore eum laboriosam iure. portal_id: type: string description: HubSpot portal/account ID - example: Dolorem necessitatibus neque consectetur occaecati earum. + example: Possimus non aliquid qui. project_id: type: string description: Owning project - example: Est nostrum atque. + example: Quia amet vero dolorum incidunt officia nihil. sender_email: type: string description: Default sender address - example: Ut sint non eum expedita non. + example: Neque sed alias. sender_name: type: string description: Default sender name - example: Sit voluptatem ad ab. + example: Id ducimus excepturi est et est. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -3871,20 +5564,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3980984224261423037 + example: 6047270410556243251 format: int64 example: - account_id: Quidem omnis totam eos non molestias. - brand_kit: Ducimus id sint eius aut. - has_credentials: false - id: Doloribus voluptas mollitia doloremque totam. - label: Quia doloremque commodi rerum. - portal_id: Recusandae illum accusamus debitis. - project_id: Veniam et ducimus quos amet. - sender_email: Praesentium sint laudantium error. - sender_name: Nihil iure officiis nemo quia. - status: inactive - version: 6150421422111226538 + account_id: Corrupti sint molestiae occaecati est. + brand_kit: Nesciunt sed magnam sed vero nulla. + has_credentials: true + id: Recusandae similique assumenda ut quia. + label: Nam eius nulla suscipit ullam. + portal_id: Ratione nobis ut occaecati tenetur minima veritatis. + project_id: Nesciunt minus natus non. + sender_email: Impedit laborum quaerat qui ut ut qui. + sender_name: Explicabo dolorem totam non. + status: error + version: 9169545032565251193 required: - id - project_id @@ -3898,43 +5591,43 @@ components: account_id: type: string description: Provider account identifier - example: Ab quo ullam ad. + example: Sunt labore voluptate. brand_kit: type: string description: Per-project brand kit selector - example: Aperiam facere voluptas quis nihil. + example: Beatae non et excepturi sit minus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Et quia ex et alias ea. + example: Vel et et iure tempora. label: type: string description: Optional friendly name - example: Laborum maiores est ea ducimus ipsum dolorem. + example: Eum ut. portal_id: type: string description: HubSpot portal/account ID - example: Placeat explicabo. + example: Possimus saepe quam culpa qui. project_id: type: string description: Owning project - example: Quas quis corporis. + example: Voluptatum perspiciatis autem. sender_email: type: string description: Default sender address - example: Rerum tenetur ut voluptatem quo. + example: Ipsa molestias. sender_name: type: string description: Default sender name - example: Iste aut cum voluptatem qui et. + example: Nam debitis hic qui consequatur laborum. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -3943,20 +5636,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3448886829732168782 + example: 2692133725202625638 format: int64 example: - account_id: Vero ut et neque soluta distinctio voluptas. - brand_kit: Voluptatem incidunt cum. - has_credentials: false - id: Rem asperiores eligendi vero. - label: Facere quas qui aut rerum. - portal_id: Fugit eum. - project_id: Voluptatem fugiat et. - sender_email: Necessitatibus voluptatem incidunt et totam esse rerum. - sender_name: Dolorem delectus. - status: active - version: 5717670313645740058 + account_id: Aspernatur ipsam consequatur qui illo totam fuga. + brand_kit: Libero quia quam harum molestiae cupiditate. + has_credentials: true + id: Et quisquam dicta. + label: Aut tempora dolorem neque assumenda sed. + portal_id: Consequatur sint. + project_id: Eaque enim est libero enim quo. + sender_email: Non illum expedita commodi in dolores nemo. + sender_name: Eaque autem impedit tenetur voluptatibus. + status: inactive + version: 6362542183217834869 required: - id - project_id @@ -3970,34 +5663,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Quis quis reprehenderit non quae omnis qui. + example: Qui et assumenda quas. brand_kit: type: string description: Per-project brand kit selector - example: Voluptatibus deserunt. + example: Qui sed voluptatibus quam quia. label: type: string description: Optional friendly name - example: At odio incidunt distinctio sint qui. + example: Praesentium libero. portal_id: type: string description: HubSpot portal/account ID - example: Cumque saepe sint quidem odio ab. + example: Quisquam animi. sender_email: type: string description: Default sender address - example: Aut est. + example: Delectus blanditiis magnam sed iure amet. sender_name: type: string description: Default sender name - example: Error pariatur consequatur esse. + example: Repudiandae facilis blanditiis libero nam. example: - account_id: Et eligendi et numquam dolorum consequatur in. - brand_kit: Non sequi error assumenda quam deleniti et. - label: Necessitatibus eos. - portal_id: Et eum est molestiae necessitatibus magni. - sender_email: Molestiae praesentium perferendis deserunt ipsum dolorum. - sender_name: Error nulla fuga fugit repellendus et accusamus. + account_id: Molestiae omnis doloremque. + brand_kit: Aliquid explicabo eaque ab aut voluptas. + label: Deserunt et quidem sapiente. + portal_id: Perspiciatis modi dicta quae sed ut. + sender_email: Et atque. + sender_name: Impedit velit omnis incidunt. required: - account_id HubspotCredentials: @@ -4006,10 +5699,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Dolor officia eligendi. + example: Nulla eos. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Provident dicta temporibus debitis. + private_app_token: Recusandae totam soluta. required: - private_app_token InternalServerError: @@ -4029,41 +5722,106 @@ components: required: - code - message + JobCreateResponse: + type: object + properties: + job_id: + type: string + description: Poll GET /projects/{projectId}/jobs/{jobId} + example: Odit odio praesentium. + platforms: + type: array + items: + type: string + example: Sint voluptatibus quam dicta voluptate consequuntur. + description: Platforms this job will create on + example: + - Qui temporibus quis iste eaque. + - Debitis nam. + - Delectus ex aut quia. + status: + type: string + description: Initial status (always 'queued' on create) + example: queued + enum: + - queued + example: + job_id: Consequatur dolore dolor corporis consequatur voluptatem voluptates. + platforms: + - Repudiandae sit qui aut aut. + - Magnam quisquam et consequuntur ut sunt. + - Et velit fuga quos est. + status: queued + required: + - job_id + - status + JobPollResponse: + type: object + properties: + error: + type: string + description: Terminal error, if any + example: Fugiat aut dicta libero. + job_id: + type: string + description: Job UUID + example: Officiis beatae sed aut. + result: + description: Per-platform results, written once when the job reaches a terminal state + example: Est quia qui fugiat est itaque. + status: + type: string + description: Job status + example: succeeded + enum: + - queued + - running + - succeeded + - partial + - failed + example: + error: Beatae harum similique corporis id eum. + job_id: Culpa est possimus dolores dignissimos. + result: Laudantium error eum et aut. + status: partial + required: + - job_id + - status LinkedinAdsConnection: type: object properties: account_id: type: string description: Provider account identifier - example: Cumque molestiae eos rem aut. + example: Omnis corrupti facere eum aliquid est repellat. etag: type: string description: ETag header value (mirrors version) - example: Non adipisci rerum. + example: Incidunt mollitia non sed hic. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Adipisci quaerat est nobis. + example: Ex ipsa nihil esse voluptate in consectetur. label: type: string description: Optional friendly name - example: Et veritatis quisquam sed ratione et. + example: Sed voluptatum et impedit quod rem. org_id: type: string description: LinkedIn organization URN id - example: Placeat ea odio ea eos. + example: Est distinctio accusamus a perferendis. project_id: type: string description: Owning project - example: Fugit non fuga rem adipisci. + example: Culpa quaerat. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -4072,18 +5830,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7868855978793741277 + example: 6865823349289112261 format: int64 example: - account_id: Nobis itaque est enim magnam pariatur. - etag: Praesentium ipsam officiis cum ipsum recusandae. + account_id: Velit quis. + etag: Vel architecto quae error dolor placeat. has_credentials: true - id: Ipsum et delectus dolorum eveniet. - label: Maxime maxime porro enim. - org_id: Adipisci ullam pariatur ex voluptas. - project_id: Alias ea quibusdam. - status: active - version: 5465298508990820984 + id: Voluptatem nostrum. + label: Ut nobis. + org_id: Minus et. + project_id: Deleniti voluptas quo nostrum quia. + status: inactive + version: 7197135224651925465 required: - id - project_id @@ -4098,7 +5856,7 @@ components: account_id: type: string description: Provider account identifier - example: Dolorum deserunt. + example: Ex dolor. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4106,19 +5864,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Rerum adipisci. + example: Voluptate est reprehenderit consectetur accusamus eaque inventore. label: type: string description: Optional friendly name - example: Non laudantium sunt minima repudiandae illo harum. + example: Officia dolores et reprehenderit. org_id: type: string description: LinkedIn organization URN id - example: Eos nihil ipsam ex odio totam. + example: Vitae qui explicabo tempora accusantium aut. project_id: type: string description: Owning project - example: Enim accusantium labore esse numquam. + example: Aut explicabo. status: type: string description: Connection status @@ -4131,17 +5889,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2440284349670140496 + example: 2969272646168040903 format: int64 example: - account_id: Omnis consequatur. + account_id: Autem eaque eaque dicta ut magni. has_credentials: true - id: Deleniti placeat fuga aut saepe. - label: Ut quis ut accusantium. - org_id: Aut autem sint minus voluptatum. - project_id: Reiciendis pariatur repellat. - status: error - version: 4719926195195381744 + id: In vel. + label: Et vel dolorum aut inventore consequatur. + org_id: Molestiae qui nobis culpa. + project_id: Nobis qui sunt laboriosam ipsa. + status: inactive + version: 32502071618905206 required: - id - project_id @@ -4155,7 +5913,7 @@ components: account_id: type: string description: Provider account identifier - example: Quo veritatis quis delectus est. + example: Dolores dolores. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4163,19 +5921,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Tempore quae. + example: Temporibus dolorem cumque quis accusantium quia enim. label: type: string description: Optional friendly name - example: Dolores tenetur ut illum. + example: Ipsum et et laudantium. org_id: type: string description: LinkedIn organization URN id - example: Expedita accusantium vel voluptate. + example: Sit est atque qui quaerat qui vitae. project_id: type: string description: Owning project - example: Consequatur dolore unde illum. + example: Asperiores velit aut alias quod minima. status: type: string description: Connection status @@ -4188,17 +5946,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1676862666948614995 + example: 1323696837483058057 format: int64 example: - account_id: Magni consequatur dignissimos itaque quia. + account_id: Consequatur aut vero. has_credentials: true - id: Repellat assumenda nesciunt distinctio eaque aliquam. - label: Et reprehenderit dignissimos. - org_id: Et voluptatem deserunt consequuntur omnis sed dolore. - project_id: Veniam consectetur deserunt in hic dolorum facere. - status: inactive - version: 7072791787806691868 + id: Optio non. + label: Ipsam eligendi est dolore. + org_id: Est saepe doloribus unde id. + project_id: Optio in ratione accusamus quasi. + status: active + version: 4544790407326456577 required: - id - project_id @@ -4212,7 +5970,7 @@ components: account_id: type: string description: Provider account identifier - example: Assumenda dignissimos beatae vitae aut ea dolor. + example: Voluptas est consequatur rerum neque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4220,19 +5978,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatibus quod necessitatibus non iste ad rem. + example: Perspiciatis perferendis adipisci. label: type: string description: Optional friendly name - example: Harum corporis deleniti doloribus. + example: Ea nam aut aut dolores. org_id: type: string description: LinkedIn organization URN id - example: Sit architecto ut unde. + example: Optio quia similique vero est impedit quo. project_id: type: string description: Owning project - example: Sunt qui cupiditate ullam ab suscipit et. + example: Sapiente sit totam ut et ullam. status: type: string description: Connection status @@ -4245,17 +6003,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6055913800302101668 + example: 5284871868291627638 format: int64 example: - account_id: Praesentium tenetur quas at ut necessitatibus dolor. + account_id: Eos deserunt quia expedita sed velit distinctio. has_credentials: false - id: Sapiente possimus. - label: Eaque voluptate reprehenderit sed voluptatem sed illo. - org_id: Nihil id unde veritatis officiis aut fugiat. - project_id: Voluptates atque. - status: error - version: 446959638978499075 + id: Nihil at. + label: Sit soluta quia qui. + org_id: Natus veniam amet. + project_id: Libero officia et quia. + status: inactive + version: 1537409143960626181 required: - id - project_id @@ -4273,14 +6031,14 @@ components: label: type: string description: Optional friendly name - example: Cumque totam nulla aut reprehenderit. + example: Sint est sed. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Illum rerum error incidunt. + label: Voluptas dolorem necessitatibus illum. org_id: "208777" required: - account_id @@ -4291,10 +6049,10 @@ components: access_token: type: string description: OAuth access token - example: Aspernatur possimus. + example: Ducimus distinctio deserunt quia magni. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Repellendus quo quidem. + access_token: Nisi est. required: - access_token MetaAdsConnection: @@ -4303,15 +6061,15 @@ components: account_id: type: string description: Provider account identifier - example: Iusto ad animi eos doloribus autem corrupti. + example: Quia doloremque commodi rerum. app_id: type: string description: Meta app ID - example: Laborum eum et quidem. + example: Error sit nihil iure officiis nemo. etag: type: string description: ETag header value (mirrors version) - example: Suscipit quas sunt eos nulla. + example: Eos non molestias laudantium quia iusto maxime. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4319,23 +6077,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Facere exercitationem et exercitationem. + example: Totam hic quibusdam eveniet. label: type: string description: Optional friendly name - example: Rerum quidem accusamus et provident provident omnis. + example: Veniam et ducimus quos amet. page_id: type: string description: Facebook page ID - example: Perferendis qui maiores aut reiciendis. + example: Illum accusamus debitis explicabo praesentium sint. project_id: type: string description: Owning project - example: Eaque deleniti. + example: Doloribus voluptas mollitia doloremque totam. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -4344,19 +6102,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1750381436080099913 + example: 4075428576386055706 format: int64 example: - account_id: Ad non. - app_id: Est voluptas sequi. - etag: Possimus consequatur est unde. + account_id: Corporis dolorem laborum maiores est ea ducimus. + app_id: Tenetur ut. + etag: Quo ullam ad iusto quos. has_credentials: false - id: Quasi quis ab deserunt quia magnam. - label: Quod modi voluptas dolores commodi dicta. - page_id: Et laudantium. - project_id: Minus et aut consequatur non cumque. - status: active - version: 3589524561643771783 + id: Molestias ducimus id. + label: Ex et alias ea asperiores quas. + page_id: Est placeat explicabo aliquid. + project_id: Eius aut quo et. + status: inactive + version: 7062935514847310019 required: - id - project_id @@ -4371,31 +6129,31 @@ components: account_id: type: string description: Provider account identifier - example: Nostrum tempore. + example: Reiciendis excepturi. app_id: type: string description: Meta app ID - example: Rerum explicabo. + example: Iure aut tenetur ipsum ea ad ducimus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut commodi et voluptas tenetur nobis facere. + example: Quisquam voluptatem fuga quia qui. label: type: string description: Optional friendly name - example: Blanditiis mollitia dolores illo nostrum magnam. + example: Rerum vel molestiae id quae vero aut. page_id: type: string description: Facebook page ID - example: Deserunt repellendus corrupti itaque quo sit. + example: Et et. project_id: type: string description: Owning project - example: Quo corporis recusandae dicta quibusdam. + example: Aut provident suscipit incidunt. status: type: string description: Connection status @@ -4408,18 +6166,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6534648276901202778 + example: 8554261525276101559 format: int64 example: - account_id: Perspiciatis porro. - app_id: Deserunt quod. - has_credentials: false - id: Eum et ipsum expedita reprehenderit eos. - label: Aperiam et nihil. - page_id: Non rem error. - project_id: Dolorum ut architecto deleniti nostrum. - status: deleted - version: 2783740423386270532 + account_id: Necessitatibus non eum ipsum eveniet quam. + app_id: Accusamus eos neque velit. + has_credentials: true + id: Aut temporibus. + label: Eligendi non. + page_id: Voluptatum magnam. + project_id: Laborum ipsum accusantium voluptatem libero. + status: error + version: 8043832967599792035 required: - id - project_id @@ -4433,11 +6191,11 @@ components: account_id: type: string description: Provider account identifier - example: Voluptate necessitatibus enim et et itaque. + example: Odit illo ut ut. app_id: type: string description: Meta app ID - example: Nihil aut rerum est vel. + example: Perspiciatis debitis atque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4445,23 +6203,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aperiam quos perferendis nisi blanditiis eveniet. + example: In iure molestiae quisquam. label: type: string description: Optional friendly name - example: Nobis omnis. + example: Numquam voluptatem maiores ipsam dicta cum odit. page_id: type: string description: Facebook page ID - example: Rerum quis et modi optio labore omnis. + example: Assumenda alias. project_id: type: string description: Owning project - example: Ea enim ut corporis dolorum consequatur eius. + example: Ipsam aperiam et totam in. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -4470,18 +6228,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 9014435567821091487 + example: 8618836083038100083 format: int64 example: - account_id: Dolor aut assumenda fugiat. - app_id: Aut quas suscipit eos. + account_id: Aliquam est autem vel eos minima. + app_id: Ea voluptatum pariatur non. has_credentials: true - id: Rem ab corporis. - label: Porro et. - page_id: Inventore alias error aut maxime dicta. - project_id: Non dolorem. - status: deleted - version: 5862072609653585869 + id: Unde facilis. + label: Voluptatem optio. + page_id: Maiores consequatur. + project_id: Ut quas officiis mollitia ducimus sunt repellendus. + status: inactive + version: 2884566362507518761 required: - id - project_id @@ -4495,35 +6253,35 @@ components: account_id: type: string description: Provider account identifier - example: Dolor et corrupti voluptas neque vitae. + example: Quisquam recusandae nesciunt et. app_id: type: string description: Meta app ID - example: Rerum numquam amet deserunt rem quia. + example: Perferendis et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Ipsa rerum velit et impedit. + example: Quo ullam. label: type: string description: Optional friendly name - example: Velit quam omnis. + example: Facilis dolor consectetur sed. page_id: type: string description: Facebook page ID - example: Mollitia est assumenda aut harum. + example: Ut ea sequi quos qui quo et. project_id: type: string description: Owning project - example: Quaerat labore dolor. + example: Occaecati hic ut magnam facilis. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -4532,18 +6290,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1514261665871912761 + example: 8315950268383046552 format: int64 example: - account_id: Deleniti deserunt labore. - app_id: Molestiae deserunt voluptates. + account_id: Non consequuntur qui qui impedit assumenda voluptas. + app_id: Et nemo dicta illum omnis. has_credentials: true - id: Ipsam dolores et et qui ut. - label: Velit esse voluptate eum laboriosam distinctio. - page_id: Adipisci quo. - project_id: Numquam omnis ullam facilis ab sapiente. + id: Beatae facilis dolor quod nihil quia. + label: Recusandae consequatur nulla. + page_id: Vel ut. + project_id: Sed voluptas fuga officia nulla. status: error - version: 3954861542185537606 + version: 8342264622249142271 required: - id - project_id @@ -4561,20 +6319,20 @@ components: app_id: type: string description: Meta app ID - example: Eius sed qui deserunt perspiciatis nihil. + example: Occaecati id ea sunt dolorem necessitatibus neque. label: type: string description: Optional friendly name - example: Et eveniet. + example: Consequatur hic voluptatem. page_id: type: string description: Facebook page ID - example: Corporis ut non. + example: Omnis quidem dolor ipsum voluptas. example: account_id: act_193556282970417 - app_id: Aut hic. - label: Mollitia tempora minima voluptas. - page_id: Facere aut facilis porro dolor ipsa. + app_id: Ab quasi tempora dolor. + label: Occaecati earum unde ut. + page_id: Non eum expedita non voluptas sit voluptatem. required: - account_id MetaAdsCredentials: @@ -4583,15 +6341,15 @@ components: access_token: type: string description: Meta access token - example: Aperiam voluptates. + example: Fugiat aliquid aspernatur voluptatem in cupiditate. app_secret: type: string description: Meta app secret - example: Vero ducimus. + example: Et dolorem quod. description: Meta Ads credential. Write-only; never returned. example: - access_token: Recusandae aut perferendis. - app_secret: Est eaque ipsam harum nisi nobis. + access_token: Iusto fugit non asperiores quidem natus. + app_secret: Nostrum atque illum nesciunt adipisci odit corrupti. required: - access_token - app_secret @@ -4601,35 +6359,35 @@ components: account_id: type: string description: Provider account identifier - example: Et nulla officia vitae. + example: Aut omnis itaque ut vero voluptatibus. customer_id: type: string description: Microsoft Advertising customer ID - example: Et sunt quis dicta voluptate aut in. + example: Sequi non et. etag: type: string description: ETag header value (mirrors version) - example: Ut asperiores quo aut. + example: Voluptatibus voluptatem vero dolorem qui. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Perspiciatis id. + example: Non eos. label: type: string description: Optional friendly name - example: Nihil nihil quae porro qui rem autem. + example: Enim voluptatem inventore quasi. project_id: type: string description: Owning project - example: Ut non error aut et fuga. + example: Vel aut aliquam rerum et quidem. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -4638,18 +6396,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2431299518347433245 + example: 6330819027913820088 format: int64 example: - account_id: Id temporibus et provident maiores neque quis. - customer_id: Sunt assumenda. - etag: Eligendi ut. + account_id: Aut est voluptatibus placeat. + customer_id: Deleniti placeat rerum. + etag: Expedita et velit accusamus. has_credentials: false - id: Provident nobis soluta culpa vitae. - label: Laudantium amet veritatis rerum itaque consequatur laboriosam. - project_id: Excepturi deleniti voluptas aperiam vel. - status: error - version: 4162198444433663334 + id: Vero vel. + label: Necessitatibus quaerat minima a voluptatem ipsa et. + project_id: Quibusdam repellendus qui numquam. + status: inactive + version: 7624219269087359761 required: - id - project_id @@ -4664,27 +6422,27 @@ components: account_id: type: string description: Provider account identifier - example: Earum minus autem omnis qui debitis eum. + example: Quo veritatis nisi velit distinctio animi. customer_id: type: string description: Microsoft Advertising customer ID - example: Quidem necessitatibus voluptatem consequatur sit. + example: Voluptas tenetur esse. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Esse officia explicabo dolor deserunt aspernatur. + example: Architecto molestiae cum. label: type: string description: Optional friendly name - example: Cupiditate mollitia hic vel ut. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. project_id: type: string description: Owning project - example: Aspernatur illo accusamus. + example: Perspiciatis consequatur beatae sunt officiis sequi qui. status: type: string description: Connection status @@ -4697,17 +6455,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3699306814781450025 + example: 8298836967576578537 format: int64 example: - account_id: Sed corrupti sit. - customer_id: Consectetur tenetur eum. - has_credentials: true - id: Et vel beatae molestiae fuga. - label: Aut ut. - project_id: Vitae consequatur eos. - status: active - version: 436879921687162189 + account_id: Eveniet aliquid quia aut impedit a veritatis. + customer_id: Sunt debitis enim voluptas qui voluptas veniam. + has_credentials: false + id: Assumenda sed minima nihil. + label: Dolor molestiae quia voluptatem deserunt libero. + project_id: Quaerat ipsa voluptatem. + status: error + version: 5039507493953656552 required: - id - project_id @@ -4721,11 +6479,11 @@ components: account_id: type: string description: Provider account identifier - example: Qui impedit temporibus eveniet eos omnis cumque. + example: Dolor cumque dolores. customer_id: type: string description: Microsoft Advertising customer ID - example: Natus et unde. + example: Neque aspernatur culpa sed non. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4733,15 +6491,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aut ut sit nisi architecto. + example: Voluptas maxime non illo ab in voluptatem. label: type: string description: Optional friendly name - example: Praesentium voluptate. + example: Ad et in voluptatem et perspiciatis. project_id: type: string description: Owning project - example: Rerum et recusandae possimus quis. + example: Est magnam molestiae soluta. status: type: string description: Connection status @@ -4754,17 +6512,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1288874109548033633 + example: 889781010736384145 format: int64 example: - account_id: Hic est quia pariatur odit ullam. - customer_id: Sed quo perferendis nemo ut quisquam. - has_credentials: true - id: Explicabo repudiandae aut reiciendis recusandae molestias. - label: Quod impedit accusamus incidunt minus veritatis enim. - project_id: Vel inventore aliquid aut non eligendi accusamus. - status: error - version: 2175885598856983154 + account_id: Deleniti reprehenderit saepe quas commodi qui qui. + customer_id: Excepturi reiciendis numquam consequatur amet dolorem. + has_credentials: false + id: Ad cumque voluptas. + label: Non minima possimus totam occaecati enim eaque. + project_id: Facere rerum voluptatem saepe eligendi. + status: deleted + version: 2150669320812381725 required: - id - project_id @@ -4778,31 +6536,31 @@ components: account_id: type: string description: Provider account identifier - example: Hic rerum accusamus velit error. + example: Soluta et quam. customer_id: type: string description: Microsoft Advertising customer ID - example: Dolorem deserunt quasi in aut nam rerum. + example: Voluptate est enim aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Repellendus quos magnam. + example: Eaque ut. label: type: string description: Optional friendly name - example: Pariatur repellat vel. + example: Iste et alias quis magni ad. project_id: type: string description: Owning project - example: In id voluptatem nihil quaerat. + example: Et aspernatur delectus rem sit. status: type: string description: Connection status - example: deleted + example: active enum: - active - inactive @@ -4811,17 +6569,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8411140861799189617 + example: 2822393091615672408 format: int64 example: - account_id: Sint est sed. - customer_id: Illum quisquam ex ipsa. + account_id: Velit atque nam voluptatem in eveniet. + customer_id: Totam ea ut voluptatem velit eos aut. has_credentials: true - id: Distinctio magnam. - label: Quia magni aut nisi est. - project_id: Architecto deserunt vero ducimus distinctio. + id: Sequi non consequatur est. + label: Occaecati repellendus autem ullam odio quis sed. + project_id: Beatae magni est officiis enim. status: active - version: 6452524533918462281 + version: 7510768710450776293 required: - id - project_id @@ -4835,19 +6593,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: Ex quo praesentium voluptas. + example: In autem neque nihil laborum omnis. customer_id: type: string description: Microsoft Advertising customer ID - example: Est officia et. + example: Voluptatem possimus veniam dignissimos consequatur. label: type: string description: Optional friendly name - example: Voluptatem mollitia omnis doloribus qui consequatur et. + example: Neque maiores quo aliquam in rem. example: - account_id: Eos et architecto voluptas. - customer_id: Vel natus provident. - label: Numquam accusamus. + account_id: Est porro eos ipsa quia. + customer_id: Quo repudiandae. + label: Delectus enim quas id porro. required: - account_id MicrosoftAdsCredentials: @@ -4856,25 +6614,25 @@ components: client_id: type: string description: OAuth client id - example: Architecto itaque doloribus voluptatem consequatur quis fugiat. + example: Doloremque dicta. client_secret: type: string description: OAuth client secret - example: Recusandae qui culpa. + example: Ratione impedit recusandae dolor consequatur. developer_token: type: string description: Microsoft Advertising developer token - example: Sed rerum dicta distinctio voluptas ut ut. + example: Voluptatem beatae repellat veritatis perferendis veritatis. refresh_token: type: string description: OAuth refresh token - example: Accusamus et atque enim. + example: Vel temporibus sunt nulla esse sed. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Fuga nostrum velit hic excepturi omnis. - client_secret: Distinctio quos ut unde et atque. - developer_token: In recusandae maiores et voluptatem. - refresh_token: Odio labore pariatur nobis. + client_id: Facere sed ea qui pariatur adipisci. + client_secret: Enim esse dolores. + developer_token: Est perferendis eos et cumque nulla. + refresh_token: Iste exercitationem voluptate quia esse nihil sed. required: - client_id - client_secret @@ -4937,31 +6695,31 @@ components: account_id: type: string description: Provider account identifier - example: Dolores assumenda accusantium mollitia fugiat dolore similique. + example: Occaecati quaerat eum quia a excepturi. etag: type: string description: ETag header value (mirrors version) - example: Molestiae quos cum. + example: Eos culpa quaerat culpa inventore aut molestiae. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Cum molestias fuga voluptatibus quis. + example: Necessitatibus voluptatem incidunt et totam esse rerum. label: type: string description: Optional friendly name - example: Nobis aliquid rerum consequatur officiis velit. + example: Voluptatem incidunt cum. project_id: type: string description: Owning project - example: Aut rerum ut blanditiis dolor. + example: Dolorem delectus. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -4970,17 +6728,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4135215091203906464 + example: 4898302691270586418 format: int64 example: - account_id: Natus placeat esse est in deserunt aliquid. - etag: Sed et odio sunt totam incidunt. - has_credentials: false - id: Architecto doloremque aperiam doloribus aut qui. - label: Distinctio ipsum ab. - project_id: Placeat cumque iure veritatis cumque nisi. - status: error - version: 6763438623066254599 + account_id: Rerum eveniet nam sunt. + etag: Voluptatem quia ab recusandae praesentium nisi. + has_credentials: true + id: Hic quos inventore. + label: Ad dolorem et. + project_id: Id vel iusto optio repellendus. + status: deleted + version: 4971099885577230620 required: - id - project_id @@ -4995,27 +6753,27 @@ components: account_id: type: string description: Provider account identifier - example: Assumenda harum eos eveniet ut et laboriosam. + example: Laudantium eligendi ut et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Culpa saepe necessitatibus. + example: Dolor et aliquam deleniti. label: type: string description: Optional friendly name - example: Voluptas aperiam. + example: Est dolor velit et voluptatem mollitia placeat. project_id: type: string description: Owning project - example: Dolores enim. + example: Nemo cum delectus laudantium. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5024,16 +6782,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6456486653687697700 + example: 7301828793581898625 format: int64 example: - account_id: Cumque quae. - has_credentials: false - id: Qui eaque ut laudantium. - label: Laborum aspernatur voluptate itaque fugit. - project_id: Ratione id. + account_id: Necessitatibus quia facere vitae aperiam velit corrupti. + has_credentials: true + id: Iste iusto reiciendis ipsa ut saepe beatae. + label: Voluptas doloremque nobis consectetur voluptas voluptas. + project_id: Temporibus in qui provident corrupti ut similique. status: deleted - version: 5238309974693293664 + version: 8091372322961997197 required: - id - project_id @@ -5047,27 +6805,27 @@ components: account_id: type: string description: Provider account identifier - example: Dolore velit pariatur non assumenda perspiciatis dolor. + example: Repellendus dolore expedita commodi sit omnis et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Odit consequatur. + example: Deserunt minima quis impedit. label: type: string description: Optional friendly name - example: Ut ullam. + example: Aut et ut dolorem tempore. project_id: type: string description: Owning project - example: Vero soluta omnis eius. + example: In voluptate debitis earum voluptates repellat. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5076,16 +6834,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3837313741085790100 + example: 4154692188906674111 format: int64 example: - account_id: Animi molestiae aut fugit alias nisi qui. + account_id: Pariatur esse. has_credentials: false - id: Molestiae ea ullam minima voluptatem vel. - label: Beatae quia minus vero at ut. - project_id: Dolore repudiandae necessitatibus dolorem. - status: inactive - version: 8129543513726361746 + id: Quo porro. + label: Molestias reprehenderit. + project_id: Accusantium est. + status: error + version: 1321629448594002998 required: - id - project_id @@ -5099,27 +6857,27 @@ components: account_id: type: string description: Provider account identifier - example: Autem iste ea in ipsa. + example: Facere ut voluptatem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Deserunt dolorum nihil. + example: Ab ea pariatur deserunt. label: type: string description: Optional friendly name - example: Odio odio sed minus quia quia ea. + example: Repellat sequi sed qui dolor. project_id: type: string description: Owning project - example: Doloremque explicabo ut. + example: Rem molestiae assumenda ea incidunt. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5128,16 +6886,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4150548058954901958 + example: 8862716294143227386 format: int64 example: - account_id: Quibusdam consequuntur dolorem fugiat. - has_credentials: true - id: Perspiciatis magni tempore sunt itaque. - label: Sit beatae ut modi voluptatum veniam. - project_id: Ut ex. - status: error - version: 5881477690177318757 + account_id: Assumenda quam possimus aut ipsa. + has_credentials: false + id: Rerum maiores in alias est laboriosam saepe. + label: Eaque magni omnis dolorem. + project_id: Perferendis placeat earum occaecati et. + status: inactive + version: 7088601354925466349 required: - id - project_id @@ -5155,10 +6913,10 @@ components: label: type: string description: Optional friendly name - example: Qui molestias. + example: Et neque soluta. example: account_id: t2_gv9wtbfa - label: Molestiae minus dolor accusantium. + label: Voluptas aliquid libero sapiente aspernatur fugit eum. required: - account_id RedditAdsCredentials: @@ -5167,20 +6925,20 @@ components: client_id: type: string description: OAuth client id - example: Numquam quidem qui. + example: Quo vel iste aut cum voluptatem. client_secret: type: string description: OAuth client secret - example: Laboriosam possimus dolor facere velit dolores. + example: Et et aperiam. refresh_token: type: string description: OAuth refresh token - example: Alias ad voluptatem accusantium tempore impedit. + example: Voluptas quis nihil tempora rem asperiores. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Et expedita itaque quos. - client_secret: Quos accusantium fugit. - refresh_token: Excepturi saepe sit vel perspiciatis neque. + client_id: Vero natus voluptatem. + client_secret: Et minima. + refresh_token: Quas qui aut rerum illum vero. required: - client_id - client_secret @@ -5209,10 +6967,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Recusandae nam autem dicta perspiciatis quod. - client_secret: Quo voluptatem quas culpa omnis consequuntur iste. - developer_token: Id magnam id nihil fugiat. - refresh_token: Inventore quisquam laudantium velit. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - credentials SetCredentialHubspotRequestBody: @@ -5222,7 +6980,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Numquam ut nesciunt voluptas. + private_app_token: Distinctio aut. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -5232,7 +6990,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Amet necessitatibus corrupti quaerat molestiae maiores. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - credentials SetCredentialMetaAdsRequestBody: @@ -5242,8 +7000,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Soluta quas voluptas minus possimus quos praesentium. - app_secret: Repudiandae consequatur fuga dolores. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - credentials SetCredentialRedditAdsRequestBody: @@ -5253,9 +7011,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Fugit qui tempora commodi reiciendis sit alias. - client_secret: Ea enim quidem odio et sequi consequatur. - refresh_token: Provident itaque. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -5265,10 +7023,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Ipsum quia ad a. - access_token_secret: Veritatis omnis excepturi. - consumer_key: Cumque libero. - consumer_secret: Id incidunt qui et ratione sit quaerat. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - credentials TwitterAdsConnection: @@ -5277,15 +7035,15 @@ components: account_id: type: string description: Provider account identifier - example: Quisquam incidunt qui. + example: Dicta qui. etag: type: string description: ETag header value (mirrors version) - example: Quia exercitationem consequatur velit. + example: Consequatur voluptate dolorum id ut. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Quia culpa iste id sit incidunt. + example: Id adipisci. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5293,15 +7051,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Mollitia atque atque dolores accusantium non dolor. + example: Vel necessitatibus vel voluptates tenetur veniam repellat. label: type: string description: Optional friendly name - example: Nobis labore dicta. + example: Aut repudiandae voluptatibus odit autem. project_id: type: string description: Owning project - example: Enim qui officia id necessitatibus mollitia soluta. + example: Minima vitae illo cumque optio impedit. status: type: string description: Connection status @@ -5314,18 +7072,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2620236536617279883 + example: 6671950557225375758 format: int64 example: - account_id: Accusantium enim temporibus dolor ipsam. - etag: Aut ducimus dolores. - funding_instrument_id: Dolorum minus voluptatem. - has_credentials: false - id: Officiis est. - label: Tempore nemo illum ut maiores. - project_id: Qui quisquam voluptatibus sint quia. + account_id: Vitae nemo sint et consequatur vel quisquam. + etag: Sint possimus. + funding_instrument_id: Dolorem neque hic voluptatem ad similique sunt. + has_credentials: true + id: Aut rerum non assumenda molestiae modi. + label: Voluptatibus assumenda mollitia molestias eos. + project_id: Vitae molestiae itaque autem. status: error - version: 6092912427529457622 + version: 3850958169697422368 required: - id - project_id @@ -5340,11 +7098,11 @@ components: account_id: type: string description: Provider account identifier - example: Delectus ex aut quia. + example: Ut itaque voluptatem unde adipisci aut. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Corporis consequatur voluptatem voluptates. + example: Aut praesentium eos ex laborum et doloremque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5352,15 +7110,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Soluta odit odio praesentium perferendis eveniet sint. + example: Numquam numquam et natus possimus. label: type: string description: Optional friendly name - example: Temporibus quis iste eaque ratione debitis nam. + example: Repudiandae eum. project_id: type: string description: Owning project - example: Quam dicta voluptate consequuntur voluptatem est. + example: Provident molestiae quia neque atque delectus. status: type: string description: Connection status @@ -5373,17 +7131,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 629084196159484927 + example: 9192676630235860462 format: int64 example: - account_id: Velit fuga quos. - funding_instrument_id: Sed aut quia nihil est quia. + account_id: Quas quia quam voluptate nam iste. + funding_instrument_id: Temporibus aut numquam. has_credentials: true - id: Reprehenderit provident repudiandae sit. - label: Ut sunt aliquam. - project_id: Aut aut eos magnam quisquam et. + id: Non laudantium quis ab non sunt. + label: Beatae totam. + project_id: Quo est. status: active - version: 2879571083312014203 + version: 1807846651493588341 required: - id - project_id @@ -5397,31 +7155,31 @@ components: account_id: type: string description: Provider account identifier - example: Velit laudantium error. + example: Sed dolorum cupiditate quia qui dicta. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Beatae harum similique corporis id eum. + example: Quae totam et voluptates atque consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Fugiat est itaque. + example: Accusantium ut vitae dolor soluta beatae. label: type: string description: Optional friendly name - example: Culpa est possimus dolores dignissimos. + example: Molestiae veniam exercitationem blanditiis ratione non. project_id: type: string description: Owning project - example: Fugiat aut dicta libero. + example: Enim velit voluptates officiis tempora possimus rerum. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -5430,17 +7188,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7144064222780250488 + example: 2489572558350094249 format: int64 example: - account_id: Enim vitae officia dolorem odio. - funding_instrument_id: Excepturi minima illo dolores. + account_id: Adipisci minus et vero. + funding_instrument_id: Occaecati incidunt deleniti sunt dolorem ea. has_credentials: false - id: Et itaque rem eos et deleniti dolores. - label: Facere qui omnis. - project_id: Facilis qui libero. - status: active - version: 6722562537039921847 + id: Voluptates ab quos provident magni et. + label: Et culpa culpa veritatis. + project_id: Reprehenderit officiis modi quae consequatur. + status: inactive + version: 8208341011850859357 required: - id - project_id @@ -5454,11 +7212,11 @@ components: account_id: type: string description: Provider account identifier - example: Non quo necessitatibus. + example: Eius omnis id itaque. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Laudantium nostrum earum dolores sit. + example: Perferendis placeat dolores. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5466,15 +7224,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: A sint quod sunt quae et. + example: Quidem quibusdam officiis dolor. label: type: string description: Optional friendly name - example: Ut mollitia nihil ducimus. + example: Sint dolor eaque culpa. project_id: type: string description: Owning project - example: Iure quis. + example: Nisi sunt. status: type: string description: Connection status @@ -5487,17 +7245,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3532519562043610511 + example: 1134950045517095139 format: int64 example: - account_id: At fugit dolor. - funding_instrument_id: Non exercitationem modi possimus consequatur non. + account_id: Sint suscipit. + funding_instrument_id: Non neque optio. has_credentials: false - id: Exercitationem accusantium nihil. - label: Amet omnis. - project_id: Quod alias ipsum voluptates pariatur magni. - status: error - version: 5818865715898604715 + id: Dolore voluptatem qui eveniet amet. + label: Voluptate et. + project_id: Qui pariatur odio reprehenderit nam. + status: deleted + version: 6078188127403523196 required: - id - project_id @@ -5515,15 +7273,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Ut mollitia accusantium dignissimos. + example: Cumque perspiciatis quam. label: type: string description: Optional friendly name - example: Fugit provident officia officiis. + example: Iste numquam optio possimus velit. example: account_id: 8r7gb - funding_instrument_id: Rerum ut necessitatibus illum ratione. - label: Consequatur qui molestiae velit ratione nesciunt et. + funding_instrument_id: Eveniet quia voluptatem impedit cumque doloribus. + label: Possimus ipsam perspiciatis enim id. required: - account_id TwitterAdsCredentials: @@ -5532,30 +7290,42 @@ components: access_token: type: string description: OAuth 1.0a access token - example: At perspiciatis quisquam perferendis. + example: Ullam consequatur ut eveniet tempore est. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Ut alias quis nihil dolore suscipit reprehenderit. + example: Iusto fugiat ad et. consumer_key: type: string description: OAuth 1.0a consumer key - example: Id ipsa perspiciatis sunt ut velit. + example: Magni odio aut omnis vel. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Aut mollitia aut molestiae exercitationem et. + example: Iure ducimus voluptatem. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Et aut consequatur inventore enim reiciendis. - access_token_secret: Neque ut rerum facilis quia molestiae ratione. - consumer_key: Aut animi laudantium ullam. - consumer_secret: Autem et id laboriosam nihil ea. + access_token: Necessitatibus tempore rem quo. + access_token_secret: Accusantium voluptas ratione dignissimos esse et labore. + consumer_key: Magnam cum veritatis mollitia vel velit. + consumer_secret: Eum perferendis qui qui soluta repudiandae quae. required: - consumer_key - consumer_secret - access_token - access_token_secret + UpdateCampaignRequestBody: + type: object + properties: + campaign: + $ref: '#/components/schemas/CampaignUpdateInput' + example: + campaign: + campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. + config: Error similique. + status: Maxime fugiat illo. + required: + - campaign UpdateGoogleAdsRequestBody: type: object properties: @@ -5575,12 +7345,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Temporibus voluptas inventore sit omnis. - brand_kit: Quis facere sint totam sapiente. - label: Sint nihil. - portal_id: Expedita veniam beatae autem. - sender_email: Placeat enim. - sender_name: Nesciunt asperiores et est. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. required: - config UpdateLinkedinAdsRequestBody: @@ -5591,7 +7361,7 @@ components: example: config: account_id: "538170226" - label: Fugit voluptatem. + label: Tempora error rerum quae nihil. org_id: "208777" required: - config @@ -5603,9 +7373,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Eligendi vero temporibus. - label: Non maiores quae sed quia. - page_id: Facilis eum ipsam. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. required: - config UpdateMicrosoftAdsRequestBody: @@ -5615,9 +7385,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Sint qui praesentium ea praesentium magni. - customer_id: Iure dolore et et aut nam. - label: Consequuntur neque mollitia quia. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. required: - config UpdateRedditAdsRequestBody: @@ -5628,7 +7398,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Ut est nobis aspernatur. + label: Provident quia distinctio. required: - config UpdateTwitterAdsRequestBody: @@ -5639,8 +7409,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Eveniet dicta numquam doloremque. - label: Ea velit et assumenda recusandae enim. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. required: - config securitySchemes: @@ -5651,5 +7421,7 @@ components: tags: - name: lfx-v2-campaign-service-svc description: The campaign service supports Marketing Operations campaign creation and management. + - name: lfx-v2-campaign-service-briefs + description: Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation. - name: lfx-v2-campaign-service-connections description: Manage a project's singleton, per-provider ad-platform connections. diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 32a8f743..845971ea 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -125,16 +125,6 @@ func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.En mux, err := buildMux(ctx, cfg, endpoints, connEndpoints, briefEndpoints) if err != nil { return err -======= - if connEndpoints != nil { - connServer := connsvcsvr.New(connEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, eh, nil) - connsvcsvr.Mount(mux, connServer) - } - - if briefEndpoints != nil { - briefServer := briefsvcsvr.New(briefEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, eh, nil) - briefsvcsvr.Mount(mux, briefServer) ->>>>>>> daac45d (feat(briefs): add brief + campaign API and async orchestrator) } var handler http.Handler = mux diff --git a/design/brief.go b/design/brief.go index ecaa17a7..f50f491b 100644 --- a/design/brief.go +++ b/design/brief.go @@ -40,6 +40,10 @@ var Brief = Type("brief", func() { Attribute("event_slug", String, "Event/course slug") Attribute("url", String, "Event/course page URL") Attribute("platforms", ArrayOf(String), "Suggested default platforms") + Attribute("event_details", Any, "Extracted event/course details") + Attribute("copy", Any, "Ad copy") + Attribute("keywords", Any, "Keyword list") + Attribute("targeting", Any, "Targeting recommendation") Attribute("status", String, "Lifecycle status", func() { Enum("draft", "approved", "archived") }) @@ -52,7 +56,11 @@ var Brief = Type("brief", func() { // CampaignCreateInput selects the platforms to launch on and their config. var CampaignCreateInput = Type("campaign-create-input", func() { - Attribute("platforms", ArrayOf(String), "Platforms to create campaigns on (binding selection)") + Attribute("platforms", ArrayOf(String, func() { + // Constrain to the known providers so OpenAPI clients can discover the + // valid values and Goa advertises them; the service also revalidates. + Enum("google-ads", "linkedin-ads", "meta-ads", "reddit-ads", "twitter-ads", "microsoft-ads", "hubspot") + }), "Platforms to create campaigns on (binding selection)") Attribute("config", Any, "Per-platform campaign configuration") Required("platforms") }) @@ -297,22 +305,25 @@ func campaignIDAttr() { } // commonBriefErrors declares the standard error set for a brief method. -// withBadRequest adds BadRequest for methods that accept a body. +// BadRequest is always declared: JWTAuth can reject any method with a 400 +// (malformed/invalid token) regardless of whether the method takes a body, so +// every method's generated encoder must handle it. The withBadRequest parameter +// is retained for call-site readability (true = the method also validates a body) +// but no longer gates BadRequest. func commonBriefErrors(withBadRequest bool) { - if withBadRequest { - Error("BadRequest", BadRequestError, "Bad request") - } + _ = withBadRequest + Error("BadRequest", BadRequestError, "Bad request") Error("NotFound", NotFoundError, "Resource not found") Error("Conflict", ConflictError, "Conflict") Error("InternalServerError", InternalServerError, "Internal server error") Error("ServiceUnavailable", ConnServiceUnavailableError, "Service unavailable") } -// briefErrorResponses maps the standard errors to HTTP responses. +// briefErrorResponses maps the standard errors to HTTP responses. BadRequest is +// always mapped to match commonBriefErrors. func briefErrorResponses(withBadRequest bool) { - if withBadRequest { - Response("BadRequest", StatusBadRequest) - } + _ = withBadRequest + Response("BadRequest", StatusBadRequest) Response("NotFound", StatusNotFound) Response("Conflict", StatusConflict) Response("InternalServerError", StatusInternalServerError) diff --git a/docs/api-catalog.md b/docs/api-catalog.md index 099da9c4..552096bf 100644 --- a/docs/api-catalog.md +++ b/docs/api-catalog.md @@ -276,12 +276,15 @@ platforms: CampaignPlatform[] — Platforms this job will create on (echoed fr jobId: string status: 'queued' | 'running' | 'succeeded' | 'partial' | 'failed' — 'partial' = some platforms succeeded, some failed -results: CampaignCreateResult[] — Per-platform results, populated as each platform completes -errors: string[] — Platform-specific errors if any -startedAt: string — ISO timestamp -finishedAt?: string — ISO timestamp, present once terminal +result?: CampaignCreateResult[] — Per-platform results, written once when the job + reaches a terminal state (absent while queued/running) +error?: string — Terminal error, if the job failed as a whole ``` +Per-platform errors are carried inside each `result` entry rather than in a +separate top-level array; the job's own start/finish times are available from +the job record's timestamps and are not echoed in the poll payload. + ### CampaignCreateResult (per-platform result, embedded in JobPollResponse.results) ``` diff --git a/docs/knowledge/code/design.md b/docs/knowledge/code/design.md index 099e203f..35b73fae 100644 --- a/docs/knowledge/code/design.md +++ b/docs/knowledge/code/design.md @@ -9,4 +9,14 @@ resource: "design" Package design contains the DSL for the campaign service Goa API generation. +It defines three services: the health service (`readyz`/`livez`), the +connections service (per-provider singleton credential CRUD), and the briefs +service. The briefs service models the Project → Brief → Campaigns hierarchy: +brief CRUD (the funnel unit, carrying `program_type`), asynchronous campaign +creation (`POST .../campaigns` returns a job to poll), and campaign read/update. +Every method is gated on `campaign_manager` at the gateway via `JWTAuth`, which +can reject any request with a `BadRequest` (400) — so every brief method +declares `BadRequest` regardless of whether it accepts a body. The binding +`platforms` selection is constrained to the known provider enum. + See [design](../../../design). diff --git a/docs/knowledge/code/internal-container.md b/docs/knowledge/code/internal-container.md index caf92d2a..f7939a71 100644 --- a/docs/knowledge/code/internal-container.md +++ b/docs/knowledge/code/internal-container.md @@ -10,9 +10,13 @@ resource: "internal/container" Package container provides dependency injection for the application. When a database URL is configured it validates settings, runs migrations, -opens an instrumented `postgres.Pool`, and passes the pool to -`NewCampaignService` so `/readyz` reflects DB connectivity. Without a -database URL the health service still starts and connection routes return -typed `503` responses. +opens an instrumented `postgres.Pool`, and wires the services against it: the +connection service (with its repo and the AES-GCM credential encryptor), the +brief service and its async orchestrator (brief/campaign/job repos), and the +campaign/health service so `/readyz` reflects DB connectivity. No platform +dispatchers are registered yet, so campaign creation records jobs but performs +no upstream dispatch (a startup warning notes this). Without a database URL the +health service still starts and the connection and brief routes return typed +`503` responses rather than unmounted `404`s. See [internal/container](../../../internal/container). diff --git a/docs/knowledge/code/internal-service.md b/docs/knowledge/code/internal-service.md index ba64b8a1..c8993ea5 100644 --- a/docs/knowledge/code/internal-service.md +++ b/docs/knowledge/code/internal-service.md @@ -8,11 +8,22 @@ resource: "internal/service" # internal/service Package service contains the campaign service business logic, including the -implementation of the generated Goa service interface. +implementation of the generated Goa service interfaces. `GET /readyz` ANDs an optional `ReadinessChecker` (the PostgreSQL pool when wired) into readiness with a ~2s timeout and returns `503` when the dependency is unhealthy. `GET /livez` remains process-only so database outages do not trigger Kubernetes restarts. +`BriefService` implements brief CRUD and campaign endpoints. Campaign creation +(`CreateCampaigns`) requires an approved brief, rejects empty and duplicate +platform sets (a duplicate would create two paid upstream campaigns), then hands +off to the `Orchestrator`, which persists a job and dispatches per platform +asynchronously (bounded concurrency). Dispatch is idempotent: a brief already +carrying a campaign with an upstream id for a platform is reused rather than +re-created, and a transient existing-campaign lookup error is recorded as a +failure rather than risking a duplicate. Replacing a brief's content resets it to +`draft` (re-approval required). Optimistic concurrency is enforced via +version/If-Match (`428` when missing, `412` on mismatch). + See [internal/service](../../../internal/service). diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index ff311548..96a2a541 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -26,6 +26,16 @@ must also be mounted in `server.go`, or its routes 404 despite compiling. **Creation** — Added the `internal/platform/reddit` concept doc for the new Reddit Ads API v3 client (OAuth2 token refresh + Campaign -> Ad Group -> Ad creation) and listed it in the code index. +**Update** — Brief + campaign API and async orchestrator (LFXV2-2626): +updated `design`, `internal/service`, and `internal/container` concepts for +the Project → Brief → Campaigns hierarchy, async job dispatch, and idempotent +per-platform creation. Behavior hardened per review: brief content replace +resets status to `draft` and persists `event_slug`; duplicate platform sets are +rejected; dispatch reuses an existing upstream campaign instead of re-creating; +brief responses carry `event_details`/`copy`/`keywords`/`targeting`; the +`(project_id, event_slug)` archived-aware partial unique index moved to a new +migration `000003` (never edit an applied migration in place); `platforms` is +enum-constrained and every brief method declares `BadRequest` (JWTAuth can 400). **Update** — Dropped the Goa CLI path allowlist; twitter-api-secret FP is fingerprint-only in `.gitleaksignore`. Clarified `.grype.yaml` rationale diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index 194c6cb1..367c2960 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -33,8 +33,8 @@ func UsageCommands() []string { // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + - os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + os.Args[0] + " " + "lfx-v2-campaign-service-svc readyz" + "\n" + "" } @@ -809,7 +809,7 @@ func lfxV2CampaignServiceBriefsCreateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetBriefUsage() { @@ -831,7 +831,7 @@ func lfxV2CampaignServiceBriefsGetBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"Et architecto voluptas ratione delectus ut.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"Enim quidem odio et sequi consequatur.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateBriefUsage() { @@ -857,7 +857,7 @@ func lfxV2CampaignServiceBriefsUpdateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }' --project-id \"cncf\" --brief-id \"Eligendi voluptas non.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }' --project-id \"cncf\" --brief-id \"Neque tempore voluptatibus quo quod nesciunt.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsApproveBriefUsage() { @@ -879,7 +879,7 @@ func lfxV2CampaignServiceBriefsApproveBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"Sint eveniet dicta numquam doloremque ab cumque.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"Dolores omnis rem non natus.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsDeleteBriefUsage() { @@ -901,7 +901,7 @@ func lfxV2CampaignServiceBriefsDeleteBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"Dolores omnis rem non natus.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"Facilis sint qui praesentium ea praesentium magni.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { @@ -925,7 +925,7 @@ func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Eligendi earum qui est et id laudantium.\",\n \"platforms\": [\n \"Ea magnam ut nihil quo tenetur.\",\n \"Fugiat natus.\",\n \"Et tempore.\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"Ratione incidunt est saepe.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Est voluptatum enim earum et doloribus.\",\n \"platforms\": [\n \"hubspot\",\n \"meta-ads\",\n \"reddit-ads\",\n \"twitter-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"Ea consequatur et ut.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetCampaignUsage() { @@ -949,7 +949,7 @@ func lfxV2CampaignServiceBriefsGetCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"Qui praesentium ea praesentium.\" --campaign-id \"Asperiores iure dolore et et aut nam.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"Exercitationem rerum iste ducimus.\" --campaign-id \"Omnis nesciunt.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { @@ -977,7 +977,7 @@ func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Hic voluptas debitis error.\",\n \"config\": \"Ut consectetur.\",\n \"status\": \"Veniam eum ut libero quibusdam debitis.\"\n }\n }' --project-id \"cncf\" --brief-id \"Commodi quam voluptates.\" --campaign-id \"Optio dolorem omnis.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Reiciendis architecto atque maxime soluta dolorem ducimus.\",\n \"config\": \"Error similique.\",\n \"status\": \"Maxime fugiat illo.\"\n }\n }' --project-id \"cncf\" --brief-id \"Minus est ut.\" --campaign-id \"Alias ullam fugiat deserunt sint nihil iusto.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsGetJobUsage() { @@ -999,7 +999,7 @@ func lfxV2CampaignServiceBriefsGetJobUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"Placeat enim.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"Et omnis accusantium.\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceConnectionsUsage displays the usage of the @@ -1073,7 +1073,7 @@ func lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetGoogleAdsUsage() { @@ -1179,7 +1179,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { @@ -1201,7 +1201,7 @@ func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetLinkedinAdsUsage() { @@ -1245,7 +1245,7 @@ func lfxV2CampaignServiceConnectionsUpdateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteLinkedinAdsUsage() { @@ -1307,7 +1307,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { @@ -1329,7 +1329,7 @@ func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n },\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMetaAdsUsage() { @@ -1373,7 +1373,7 @@ func lfxV2CampaignServiceConnectionsUpdateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMetaAdsUsage() { @@ -1435,7 +1435,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { @@ -1457,7 +1457,7 @@ func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n },\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetRedditAdsUsage() { @@ -1501,7 +1501,7 @@ func lfxV2CampaignServiceConnectionsUpdateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteRedditAdsUsage() { @@ -1563,7 +1563,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { @@ -1585,7 +1585,7 @@ func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n },\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n },\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetTwitterAdsUsage() { @@ -1629,7 +1629,7 @@ func lfxV2CampaignServiceConnectionsUpdateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteTwitterAdsUsage() { @@ -1691,7 +1691,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { @@ -1713,7 +1713,7 @@ func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n },\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n },\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMicrosoftAdsUsage() { @@ -1757,7 +1757,7 @@ func lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMicrosoftAdsUsage() { @@ -1819,7 +1819,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { @@ -1841,7 +1841,7 @@ func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetHubspotUsage() { @@ -1885,7 +1885,7 @@ func lfxV2CampaignServiceConnectionsUpdateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteHubspotUsage() { @@ -1947,7 +1947,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceSvcUsage displays the usage of the diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go index dbc29cfd..c44e8396 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -23,7 +23,7 @@ func BuildCreateBriefPayload(lfxV2CampaignServiceBriefsCreateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -90,7 +90,7 @@ func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_details\": \"Quia ut atque.\",\n \"event_slug\": \"Voluptate et corporis voluptatum occaecati quis perspiciatis.\",\n \"keywords\": \"Expedita unde molestiae.\",\n \"platforms\": [\n \"Vel nobis non molestias non.\",\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"url\": \"Nesciunt unde ullam occaecati maxime.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -194,7 +194,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Eligendi earum qui est et id laudantium.\",\n \"platforms\": [\n \"Ea magnam ut nihil quo tenetur.\",\n \"Fugiat natus.\",\n \"Et tempore.\"\n ]\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Est voluptatum enim earum et doloribus.\",\n \"platforms\": [\n \"hubspot\",\n \"meta-ads\",\n \"reddit-ads\",\n \"twitter-ads\"\n ]\n }\n }'") } if body.Input == nil { err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) @@ -271,7 +271,7 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateCampaignBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Hic voluptas debitis error.\",\n \"config\": \"Ut consectetur.\",\n \"status\": \"Veniam eum ut libero quibusdam debitis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Reiciendis architecto atque maxime soluta dolorem ducimus.\",\n \"config\": \"Error similique.\",\n \"status\": \"Maxime fugiat illo.\"\n }\n }'") } if body.Campaign == nil { err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go index a96bf192..6fa9795b 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go @@ -244,6 +244,7 @@ func EncodeGetBriefRequest(encoder func(*http.Request) goahttp.Encoder) func(*ht // lfx-v2-campaign-service-briefs get-brief endpoint. restoreBody controls // whether the response body should be restored after having been read. // DecodeGetBriefResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest // - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict // - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable // - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError @@ -286,6 +287,20 @@ func DecodeGetBriefResponse(decoder func(*http.Response) goahttp.Decoder, restor } res := NewGetBriefBriefOK(&body, etag) return res, nil + case http.StatusBadRequest: + var ( + body GetBriefBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + err = ValidateGetBriefBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-brief", err) + } + return nil, NewGetBriefBadRequest(&body) case http.StatusConflict: var ( body GetBriefConflictResponseBody @@ -611,6 +626,7 @@ func EncodeApproveBriefRequest(encoder func(*http.Request) goahttp.Encoder) func // lfx-v2-campaign-service-briefs approve-brief endpoint. restoreBody controls // whether the response body should be restored after having been read. // DecodeApproveBriefResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest // - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict // - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable // - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError @@ -653,6 +669,20 @@ func DecodeApproveBriefResponse(decoder func(*http.Response) goahttp.Decoder, re } res := NewApproveBriefBriefOK(&body, etag) return res, nil + case http.StatusBadRequest: + var ( + body ApproveBriefBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefBadRequest(&body) case http.StatusConflict: var ( body ApproveBriefConflictResponseBody @@ -768,6 +798,7 @@ func EncodeDeleteBriefRequest(encoder func(*http.Request) goahttp.Encoder) func( // lfx-v2-campaign-service-briefs delete-brief endpoint. restoreBody controls // whether the response body should be restored after having been read. // DecodeDeleteBriefResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest // - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict // - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable // - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError @@ -790,6 +821,20 @@ func DecodeDeleteBriefResponse(decoder func(*http.Response) goahttp.Decoder, res switch resp.StatusCode { case http.StatusNoContent: return nil, nil + case http.StatusBadRequest: + var ( + body DeleteBriefBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + err = ValidateDeleteBriefBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "delete-brief", err) + } + return nil, NewDeleteBriefBadRequest(&body) case http.StatusConflict: var ( body DeleteBriefConflictResponseBody @@ -1076,6 +1121,7 @@ func EncodeGetCampaignRequest(encoder func(*http.Request) goahttp.Encoder) func( // lfx-v2-campaign-service-briefs get-campaign endpoint. restoreBody controls // whether the response body should be restored after having been read. // DecodeGetCampaignResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest // - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict // - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable // - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError @@ -1118,6 +1164,20 @@ func DecodeGetCampaignResponse(decoder func(*http.Response) goahttp.Decoder, res } res := NewGetCampaignCampaignOK(&body, etag) return res, nil + case http.StatusBadRequest: + var ( + body GetCampaignBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + err = ValidateGetCampaignBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-campaign", err) + } + return nil, NewGetCampaignBadRequest(&body) case http.StatusConflict: var ( body GetCampaignConflictResponseBody @@ -1444,6 +1504,7 @@ func EncodeGetJobRequest(encoder func(*http.Request) goahttp.Encoder) func(*http // lfx-v2-campaign-service-briefs get-job endpoint. restoreBody controls // whether the response body should be restored after having been read. // DecodeGetJobResponse may return the following errors: +// - "BadRequest" (type *lfxv2campaignservicebriefs.BadRequestError): http.StatusBadRequest // - "Conflict" (type *lfxv2campaignservicebriefs.ConflictError): http.StatusConflict // - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable // - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError @@ -1479,6 +1540,20 @@ func DecodeGetJobResponse(decoder func(*http.Response) goahttp.Decoder, restoreB } res := NewGetJobJobPollResponseOK(&body) return res, nil + case http.StatusBadRequest: + var ( + body GetJobBadRequestResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "get-job", err) + } + err = ValidateGetJobBadRequestResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "get-job", err) + } + return nil, NewGetJobBadRequest(&body) case http.StatusConflict: var ( body GetJobConflictResponseBody diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index 85724045..1ccc269a 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -53,6 +53,14 @@ type CreateBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` // Optimistic-concurrency version @@ -74,6 +82,14 @@ type GetBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` // Optimistic-concurrency version @@ -95,6 +111,14 @@ type UpdateBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` // Optimistic-concurrency version @@ -116,6 +140,14 @@ type ApproveBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` // Optimistic-concurrency version @@ -240,6 +272,16 @@ type CreateBriefNotFoundResponseBody struct { Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` } +// GetBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "BadRequest" error. +type GetBriefBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + // GetBriefConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response // body for the "Conflict" error. @@ -350,6 +392,16 @@ type UpdateBriefPreconditionRequiredResponseBody struct { Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` } +// ApproveBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "BadRequest" error. +type ApproveBriefBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + // ApproveBriefConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP // response body for the "Conflict" error. @@ -390,6 +442,16 @@ type ApproveBriefNotFoundResponseBody struct { Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` } +// DeleteBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "BadRequest" error. +type DeleteBriefBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + // DeleteBriefConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP // response body for the "Conflict" error. @@ -480,6 +542,16 @@ type CreateCampaignsNotFoundResponseBody struct { Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` } +// GetCampaignBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "BadRequest" error. +type GetCampaignBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + // GetCampaignConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP // response body for the "Conflict" error. @@ -590,6 +662,16 @@ type UpdateCampaignPreconditionRequiredResponseBody struct { Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` } +// GetJobBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "BadRequest" error. +type GetJobBadRequestResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + // GetJobConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response // body for the "Conflict" error. @@ -717,13 +799,17 @@ func NewUpdateCampaignRequestBody(p *lfxv2campaignservicebriefs.UpdateCampaignPa // "create-brief" endpoint result from a HTTP "Created" response. func NewCreateBriefBriefCreated(body *CreateBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { v := &lfxv2campaignservicebriefs.Brief{ - ID: *body.ID, - ProjectID: *body.ProjectID, - ProgramType: *body.ProgramType, - EventSlug: *body.EventSlug, - URL: body.URL, - Status: *body.Status, - Version: *body.Version, + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + EventDetails: body.EventDetails, + Copy: body.Copy, + Keywords: body.Keywords, + Targeting: body.Targeting, + Status: *body.Status, + Version: *body.Version, } if body.Platforms != nil { v.Platforms = make([]string, len(body.Platforms)) @@ -795,13 +881,17 @@ func NewCreateBriefNotFound(body *CreateBriefNotFoundResponseBody) *lfxv2campaig // "get-brief" endpoint result from a HTTP "OK" response. func NewGetBriefBriefOK(body *GetBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { v := &lfxv2campaignservicebriefs.Brief{ - ID: *body.ID, - ProjectID: *body.ProjectID, - ProgramType: *body.ProgramType, - EventSlug: *body.EventSlug, - URL: body.URL, - Status: *body.Status, - Version: *body.Version, + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + EventDetails: body.EventDetails, + Copy: body.Copy, + Keywords: body.Keywords, + Targeting: body.Targeting, + Status: *body.Status, + Version: *body.Version, } if body.Platforms != nil { v.Platforms = make([]string, len(body.Platforms)) @@ -814,6 +904,17 @@ func NewGetBriefBriefOK(body *GetBriefResponseBody, etag *string) *lfxv2campaign return v } +// NewGetBriefBadRequest builds a lfx-v2-campaign-service-briefs service +// get-brief endpoint BadRequest error. +func NewGetBriefBadRequest(body *GetBriefBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + // NewGetBriefConflict builds a lfx-v2-campaign-service-briefs service // get-brief endpoint Conflict error. func NewGetBriefConflict(body *GetBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { @@ -862,13 +963,17 @@ func NewGetBriefNotFound(body *GetBriefNotFoundResponseBody) *lfxv2campaignservi // "update-brief" endpoint result from a HTTP "OK" response. func NewUpdateBriefBriefOK(body *UpdateBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { v := &lfxv2campaignservicebriefs.Brief{ - ID: *body.ID, - ProjectID: *body.ProjectID, - ProgramType: *body.ProgramType, - EventSlug: *body.EventSlug, - URL: body.URL, - Status: *body.Status, - Version: *body.Version, + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + EventDetails: body.EventDetails, + Copy: body.Copy, + Keywords: body.Keywords, + Targeting: body.Targeting, + Status: *body.Status, + Version: *body.Version, } if body.Platforms != nil { v.Platforms = make([]string, len(body.Platforms)) @@ -962,13 +1067,17 @@ func NewUpdateBriefPreconditionRequired(body *UpdateBriefPreconditionRequiredRes // "approve-brief" endpoint result from a HTTP "OK" response. func NewApproveBriefBriefOK(body *ApproveBriefResponseBody, etag *string) *lfxv2campaignservicebriefs.Brief { v := &lfxv2campaignservicebriefs.Brief{ - ID: *body.ID, - ProjectID: *body.ProjectID, - ProgramType: *body.ProgramType, - EventSlug: *body.EventSlug, - URL: body.URL, - Status: *body.Status, - Version: *body.Version, + ID: *body.ID, + ProjectID: *body.ProjectID, + ProgramType: *body.ProgramType, + EventSlug: *body.EventSlug, + URL: body.URL, + EventDetails: body.EventDetails, + Copy: body.Copy, + Keywords: body.Keywords, + Targeting: body.Targeting, + Status: *body.Status, + Version: *body.Version, } if body.Platforms != nil { v.Platforms = make([]string, len(body.Platforms)) @@ -981,6 +1090,17 @@ func NewApproveBriefBriefOK(body *ApproveBriefResponseBody, etag *string) *lfxv2 return v } +// NewApproveBriefBadRequest builds a lfx-v2-campaign-service-briefs service +// approve-brief endpoint BadRequest error. +func NewApproveBriefBadRequest(body *ApproveBriefBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + // NewApproveBriefConflict builds a lfx-v2-campaign-service-briefs service // approve-brief endpoint Conflict error. func NewApproveBriefConflict(body *ApproveBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { @@ -1025,6 +1145,17 @@ func NewApproveBriefNotFound(body *ApproveBriefNotFoundResponseBody) *lfxv2campa return v } +// NewDeleteBriefBadRequest builds a lfx-v2-campaign-service-briefs service +// delete-brief endpoint BadRequest error. +func NewDeleteBriefBadRequest(body *DeleteBriefBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + // NewDeleteBriefConflict builds a lfx-v2-campaign-service-briefs service // delete-brief endpoint Conflict error. func NewDeleteBriefConflict(body *DeleteBriefConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { @@ -1161,6 +1292,17 @@ func NewGetCampaignCampaignOK(body *GetCampaignResponseBody, etag *string) *lfxv return v } +// NewGetCampaignBadRequest builds a lfx-v2-campaign-service-briefs service +// get-campaign endpoint BadRequest error. +func NewGetCampaignBadRequest(body *GetCampaignBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + // NewGetCampaignConflict builds a lfx-v2-campaign-service-briefs service // get-campaign endpoint Conflict error. func NewGetCampaignConflict(body *GetCampaignConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { @@ -1314,6 +1456,17 @@ func NewGetJobJobPollResponseOK(body *GetJobResponseBody) *lfxv2campaignserviceb return v } +// NewGetJobBadRequest builds a lfx-v2-campaign-service-briefs service get-job +// endpoint BadRequest error. +func NewGetJobBadRequest(body *GetJobBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { + v := &lfxv2campaignservicebriefs.BadRequestError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + // NewGetJobConflict builds a lfx-v2-campaign-service-briefs service get-job // endpoint Conflict error. func NewGetJobConflict(body *GetJobConflictResponseBody) *lfxv2campaignservicebriefs.ConflictError { @@ -1622,6 +1775,18 @@ func ValidateCreateBriefNotFoundResponseBody(body *CreateBriefNotFoundResponseBo return } +// ValidateGetBriefBadRequestResponseBody runs the validations defined on +// get-brief_BadRequest_response_body +func ValidateGetBriefBadRequestResponseBody(body *GetBriefBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + // ValidateGetBriefConflictResponseBody runs the validations defined on // get-brief_Conflict_response_body func ValidateGetBriefConflictResponseBody(body *GetBriefConflictResponseBody) (err error) { @@ -1754,6 +1919,18 @@ func ValidateUpdateBriefPreconditionRequiredResponseBody(body *UpdateBriefPrecon return } +// ValidateApproveBriefBadRequestResponseBody runs the validations defined on +// approve-brief_BadRequest_response_body +func ValidateApproveBriefBadRequestResponseBody(body *ApproveBriefBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + // ValidateApproveBriefConflictResponseBody runs the validations defined on // approve-brief_Conflict_response_body func ValidateApproveBriefConflictResponseBody(body *ApproveBriefConflictResponseBody) (err error) { @@ -1802,6 +1979,18 @@ func ValidateApproveBriefNotFoundResponseBody(body *ApproveBriefNotFoundResponse return } +// ValidateDeleteBriefBadRequestResponseBody runs the validations defined on +// delete-brief_BadRequest_response_body +func ValidateDeleteBriefBadRequestResponseBody(body *DeleteBriefBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + // ValidateDeleteBriefConflictResponseBody runs the validations defined on // delete-brief_Conflict_response_body func ValidateDeleteBriefConflictResponseBody(body *DeleteBriefConflictResponseBody) (err error) { @@ -1910,6 +2099,18 @@ func ValidateCreateCampaignsNotFoundResponseBody(body *CreateCampaignsNotFoundRe return } +// ValidateGetCampaignBadRequestResponseBody runs the validations defined on +// get-campaign_BadRequest_response_body +func ValidateGetCampaignBadRequestResponseBody(body *GetCampaignBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + // ValidateGetCampaignConflictResponseBody runs the validations defined on // get-campaign_Conflict_response_body func ValidateGetCampaignConflictResponseBody(body *GetCampaignConflictResponseBody) (err error) { @@ -2042,6 +2243,18 @@ func ValidateUpdateCampaignPreconditionRequiredResponseBody(body *UpdateCampaign return } +// ValidateGetJobBadRequestResponseBody runs the validations defined on +// get-job_BadRequest_response_body +func ValidateGetJobBadRequestResponseBody(body *GetJobBadRequestResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + // ValidateGetJobConflictResponseBody runs the validations defined on // get-job_Conflict_response_body func ValidateGetJobConflictResponseBody(body *GetJobConflictResponseBody) (err error) { @@ -2105,5 +2318,10 @@ func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody if body.Platforms == nil { err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) } + for _, e := range body.Platforms { + if !(e == "google-ads" || e == "linkedin-ads" || e == "meta-ads" || e == "reddit-ads" || e == "twitter-ads" || e == "microsoft-ads" || e == "hubspot") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.platforms[*]", e, []any{"google-ads", "linkedin-ads", "meta-ads", "reddit-ads", "twitter-ads", "microsoft-ads", "hubspot"})) + } + } return } diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go index 4caaee02..8d5c87e1 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go @@ -220,6 +220,19 @@ func EncodeGetBriefError(encoder func(context.Context, http.ResponseWriter) goah return encodeError(ctx, w, v) } switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetBriefBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) case "Conflict": var res *lfxv2campaignservicebriefs.ConflictError errors.As(v, &res) @@ -512,6 +525,19 @@ func EncodeApproveBriefError(encoder func(context.Context, http.ResponseWriter) return encodeError(ctx, w, v) } switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) case "Conflict": var res *lfxv2campaignservicebriefs.ConflictError errors.As(v, &res) @@ -620,6 +646,19 @@ func EncodeDeleteBriefError(encoder func(context.Context, http.ResponseWriter) g return encodeError(ctx, w, v) } switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewDeleteBriefBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) case "Conflict": var res *lfxv2campaignservicebriefs.ConflictError errors.As(v, &res) @@ -880,6 +919,19 @@ func EncodeGetCampaignError(encoder func(context.Context, http.ResponseWriter) g return encodeError(ctx, w, v) } switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetCampaignBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) case "Conflict": var res *lfxv2campaignservicebriefs.ConflictError errors.As(v, &res) @@ -1171,6 +1223,19 @@ func EncodeGetJobError(encoder func(context.Context, http.ResponseWriter) goahtt return encodeError(ctx, w, v) } switch en.GoaErrorName() { + case "BadRequest": + var res *lfxv2campaignservicebriefs.BadRequestError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewGetJobBadRequestResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusBadRequest) + return enc.Encode(body) case "Conflict": var res *lfxv2campaignservicebriefs.ConflictError errors.As(v, &res) diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index e9d70e2f..4024fd76 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -53,6 +53,14 @@ type CreateBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status string `form:"status" json:"status" xml:"status"` // Optimistic-concurrency version @@ -74,6 +82,14 @@ type GetBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status string `form:"status" json:"status" xml:"status"` // Optimistic-concurrency version @@ -95,6 +111,14 @@ type UpdateBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status string `form:"status" json:"status" xml:"status"` // Optimistic-concurrency version @@ -116,6 +140,14 @@ type ApproveBriefResponseBody struct { URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` // Suggested default platforms Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + // Extracted event/course details + EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` + // Ad copy + Copy any `form:"copy,omitempty" json:"copy,omitempty" xml:"copy,omitempty"` + // Keyword list + Keywords any `form:"keywords,omitempty" json:"keywords,omitempty" xml:"keywords,omitempty"` + // Targeting recommendation + Targeting any `form:"targeting,omitempty" json:"targeting,omitempty" xml:"targeting,omitempty"` // Lifecycle status Status string `form:"status" json:"status" xml:"status"` // Optimistic-concurrency version @@ -240,6 +272,16 @@ type CreateBriefNotFoundResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// GetBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response +// body for the "BadRequest" error. +type GetBriefBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + // GetBriefConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "get-brief" endpoint HTTP response // body for the "Conflict" error. @@ -350,6 +392,16 @@ type UpdateBriefPreconditionRequiredResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// ApproveBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "BadRequest" error. +type ApproveBriefBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + // ApproveBriefConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP // response body for the "Conflict" error. @@ -390,6 +442,16 @@ type ApproveBriefNotFoundResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// DeleteBriefBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP +// response body for the "BadRequest" error. +type DeleteBriefBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + // DeleteBriefConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP // response body for the "Conflict" error. @@ -480,6 +542,16 @@ type CreateCampaignsNotFoundResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// GetCampaignBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP +// response body for the "BadRequest" error. +type GetCampaignBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + // GetCampaignConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "get-campaign" endpoint HTTP // response body for the "Conflict" error. @@ -590,6 +662,16 @@ type UpdateCampaignPreconditionRequiredResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// GetJobBadRequestResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response +// body for the "BadRequest" error. +type GetJobBadRequestResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + // GetJobConflictResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "get-job" endpoint HTTP response // body for the "Conflict" error. @@ -675,13 +757,17 @@ type CampaignUpdateInputRequestBody struct { // the "create-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. func NewCreateBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *CreateBriefResponseBody { body := &CreateBriefResponseBody{ - ID: res.ID, - ProjectID: res.ProjectID, - ProgramType: res.ProgramType, - EventSlug: res.EventSlug, - URL: res.URL, - Status: res.Status, - Version: res.Version, + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + EventDetails: res.EventDetails, + Copy: res.Copy, + Keywords: res.Keywords, + Targeting: res.Targeting, + Status: res.Status, + Version: res.Version, } if res.Platforms != nil { body.Platforms = make([]string, len(res.Platforms)) @@ -696,13 +782,17 @@ func NewCreateBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *CreateBr // "get-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. func NewGetBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *GetBriefResponseBody { body := &GetBriefResponseBody{ - ID: res.ID, - ProjectID: res.ProjectID, - ProgramType: res.ProgramType, - EventSlug: res.EventSlug, - URL: res.URL, - Status: res.Status, - Version: res.Version, + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + EventDetails: res.EventDetails, + Copy: res.Copy, + Keywords: res.Keywords, + Targeting: res.Targeting, + Status: res.Status, + Version: res.Version, } if res.Platforms != nil { body.Platforms = make([]string, len(res.Platforms)) @@ -717,13 +807,17 @@ func NewGetBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *GetBriefRes // the "update-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. func NewUpdateBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *UpdateBriefResponseBody { body := &UpdateBriefResponseBody{ - ID: res.ID, - ProjectID: res.ProjectID, - ProgramType: res.ProgramType, - EventSlug: res.EventSlug, - URL: res.URL, - Status: res.Status, - Version: res.Version, + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + EventDetails: res.EventDetails, + Copy: res.Copy, + Keywords: res.Keywords, + Targeting: res.Targeting, + Status: res.Status, + Version: res.Version, } if res.Platforms != nil { body.Platforms = make([]string, len(res.Platforms)) @@ -738,13 +832,17 @@ func NewUpdateBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *UpdateBr // the "approve-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. func NewApproveBriefResponseBody(res *lfxv2campaignservicebriefs.Brief) *ApproveBriefResponseBody { body := &ApproveBriefResponseBody{ - ID: res.ID, - ProjectID: res.ProjectID, - ProgramType: res.ProgramType, - EventSlug: res.EventSlug, - URL: res.URL, - Status: res.Status, - Version: res.Version, + ID: res.ID, + ProjectID: res.ProjectID, + ProgramType: res.ProgramType, + EventSlug: res.EventSlug, + URL: res.URL, + EventDetails: res.EventDetails, + Copy: res.Copy, + Keywords: res.Keywords, + Targeting: res.Targeting, + Status: res.Status, + Version: res.Version, } if res.Platforms != nil { body.Platforms = make([]string, len(res.Platforms)) @@ -872,6 +970,17 @@ func NewCreateBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFound return body } +// NewGetBriefBadRequestResponseBody builds the HTTP response body from the +// result of the "get-brief" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewGetBriefBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *GetBriefBadRequestResponseBody { + body := &GetBriefBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + // NewGetBriefConflictResponseBody builds the HTTP response body from the // result of the "get-brief" endpoint of the "lfx-v2-campaign-service-briefs" // service. @@ -993,6 +1102,17 @@ func NewUpdateBriefPreconditionRequiredResponseBody(res *lfxv2campaignservicebri return body } +// NewApproveBriefBadRequestResponseBody builds the HTTP response body from the +// result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *ApproveBriefBadRequestResponseBody { + body := &ApproveBriefBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + // NewApproveBriefConflictResponseBody builds the HTTP response body from the // result of the "approve-brief" endpoint of the // "lfx-v2-campaign-service-briefs" service. @@ -1037,6 +1157,17 @@ func NewApproveBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoun return body } +// NewDeleteBriefBadRequestResponseBody builds the HTTP response body from the +// result of the "delete-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewDeleteBriefBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *DeleteBriefBadRequestResponseBody { + body := &DeleteBriefBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + // NewDeleteBriefConflictResponseBody builds the HTTP response body from the // result of the "delete-brief" endpoint of the // "lfx-v2-campaign-service-briefs" service. @@ -1136,6 +1267,17 @@ func NewCreateCampaignsNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotF return body } +// NewGetCampaignBadRequestResponseBody builds the HTTP response body from the +// result of the "get-campaign" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewGetCampaignBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *GetCampaignBadRequestResponseBody { + body := &GetCampaignBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + // NewGetCampaignConflictResponseBody builds the HTTP response body from the // result of the "get-campaign" endpoint of the // "lfx-v2-campaign-service-briefs" service. @@ -1257,6 +1399,17 @@ func NewUpdateCampaignPreconditionRequiredResponseBody(res *lfxv2campaignservice return body } +// NewGetJobBadRequestResponseBody builds the HTTP response body from the +// result of the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" +// service. +func NewGetJobBadRequestResponseBody(res *lfxv2campaignservicebriefs.BadRequestError) *GetJobBadRequestResponseBody { + body := &GetJobBadRequestResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + // NewGetJobConflictResponseBody builds the HTTP response body from the result // of the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" service. func NewGetJobConflictResponseBody(res *lfxv2campaignservicebriefs.ConflictError) *GetJobConflictResponseBody { @@ -1484,6 +1637,11 @@ func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody if body.Platforms == nil { err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) } + for _, e := range body.Platforms { + if !(e == "google-ads" || e == "linkedin-ads" || e == "meta-ads" || e == "reddit-ads" || e == "twitter-ads" || e == "microsoft-ads" || e == "hubspot") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.platforms[*]", e, []any{"google-ads", "linkedin-ads", "meta-ads", "reddit-ads", "twitter-ads", "microsoft-ads", "hubspot"})) + } + } return } diff --git a/gen/http/lfx_v2_campaign_service_connections/client/cli.go b/gen/http/lfx_v2_campaign_service_connections/client/cli.go index 7c1ce05c..92991268 100644 --- a/gen/http/lfx_v2_campaign_service_connections/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_connections/client/cli.go @@ -24,7 +24,7 @@ func BuildCreateGoogleAdsPayload(lfxV2CampaignServiceConnectionsCreateGoogleAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -174,7 +174,7 @@ func BuildSetCredentialGoogleAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Ex ea ullam corrupti.\",\n \"client_secret\": \"Et omnis accusantium.\",\n \"developer_token\": \"Iure modi asperiores ut.\",\n \"refresh_token\": \"Consectetur sint nesciunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -212,7 +212,7 @@ func BuildCreateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsCreateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -276,7 +276,7 @@ func BuildUpdateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsUpdateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Ratione sunt nostrum tenetur repellendus dolorem cum.\",\n \"org_id\": \"208777\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -363,7 +363,7 @@ func BuildSetCredentialLinkedinAdsPayload(lfxV2CampaignServiceConnectionsSetCred { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Fugit enim et sint consectetur ea minus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -400,7 +400,7 @@ func BuildCreateMetaAdsPayload(lfxV2CampaignServiceConnectionsCreateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n },\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -463,7 +463,7 @@ func BuildUpdateMetaAdsPayload(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Harum et minus voluptas.\",\n \"label\": \"Alias non sequi consequatur dolorum.\",\n \"page_id\": \"Voluptatem voluptas omnis est tempora ipsum aut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -548,7 +548,7 @@ func BuildSetCredentialMetaAdsPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Debitis labore aut.\",\n \"app_secret\": \"Porro ab id necessitatibus consequatur natus tempora.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -586,7 +586,7 @@ func BuildCreateRedditAdsPayload(lfxV2CampaignServiceConnectionsCreateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n },\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -650,7 +650,7 @@ func BuildUpdateRedditAdsPayload(lfxV2CampaignServiceConnectionsUpdateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aliquam consequuntur quo aliquid ducimus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -736,7 +736,7 @@ func BuildSetCredentialRedditAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Facilis facilis aut suscipit aut odio iste.\",\n \"client_secret\": \"Deleniti earum magni quibusdam.\",\n \"refresh_token\": \"Tenetur velit quaerat aut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -774,7 +774,7 @@ func BuildCreateTwitterAdsPayload(lfxV2CampaignServiceConnectionsCreateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n },\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n },\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -838,7 +838,7 @@ func BuildUpdateTwitterAdsPayload(lfxV2CampaignServiceConnectionsUpdateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Commodi architecto unde rerum quisquam ut.\",\n \"label\": \"Quo sit iusto laudantium voluptates neque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -924,7 +924,7 @@ func BuildSetCredentialTwitterAdsPayload(lfxV2CampaignServiceConnectionsSetCrede { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Amet et eaque.\",\n \"access_token_secret\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_key\": \"Neque ipsum nihil cumque repellendus.\",\n \"consumer_secret\": \"Soluta aut sed quibusdam reiciendis qui vel.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -962,7 +962,7 @@ func BuildCreateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsCreateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n },\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n },\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1027,7 +1027,7 @@ func BuildUpdateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsUpdateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Error laudantium.\",\n \"customer_id\": \"Similique odio adipisci dolore iste.\",\n \"label\": \"Non nostrum dolorum iure eaque animi.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1114,7 +1114,7 @@ func BuildSetCredentialMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsSetCre { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Error necessitatibus et autem doloribus est.\",\n \"client_secret\": \"Maxime labore illo maxime provident.\",\n \"developer_token\": \"Dignissimos necessitatibus consequuntur.\",\n \"refresh_token\": \"Repudiandae voluptatem vitae iste maxime modi laborum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -1151,7 +1151,7 @@ func BuildCreateHubspotPayload(lfxV2CampaignServiceConnectionsCreateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1214,7 +1214,7 @@ func BuildUpdateHubspotPayload(lfxV2CampaignServiceConnectionsUpdateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Sed omnis.\",\n \"brand_kit\": \"Sed maiores qui sed exercitationem quam.\",\n \"label\": \"Ut amet nostrum laborum minima ipsum.\",\n \"portal_id\": \"Aut id in.\",\n \"sender_email\": \"Et magnam cumque quasi magni ducimus.\",\n \"sender_name\": \"Suscipit sed minus soluta quasi.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1299,7 +1299,7 @@ func BuildSetCredentialHubspotPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Non sint praesentium quia.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 4c590708..f63347da 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Ut voluptas et accusamus natus."},"id":{"type":"string","description":"Brief UUID","example":"Quasi voluptatum officia quod."},"platforms":{"type":"array","items":{"type":"string","example":"Architecto vero quisquam vero labore laudantium maiores."},"description":"Suggested default platforms","example":["Dignissimos consequatur.","Qui minima."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi aperiam."},"project_id":{"type":"string","description":"Owning project","example":"Amet quia inventore est quia enim illo."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam et officia sequi et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1640913123388047084,"format":"int64"}},"example":{"event_slug":"Autem recusandae totam.","id":"Tempora voluptatem sed quia excepturi dolores.","platforms":["Necessitatibus veritatis amet ut rerum quidem ut.","Velit quo.","Modi reiciendis aliquam.","Quidem explicabo expedita sunt."],"program_type":"Officia quidem non qui voluptates natus cum.","project_id":"Delectus voluptatem voluptas ullam dolores rem.","status":"archived","url":"Rerum nisi.","version":7840037444703092578},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et adipisci cumque molestiae eos."},"event_details":{"description":"Extracted event/course details","example":"Quisquam sed."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quia est aspernatur possimus exercitationem."},"keywords":{"description":"Keyword list","example":"Aut iusto quos impedit eos."},"platforms":{"type":"array","items":{"type":"string","example":"Cumque totam nulla aut reprehenderit."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Rerum error incidunt voluptas.","Quaerat est nobis saepe fugit.","Fuga rem.","Corrupti et."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Adipisci rerum consequatur placeat ea odio."},"url":{"type":"string","description":"Event/course page URL","example":"Quo quidem."}},"example":{"copy":"Aliquam vero ducimus.","event_details":"Voluptas aspernatur aperiam.","event_slug":"Nesciunt ipsum et.","keywords":"Recusandae aut perferendis.","platforms":["Maxime maxime porro enim.","Nobis itaque est enim magnam pariatur.","Est totam qui praesentium ipsam officiis cum.","Recusandae est adipisci ullam pariatur."],"program_type":"membership","targeting":"Est eaque ipsam harum nisi nobis.","url":"Dolorum eveniet qui alias ea."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Alias ad voluptatem accusantium tempore impedit."},"campaign_name":{"type":"string","description":"Campaign name","example":"Excepturi saepe sit vel perspiciatis neque."},"id":{"type":"string","description":"Campaign UUID","example":"Numquam quidem qui."},"platform":{"type":"string","description":"Channel","example":"Et expedita itaque quos."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quos accusantium fugit."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam possimus dolor facere velit dolores."},"status":{"type":"string","description":"Campaign status","example":"Qui molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":33967422648266414,"format":"int64"}},"example":{"brief_id":"Modi nobis aliquid rerum consequatur officiis velit.","campaign_name":"Quos cum porro architecto.","id":"Minus dolor accusantium dolores cum molestias.","platform":"Dolores assumenda accusantium mollitia fugiat dolore similique.","platform_campaign_id":"Omnis voluptates quaerat.","project_id":"Voluptatibus quis adipisci aut rerum ut blanditiis.","status":"Aperiam doloribus aut.","version":6898451533262184218},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Consequatur non cumque laudantium quod modi voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Platforms to create campaigns on (binding selection)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]}},"example":{"config":"Est voluptas sequi.","platforms":["Dicta et ad non quia.","Voluptatibus tempora possimus consequatur est.","Nihil et laudantium."]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Placeat cumque iure veritatis cumque nisi."},"config":{"description":"Campaign configuration snapshot","example":"Natus placeat esse est in deserunt aliquid."},"status":{"type":"string","description":"Campaign status","example":"Distinctio ipsum ab."}},"example":{"campaign_name":"Explicabo doloremque.","config":"Id ipsa perspiciatis sunt ut velit.","status":"Sed et odio sunt totam incidunt."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur qui molestiae velit ratione nesciunt et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Neque ut rerum facilis quia molestiae ratione."},"label":{"type":"string","description":"Optional friendly name","example":"Ut mollitia accusantium dignissimos."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Illum ratione voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Fugit provident officia officiis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4206253090509603863,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Et eveniet."},"platforms":{"type":"array","items":{"type":"string","example":"Ut non odio eius sed."},"description":"Platforms this job will create on","example":["Perspiciatis nihil.","Mollitia tempora minima voluptas.","Facere aut facilis porro dolor ipsa."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Aut hic.","platforms":["Et exercitationem aut.","Deleniti odit rerum quidem accusamus.","Provident provident.","Odit iusto ad animi eos doloribus autem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Dolore suscipit reprehenderit."},"job_id":{"type":"string","description":"Job UUID","example":"Aut mollitia aut molestiae exercitationem et."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Perspiciatis quisquam perferendis autem ut alias quis."},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Quod et aut consequatur inventore enim reiciendis.","job_id":"Aut animi laudantium ullam.","result":"Et id laboriosam nihil.","status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Iusto velit quo voluptatibus modi reiciendis aliquam."},"event_details":{"description":"Extracted event/course details","example":"Odit necessitatibus veritatis amet ut rerum quidem."},"event_slug":{"type":"string","description":"Event/course slug","example":"Eos voluptatibus."},"id":{"type":"string","description":"Brief UUID","example":"Vero quisquam."},"keywords":{"description":"Keyword list","example":"Quidem explicabo expedita sunt."},"platforms":{"type":"array","items":{"type":"string","example":"Ex delectus."},"description":"Suggested default platforms","example":["Ullam dolores rem.","Officia quidem non qui voluptates natus cum.","Autem recusandae totam.","Rerum nisi."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis reiciendis dignissimos consequatur iste qui minima."},"project_id":{"type":"string","description":"Owning project","example":"Labore laudantium."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Similique deserunt iusto."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptatem sed quia excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8240116664126121650,"format":"int64"}},"example":{"copy":"Placeat ea odio ea eos.","event_details":"Non adipisci rerum.","event_slug":"Adipisci quaerat est nobis.","id":"Possimus exercitationem repellendus quo quidem.","keywords":"Ipsum et delectus dolorum eveniet.","platforms":["Veritatis quisquam sed ratione et.","Cumque molestiae eos rem aut.","Quos impedit."],"program_type":"Illum rerum error incidunt.","project_id":"Cumque totam nulla aut reprehenderit.","status":"approved","targeting":"Alias ea quibusdam.","url":"Fugit non fuga rem adipisci.","version":8901460428935487189},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et eveniet."},"event_details":{"description":"Extracted event/course details","example":"Est eaque ipsam harum nisi nobis."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Enim dolorum nobis itaque est enim."},"keywords":{"description":"Keyword list","example":"Corporis ut non."},"platforms":{"type":"array","items":{"type":"string","example":"Praesentium ipsam officiis cum ipsum recusandae."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Ullam pariatur ex voluptas aspernatur.","Voluptates aliquam vero ducimus.","Recusandae aut perferendis."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eius sed qui deserunt perspiciatis nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Pariatur explicabo est totam."}},"example":{"copy":"Provident provident.","event_details":"Odit rerum quidem accusamus.","event_slug":"Tempora minima voluptas quod facere aut.","keywords":"Odit iusto ad animi eos doloribus autem.","platforms":["Hic quis facere exercitationem.","Exercitationem aut eaque."],"program_type":"membership","targeting":"Sed voluptatum laborum.","url":"Porro dolor ipsa."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut rerum ut blanditiis dolor."},"id":{"type":"string","description":"Campaign UUID","example":"Voluptatibus quos accusantium fugit."},"platform":{"type":"string","description":"Channel","example":"Molestiae minus dolor accusantium."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Cum molestias fuga voluptatibus quis."},"project_id":{"type":"string","description":"Owning project","example":"Excepturi saepe sit vel perspiciatis neque."},"status":{"type":"string","description":"Campaign status","example":"Nobis aliquid rerum consequatur officiis velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8006615023617839427,"format":"int64"}},"example":{"brief_id":"Omnis voluptates quaerat.","campaign_name":"Beatae placeat cumque iure veritatis cumque.","id":"Assumenda accusantium.","platform":"Quos cum porro architecto.","platform_campaign_id":"Aperiam doloribus aut.","project_id":"Fugiat dolore similique.","status":"Ex distinctio ipsum ab assumenda natus.","version":5157498100002718362},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Velit dolores eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"reddit-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["google-ads","linkedin-ads","hubspot","hubspot"]}},"example":{"config":"Est et expedita itaque.","platforms":["reddit-ads","microsoft-ads","microsoft-ads","reddit-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Est in deserunt."},"config":{"description":"Campaign configuration snapshot","example":"Odio sunt totam."},"status":{"type":"string","description":"Campaign status","example":"Omnis explicabo doloremque et sed."}},"example":{"campaign_name":"Sunt id ipsa perspiciatis sunt.","config":"Impedit at perspiciatis quisquam perferendis.","status":"Velit voluptatibus aut mollitia aut molestiae exercitationem."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Suscipit ut mollitia accusantium dignissimos numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Ratione nesciunt."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Qui molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6319115309163667798,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Suscipit quas sunt eos nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Qui maiores aut reiciendis ullam."},"description":"Platforms this job will create on","example":["Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur non cumque laudantium quod modi voluptas.","platforms":["Et ad.","Quia dolores voluptatibus tempora possimus consequatur.","Unde nihil et.","Quod est voluptas sequi voluptatem numquam."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Nihil ea quod et aut."},"job_id":{"type":"string","description":"Job UUID","example":"Ut alias quis nihil dolore suscipit reprehenderit."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Animi laudantium ullam omnis autem et id."},"status":{"type":"string","description":"Job status","example":"failed","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Molestiae ratione officia fugit provident officia.","job_id":"Inventore enim reiciendis.","result":"Ut rerum facilis.","status":"failed"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 27ad3dea..8e0d6c4a 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -132,6 +132,13 @@ paths: ETag: description: ETag header value (mirrors version) type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message "404": description: Not Found response. schema: @@ -292,6 +299,13 @@ paths: responses: "204": description: No Content response. + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message "404": description: Not Found response. schema: @@ -363,6 +377,13 @@ paths: ETag: description: ETag header value (mirrors version) type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message "404": description: Not Found response. schema: @@ -517,6 +538,13 @@ paths: ETag: description: ETag header value (mirrors version) type: string + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message "404": description: Not Found response. schema: @@ -3335,6 +3363,13 @@ paths: required: - job_id - status + "400": + description: Bad Request response. + schema: + $ref: '#/definitions/BadRequestError' + required: + - code + - message "404": description: Not Found response. schema: @@ -3391,61 +3426,78 @@ definitions: title: Brief type: object properties: + copy: + description: Ad copy + example: Iusto velit quo voluptatibus modi reiciendis aliquam. + event_details: + description: Extracted event/course details + example: Odit necessitatibus veritatis amet ut rerum quidem. event_slug: type: string description: Event/course slug - example: Ut voluptas et accusamus natus. + example: Eos voluptatibus. id: type: string description: Brief UUID - example: Quasi voluptatum officia quod. + example: Vero quisquam. + keywords: + description: Keyword list + example: Quidem explicabo expedita sunt. platforms: type: array items: type: string - example: Architecto vero quisquam vero labore laudantium maiores. + example: Ex delectus. description: Suggested default platforms example: - - Dignissimos consequatur. - - Qui minima. + - Ullam dolores rem. + - Officia quidem non qui voluptates natus cum. + - Autem recusandae totam. + - Rerum nisi. program_type: type: string description: Funnel context - example: Eligendi aperiam. + example: Facilis reiciendis dignissimos consequatur iste qui minima. project_id: type: string description: Owning project - example: Amet quia inventore est quia enim illo. + example: Labore laudantium. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived + targeting: + description: Targeting recommendation + example: Similique deserunt iusto. url: type: string description: Event/course page URL - example: Aliquam et officia sequi et. + example: Voluptatem sed quia excepturi. version: type: integer description: Optimistic-concurrency version - example: 1640913123388047084 + example: 8240116664126121650 format: int64 example: - event_slug: Autem recusandae totam. - id: Tempora voluptatem sed quia excepturi dolores. + copy: Placeat ea odio ea eos. + event_details: Non adipisci rerum. + event_slug: Adipisci quaerat est nobis. + id: Possimus exercitationem repellendus quo quidem. + keywords: Ipsum et delectus dolorum eveniet. platforms: - - Necessitatibus veritatis amet ut rerum quidem ut. - - Velit quo. - - Modi reiciendis aliquam. - - Quidem explicabo expedita sunt. - program_type: Officia quidem non qui voluptates natus cum. - project_id: Delectus voluptatem voluptas ullam dolores rem. - status: archived - url: Rerum nisi. - version: 7840037444703092578 + - Veritatis quisquam sed ratione et. + - Cumque molestiae eos rem aut. + - Quos impedit. + program_type: Illum rerum error incidunt. + project_id: Cumque totam nulla aut reprehenderit. + status: approved + targeting: Alias ea quibusdam. + url: Fugit non fuga rem adipisci. + version: 8901460428935487189 required: - id - project_id @@ -3459,56 +3511,53 @@ definitions: properties: copy: description: Ad copy - example: Et adipisci cumque molestiae eos. + example: Et eveniet. event_details: description: Extracted event/course details - example: Quisquam sed. + example: Est eaque ipsam harum nisi nobis. event_slug: type: string description: Event/course slug (unique within the project) - example: Quia est aspernatur possimus exercitationem. + example: Enim dolorum nobis itaque est enim. keywords: description: Keyword list - example: Aut iusto quos impedit eos. + example: Corporis ut non. platforms: type: array items: type: string - example: Cumque totam nulla aut reprehenderit. + example: Praesentium ipsam officiis cum ipsum recusandae. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Rerum error incidunt voluptas. - - Quaerat est nobis saepe fugit. - - Fuga rem. - - Corrupti et. + - Ullam pariatur ex voluptas aspernatur. + - Voluptates aliquam vero ducimus. + - Recusandae aut perferendis. program_type: type: string description: Funnel context - example: education + example: events enum: - events - education - membership targeting: description: Targeting recommendation - example: Adipisci rerum consequatur placeat ea odio. + example: Eius sed qui deserunt perspiciatis nihil. url: type: string description: Event/course page URL - example: Quo quidem. + example: Pariatur explicabo est totam. example: - copy: Aliquam vero ducimus. - event_details: Voluptas aspernatur aperiam. - event_slug: Nesciunt ipsum et. - keywords: Recusandae aut perferendis. + copy: Provident provident. + event_details: Odit rerum quidem accusamus. + event_slug: Tempora minima voluptas quod facere aut. + keywords: Odit iusto ad animi eos doloribus autem. platforms: - - Maxime maxime porro enim. - - Nobis itaque est enim magnam pariatur. - - Est totam qui praesentium ipsam officiis cum. - - Recusandae est adipisci ullam pariatur. + - Hic quis facere exercitationem. + - Exercitationem aut eaque. program_type: membership - targeting: Est eaque ipsam harum nisi nobis. - url: Dolorum eveniet qui alias ea. + targeting: Sed voluptatum laborum. + url: Porro dolor ipsa. required: - program_type - event_slug @@ -3519,45 +3568,45 @@ definitions: brief_id: type: string description: Parent brief - example: Alias ad voluptatem accusantium tempore impedit. + example: Qui molestias. campaign_name: type: string description: Campaign name - example: Excepturi saepe sit vel perspiciatis neque. + example: Aut rerum ut blanditiis dolor. id: type: string description: Campaign UUID - example: Numquam quidem qui. + example: Voluptatibus quos accusantium fugit. platform: type: string description: Channel - example: Et expedita itaque quos. + example: Molestiae minus dolor accusantium. platform_campaign_id: type: string description: ID returned by the ad platform - example: Quos accusantium fugit. + example: Cum molestias fuga voluptatibus quis. project_id: type: string description: Owning project - example: Laboriosam possimus dolor facere velit dolores. + example: Excepturi saepe sit vel perspiciatis neque. status: type: string description: Campaign status - example: Qui molestias. + example: Nobis aliquid rerum consequatur officiis velit. version: type: integer description: Optimistic-concurrency version - example: 33967422648266414 + example: 8006615023617839427 format: int64 example: - brief_id: Modi nobis aliquid rerum consequatur officiis velit. - campaign_name: Quos cum porro architecto. - id: Minus dolor accusantium dolores cum molestias. - platform: Dolores assumenda accusantium mollitia fugiat dolore similique. - platform_campaign_id: Omnis voluptates quaerat. - project_id: Voluptatibus quis adipisci aut rerum ut blanditiis. - status: Aperiam doloribus aut. - version: 6898451533262184218 + brief_id: Omnis voluptates quaerat. + campaign_name: Beatae placeat cumque iure veritatis cumque. + id: Assumenda accusantium. + platform: Quos cum porro architecto. + platform_campaign_id: Aperiam doloribus aut. + project_id: Fugiat dolore similique. + status: Ex distinctio ipsum ab assumenda natus. + version: 5157498100002718362 required: - id - project_id @@ -3572,24 +3621,33 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Consequatur non cumque laudantium quod modi voluptas. + example: Velit dolores eligendi. platforms: type: array items: type: string - example: Sed voluptatum laborum. + example: reddit-ads + enum: + - google-ads + - linkedin-ads + - meta-ads + - reddit-ads + - twitter-ads + - microsoft-ads + - hubspot description: Platforms to create campaigns on (binding selection) example: - - Quas sunt eos nulla et perferendis qui. - - Aut reiciendis ullam laborum. - - Et quidem nisi quasi. - - Ab deserunt quia magnam temporibus minus et. + - google-ads + - linkedin-ads + - hubspot + - hubspot example: - config: Est voluptas sequi. + config: Est et expedita itaque. platforms: - - Dicta et ad non quia. - - Voluptatibus tempora possimus consequatur est. - - Nihil et laudantium. + - reddit-ads + - microsoft-ads + - microsoft-ads + - reddit-ads required: - platforms CampaignUpdateInput: @@ -3599,18 +3657,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Placeat cumque iure veritatis cumque nisi. + example: Est in deserunt. config: description: Campaign configuration snapshot - example: Natus placeat esse est in deserunt aliquid. + example: Odio sunt totam. status: type: string description: Campaign status - example: Distinctio ipsum ab. + example: Omnis explicabo doloremque et sed. example: - campaign_name: Explicabo doloremque. - config: Id ipsa perspiciatis sunt ut velit. - status: Sed et odio sunt totam incidunt. + campaign_name: Sunt id ipsa perspiciatis sunt. + config: Impedit at perspiciatis quisquam perferendis. + status: Velit voluptatibus aut mollitia aut molestiae exercitationem. required: - campaign_name - status @@ -3676,7 +3734,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Consequatur qui molestiae velit ratione nesciunt et. + example: Reiciendis rerum. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3684,23 +3742,23 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Neque ut rerum facilis quia molestiae ratione. + example: Suscipit ut mollitia accusantium dignissimos numquam. label: type: string description: Optional friendly name - example: Ut mollitia accusantium dignissimos. + example: Ratione nesciunt. login_customer_id: type: string description: Manager account used for API access - example: Illum ratione voluptate mollitia. + example: Voluptate mollitia. project_id: type: string description: Owning project - example: Fugit provident officia officiis. + example: Qui molestiae. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -3709,7 +3767,7 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4206253090509603863 + example: 6319115309163667798 format: int64 example: account_id: Quisquam incidunt qui. @@ -3929,17 +3987,16 @@ definitions: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Et eveniet. + example: Suscipit quas sunt eos nulla. platforms: type: array items: type: string - example: Ut non odio eius sed. + example: Qui maiores aut reiciendis ullam. description: Platforms this job will create on example: - - Perspiciatis nihil. - - Mollitia tempora minima voluptas. - - Facere aut facilis porro dolor ipsa. + - Et quidem nisi quasi. + - Ab deserunt quia magnam temporibus minus et. status: type: string description: Initial status (always 'queued' on create) @@ -3947,12 +4004,12 @@ definitions: enum: - queued example: - job_id: Aut hic. + job_id: Consequatur non cumque laudantium quod modi voluptas. platforms: - - Et exercitationem aut. - - Deleniti odit rerum quidem accusamus. - - Provident provident. - - Odit iusto ad animi eos doloribus autem. + - Et ad. + - Quia dolores voluptatibus tempora possimus consequatur. + - Unde nihil et. + - Quod est voluptas sequi voluptatem numquam. status: queued required: - job_id @@ -3964,18 +4021,18 @@ definitions: error: type: string description: Terminal error, if any - example: Dolore suscipit reprehenderit. + example: Nihil ea quod et aut. job_id: type: string description: Job UUID - example: Aut mollitia aut molestiae exercitationem et. + example: Ut alias quis nihil dolore suscipit reprehenderit. result: description: Per-platform results, written once when the job reaches a terminal state - example: Perspiciatis quisquam perferendis autem ut alias quis. + example: Animi laudantium ullam omnis autem et id. status: type: string description: Job status - example: queued + example: failed enum: - queued - running @@ -3983,10 +4040,10 @@ definitions: - partial - failed example: - error: Quod et aut consequatur inventore enim reiciendis. - job_id: Aut animi laudantium ullam. - result: Et id laboriosam nihil. - status: partial + error: Molestiae ratione officia fugit provident officia. + job_id: Inventore enim reiciendis. + result: Ut rerum facilis. + status: failed required: - job_id - status @@ -3998,17 +4055,16 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Mollitia molestiae saepe qui ex commodi. - event_details: Quia ut atque. - event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. - keywords: Expedita unde molestiae. + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. platforms: - - Vel nobis non molestias non. - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. + - Molestiae saepe qui. + - Commodi voluptatem expedita. program_type: membership - targeting: Voluptas dolor et incidunt pariatur quod odit. - url: Nesciunt unde ullam occaecati maxime. + targeting: Facilis iste. + url: Quia ut atque. required: - brief LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: @@ -4019,11 +4075,12 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Eligendi earum qui est et id laudantium. + config: Est voluptatum enim earum et doloribus. platforms: - - Ea magnam ut nihil quo tenetur. - - Fugiat natus. - - Et tempore. + - hubspot + - meta-ads + - reddit-ads + - twitter-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4034,17 +4091,16 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Mollitia molestiae saepe qui ex commodi. - event_details: Quia ut atque. - event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. - keywords: Expedita unde molestiae. + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. platforms: - - Vel nobis non molestias non. - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. + - Molestiae saepe qui. + - Commodi voluptatem expedita. program_type: membership - targeting: Voluptas dolor et incidunt pariatur quod odit. - url: Nesciunt unde ullam occaecati maxime. + targeting: Facilis iste. + url: Quia ut atque. required: - brief LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: @@ -4055,9 +4111,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Hic voluptas debitis error. - config: Ut consectetur. - status: Veniam eum ut libero quibusdam debitis. + campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. + config: Error similique. + status: Maxime fugiat illo. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4074,10 +4130,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ex ea ullam corrupti. - client_secret: Et omnis accusantium. - developer_token: Iure modi asperiores ut. - refresh_token: Consectetur sint nesciunt. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - config - credentials @@ -4091,14 +4147,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Sed omnis. - brand_kit: Sed maiores qui sed exercitationem quam. - label: Ut amet nostrum laborum minima ipsum. - portal_id: Aut id in. - sender_email: Et magnam cumque quasi magni ducimus. - sender_name: Suscipit sed minus soluta quasi. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. credentials: - private_app_token: Non sint praesentium quia. + private_app_token: Distinctio aut. required: - config - credentials @@ -4113,10 +4169,10 @@ definitions: example: config: account_id: "538170226" - label: Ratione sunt nostrum tenetur repellendus dolorem cum. + label: Tempora error rerum quae nihil. org_id: "208777" credentials: - access_token: Fugit enim et sint consectetur ea minus. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - config - credentials @@ -4131,12 +4187,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Harum et minus voluptas. - label: Alias non sequi consequatur dolorum. - page_id: Voluptatem voluptas omnis est tempora ipsum aut. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. credentials: - access_token: Debitis labore aut. - app_secret: Porro ab id necessitatibus consequatur natus tempora. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - config - credentials @@ -4150,14 +4206,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Error laudantium. - customer_id: Similique odio adipisci dolore iste. - label: Non nostrum dolorum iure eaque animi. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. credentials: - client_id: Error necessitatibus et autem doloribus est. - client_secret: Maxime labore illo maxime provident. - developer_token: Dignissimos necessitatibus consequuntur. - refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. required: - config - credentials @@ -4172,11 +4228,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Aliquam consequuntur quo aliquid ducimus. + label: Provident quia distinctio. credentials: - client_id: Facilis facilis aut suscipit aut odio iste. - client_secret: Deleniti earum magni quibusdam. - refresh_token: Tenetur velit quaerat aut. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - config - credentials @@ -4191,13 +4247,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Commodi architecto unde rerum quisquam ut. - label: Quo sit iusto laudantium voluptates neque. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. credentials: - access_token: Amet et eaque. - access_token_secret: Consequatur iste sed illo adipisci sunt. - consumer_key: Neque ipsum nihil cumque repellendus. - consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - config - credentials @@ -4209,10 +4265,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Ex ea ullam corrupti. - client_secret: Et omnis accusantium. - developer_token: Iure modi asperiores ut. - refresh_token: Consectetur sint nesciunt. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4223,7 +4279,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Non sint praesentium quia. + private_app_token: Distinctio aut. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4234,7 +4290,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Fugit enim et sint consectetur ea minus. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4245,8 +4301,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Debitis labore aut. - app_secret: Porro ab id necessitatibus consequatur natus tempora. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4257,10 +4313,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Error necessitatibus et autem doloribus est. - client_secret: Maxime labore illo maxime provident. - developer_token: Dignissimos necessitatibus consequuntur. - refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4271,9 +4327,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Facilis facilis aut suscipit aut odio iste. - client_secret: Deleniti earum magni quibusdam. - refresh_token: Tenetur velit quaerat aut. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4284,10 +4340,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Amet et eaque. - access_token_secret: Consequatur iste sed illo adipisci sunt. - consumer_key: Neque ipsum nihil cumque repellendus. - consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4311,12 +4367,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Sed omnis. - brand_kit: Sed maiores qui sed exercitationem quam. - label: Ut amet nostrum laborum minima ipsum. - portal_id: Aut id in. - sender_email: Et magnam cumque quasi magni ducimus. - sender_name: Suscipit sed minus soluta quasi. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4328,7 +4384,7 @@ definitions: example: config: account_id: "538170226" - label: Ratione sunt nostrum tenetur repellendus dolorem cum. + label: Tempora error rerum quae nihil. org_id: "208777" required: - config @@ -4341,9 +4397,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Harum et minus voluptas. - label: Alias non sequi consequatur dolorum. - page_id: Voluptatem voluptas omnis est tempora ipsum aut. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4354,9 +4410,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Error laudantium. - customer_id: Similique odio adipisci dolore iste. - label: Non nostrum dolorum iure eaque animi. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4368,7 +4424,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Aliquam consequuntur quo aliquid ducimus. + label: Provident quia distinctio. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4380,8 +4436,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Commodi architecto unde rerum quisquam ut. - label: Quo sit iusto laudantium voluptates neque. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. required: - config LinkedinAdsConnection: diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index ebc452f3..70d86339 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nisi est sint consequuntur omnis."},"example":"Neque sed alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"event_slug":"Nemo perspiciatis et qui aliquam doloremque itaque.","id":"Voluptatem cupiditate voluptas aliquam facilis iste sed.","platforms":["Tenetur quia totam magni.","Repellat alias ex.","Nihil quos quo eum.","Iure praesentium ea quis."],"program_type":"Sed exercitationem ut totam ut minus.","project_id":"Laboriosam tempore vero voluptatum a quos.","status":"archived","url":"Magni autem.","version":9009752361610175063}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsum quo possimus."},"example":"Quam culpa."}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Id ducimus excepturi est et est."},"example":"Deleniti non in iure dolores et quis."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae similique assumenda ut quia."},"example":"Nam eius nulla suscipit ullam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"event_slug":"Provident itaque.","id":"Ut est nobis aspernatur.","platforms":["Cupiditate rerum magni incidunt.","Est perspiciatis soluta voluptas est.","Hic vero et.","Ut ea alias."],"program_type":"Ea enim quidem odio et sequi consequatur.","project_id":"Fugit qui tempora commodi reiciendis sit alias.","status":"draft","url":"Voluptas et accusamus quia et officiis ipsum.","version":5012609352100951313}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Corrupti sint molestiae occaecati est."},"example":"Labore est ut ratione nobis ut occaecati."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima veritatis sed impedit laborum."},"example":"Totam non qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"event_slug":"Accusantium quaerat voluptatem iure vero quam consequatur.","id":"Voluptas voluptatibus deleniti sit dolorum.","platforms":["Ex eveniet soluta adipisci occaecati.","Pariatur vero est quaerat id.","Repudiandae veniam soluta alias natus aut."],"program_type":"Illo quaerat.","project_id":"Quibusdam ut amet iusto provident sequi.","status":"approved","url":"Tempore voluptatibus quo.","version":8063317454231389303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sed magnam sed vero nulla."},"example":"Vel et et iure tempora."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum perspiciatis autem."},"example":"Sunt labore voluptate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"event_slug":"Officia et pariatur molestias autem ratione.","id":"Et ratione sit.","platforms":["Et quod porro.","Minus illo rerum ut culpa totam sequi."],"program_type":"A omnis veritatis omnis.","project_id":"Sed ipsum quia.","status":"draft","url":"Ut et veniam maiores.","version":4401871562627166296}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"example":"Consequatur laborum."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Tempora veritatis harum ab nobis fuga atque.","platforms":["Laboriosam maxime facere culpa modi.","Quod blanditiis et.","Est dolorem eos amet dolorem sed.","Architecto provident id quia porro."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Beatae non et excepturi sit minus."},"example":"Et quisquam dicta."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Eaque enim est libero enim quo."},"example":"Aut tempora dolorem neque assumenda sed."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur ipsam consequatur qui illo totam fuga."},"example":"Qui non illum expedita commodi in dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Id ducimus eius et laboriosam omnis vitae.","campaign_name":"Labore iste voluptates quos.","id":"Est voluptatum enim earum et doloribus.","platform":"Voluptatem quas non voluptas ut.","platform_campaign_id":"Modi rerum sint.","project_id":"Ea consequatur et ut.","status":"Dolorem dolor fugiat quia.","version":5825706568637163425}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Similique eaque autem impedit tenetur voluptatibus."},"example":"Libero quia quam harum molestiae cupiditate."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Et eum ex doloremque quia."},"example":"Adipisci vel."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum itaque."},"example":"Et iusto doloremque odio."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Harum distinctio reiciendis architecto atque maxime soluta.","campaign_name":"Est ut ut alias ullam fugiat deserunt.","id":"Accusantium sunt culpa libero quisquam.","platform":"Ducimus porro maxime.","platform_campaign_id":"Illo ipsam error similique quaerat.","project_id":"Rerum amet aut tempora recusandae aspernatur.","status":"Nihil iusto temporibus voluptas.","version":6352110138661359662}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ratione est omnis voluptas praesentium."},"example":"Laboriosam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Consequatur quos atque voluptates quo sit.","has_credentials":false,"id":"Autem veniam.","label":"Quam sed rem quia consequuntur ut.","login_customer_id":"Dolorum est aut blanditiis quidem qui.","project_id":"Enim unde omnis.","status":"inactive","version":8150234719088577779}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum debitis."},"example":"Occaecati quam nostrum quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quibusdam magni et rerum sed voluptatum nesciunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non dolorum odit est.","brand_kit":"Natus veritatis sint autem necessitatibus.","has_credentials":false,"id":"Tempore quo quae aut culpa impedit.","label":"Aperiam dolorem molestias natus velit.","portal_id":"Et magni adipisci magnam veniam.","project_id":"Quibusdam nulla.","sender_email":"Labore qui.","sender_name":"Et corporis architecto dolorem sapiente repellendus.","status":"deleted","version":5377129987312416334}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Totam tempora quod expedita."},"example":"Dignissimos fugiat voluptatibus natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Consequuntur omnis a dignissimos voluptate.","brand_kit":"Ab voluptatem esse.","has_credentials":false,"id":"Doloremque architecto ea et.","label":"Aliquid et in.","portal_id":"Est iste.","project_id":"Asperiores facere et exercitationem soluta possimus.","sender_email":"Ad esse neque earum modi.","sender_name":"Quis possimus placeat.","status":"inactive","version":3236501119949951161}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Dolor id.","brand_kit":"Ex id ut aut.","has_credentials":false,"id":"Modi velit vitae optio ut et consequuntur.","label":"Debitis soluta sed quod dicta aperiam eveniet.","portal_id":"Corrupti esse mollitia distinctio saepe rerum.","project_id":"Libero autem ut.","sender_email":"Eum et qui aut consequatur ut.","sender_name":"Harum maxime voluptas expedita.","status":"inactive","version":5643656240528764613}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Similique ut minima.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore vel quia cum."},"example":"Aut est et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Magni voluptas odio assumenda totam.","has_credentials":true,"id":"Ipsam vitae aut voluptatem.","label":"Iusto quis magni et velit.","org_id":"Officiis deleniti ipsam nam.","project_id":"Ab quam velit sapiente.","status":"deleted","version":6633489521806040497}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Itaque quo."},"example":"Aperiam et ab."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quae nihil magni.","has_credentials":true,"id":"Eum fugit repudiandae magnam ut.","label":"Aut tempora error.","org_id":"Voluptatem repudiandae laudantium expedita ut.","project_id":"Ab laboriosam quis sapiente ut sit.","status":"error","version":7519523340683479876}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis ea molestiae eum voluptatum."},"example":"Consequatur nemo molestiae modi ut non atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Facere harum enim consequatur id voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aperiam quia doloribus omnis."},"example":"Aut quia voluptates voluptates nisi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Mollitia a magni vel consequatur ea deserunt.","app_id":"Inventore aliquid voluptatibus iste mollitia.","has_credentials":true,"id":"Et corporis officia sint.","label":"Ratione quis.","page_id":"Occaecati eum tenetur.","project_id":"Ut in possimus quia nulla.","status":"error","version":2122032566439088184}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed commodi voluptatibus."},"example":"Fuga facilis asperiores enim nisi consequatur perspiciatis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quo sint dolorum vel.","app_id":"Dolores commodi aperiam voluptatibus.","has_credentials":false,"id":"Accusamus vero et voluptas accusamus sunt.","label":"Vel blanditiis sunt ut facere.","page_id":"Est non tenetur dolore.","project_id":"Rerum cupiditate.","status":"deleted","version":8886302108378029553}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Eius voluptatem molestiae qui suscipit rerum.","app_id":"Id facere maxime.","has_credentials":false,"id":"Saepe sit et sed qui dolorem reiciendis.","label":"Asperiores ipsum quam.","page_id":"Cum rem architecto vel quibusdam vel autem.","project_id":"Id tenetur exercitationem aperiam incidunt.","status":"error","version":3981571209223840207}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Delectus et maxime ut possimus expedita qui.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Minima adipisci aut quia quisquam."},"example":"Magnam nihil qui doloremque nam magnam aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Possimus dolore.","customer_id":"Vero quis consequuntur.","has_credentials":true,"id":"Autem aspernatur ea voluptatem.","label":"Dicta rerum sed perferendis.","project_id":"Voluptas eveniet assumenda accusantium aspernatur facere tempora.","status":"deleted","version":5431490552370585468}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Possimus nihil qui enim ratione voluptatem eos.","customer_id":"Debitis itaque itaque dolores nihil.","has_credentials":true,"id":"Ipsum voluptatem et quam beatae laborum omnis.","label":"Aut quis qui laudantium dolore.","project_id":"Esse aut et rem suscipit similique.","status":"inactive","version":5244933818906460264}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus accusantium expedita alias."},"example":"Iusto molestiae cupiditate quis modi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Est aut labore sint natus.","customer_id":"Quas quibusdam.","has_credentials":true,"id":"Ut fugiat magnam quia.","label":"Distinctio beatae.","project_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","status":"deleted","version":8986600307371048121}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Harum iste voluptatem et voluptatem.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et iste."},"example":"Odio eos earum fuga non est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Molestias architecto dicta quidem illo numquam.","has_credentials":false,"id":"Explicabo vero commodi.","label":"Minus ut est recusandae aspernatur eum fugit.","project_id":"Qui asperiores velit enim tempore expedita.","status":"error","version":3837864470732187499}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Exercitationem officia corrupti tempora ea."},"example":"Ipsa sint optio nobis quae corporis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Blanditiis atque rerum et officiis sapiente et.","has_credentials":true,"id":"Harum provident quia distinctio ea.","label":"Hic et sed.","project_id":"Rem harum provident provident quia laboriosam magnam.","status":"deleted","version":1429619977254656560}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Rerum reiciendis similique."},"example":"Saepe voluptatem dolores tempora qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Expedita accusantium dolorum qui sed fugiat.","has_credentials":true,"id":"Sed fugiat.","label":"Ipsam temporibus sint et necessitatibus dolorem ut.","project_id":"Eos rerum.","status":"deleted","version":3554537496380374690}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ullam temporibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Repudiandae odit."},"example":"Temporibus ipsum necessitatibus ratione possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","funding_instrument_id":"Fuga illo dolorem sit ex commodi sapiente.","has_credentials":false,"id":"Ut eveniet iusto quidem.","label":"Quaerat ut neque expedita nostrum.","project_id":"Accusamus ratione consequuntur aut et corrupti.","status":"error","version":5145245548849296683}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vero voluptates soluta."},"example":"Eligendi consequatur officia labore eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Beatae aliquam quia officiis hic ea.","funding_instrument_id":"Debitis vitae quae debitis sunt.","has_credentials":true,"id":"Aperiam et ipsam vitae.","label":"Voluptate nisi natus sint.","project_id":"Velit est quis aliquid aliquam.","status":"deleted","version":1415133980301644723}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Facilis repellat eveniet reiciendis."},"example":"Non placeat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Ut sint.","funding_instrument_id":"Rerum omnis veritatis.","has_credentials":false,"id":"Excepturi dolorem autem ipsa autem provident.","label":"Quis et odio tenetur optio.","project_id":"Iure quo culpa.","status":"inactive","version":36658389617783588}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Maxime incidunt asperiores.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsum expedita animi."},"example":"Velit at omnis autem."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Voluptas nam.","job_id":"Nesciunt asperiores et est.","result":"Facere sint totam sapiente vitae numquam ut.","status":"partial"}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos expedita voluptas qui eaque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8483228206992747737,"format":"int64"}},"example":{"etag":"Repudiandae necessitatibus dolorem enim beatae quia.","event_slug":"Consequatur in vero soluta.","id":"Laudantium nostrum ratione id eius laborum aspernatur.","platforms":["Distinctio dolore velit pariatur.","Assumenda perspiciatis dolor porro.","Et cupiditate molestiae ea ullam minima voluptatem."],"program_type":"Molestiae suscipit non iusto.","project_id":"Itaque fugit rerum cumque.","status":"draft","url":"Eius dicta.","version":5990824706789002616},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7907674416929152715,"format":"int64"}},"example":{"event_slug":"Tenetur non accusamus qui ex.","id":"Dolore est dolorem quod enim pariatur.","platforms":["Et amet sunt.","Ad quae nisi."],"program_type":"Aut architecto aliquam mollitia labore sapiente.","project_id":"Occaecati veritatis.","status":"draft","url":"Quia mollitia.","version":7441335261794230827},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Hic vel aspernatur at quam est ea."},"id":{"type":"string","description":"Brief UUID","example":"Blanditiis cum et."},"platforms":{"type":"array","items":{"type":"string","example":"Necessitatibus sit."},"description":"Suggested default platforms","example":["Aperiam deserunt nostrum consectetur.","Sed praesentium libero blanditiis qui minima.","Nulla sunt autem eos rerum provident dicta."]},"program_type":{"type":"string","description":"Funnel context","example":"Nemo nihil dolorum consequatur sed tempora qui."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum eius."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Sit dignissimos incidunt voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8003111466267168066,"format":"int64"}},"example":{"event_slug":"Veritatis itaque.","id":"Dolor dolores provident porro.","platforms":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."],"program_type":"Dolores laborum sed.","project_id":"Odio sunt esse mollitia incidunt.","status":"approved","url":"Est quis impedit.","version":9059453485160266445},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Impedit dolores."},"id":{"type":"string","description":"Brief UUID","example":"Eos iste corporis praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"At sint laborum veniam."},"description":"Suggested default platforms","example":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."]},"program_type":{"type":"string","description":"Funnel context","example":"Officia eligendi alias."},"project_id":{"type":"string","description":"Owning project","example":"Quis veniam iusto consequatur quia."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Alias minus reprehenderit dignissimos aut velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8443584423631303721,"format":"int64"}},"example":{"event_slug":"Velit quis harum recusandae est ipsum.","id":"Aperiam saepe.","platforms":["Totam voluptatem eos doloribus sint exercitationem eligendi.","Quidem sit in quia molestiae perspiciatis alias."],"program_type":"Laborum est quasi dignissimos.","project_id":"Aut animi sit esse ratione aliquid.","status":"approved","url":"Amet quaerat modi.","version":3775655592825521439},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"event_slug":{"type":"string","description":"Event/course slug","example":"Tempora voluptate fuga ea distinctio."},"id":{"type":"string","description":"Brief UUID","example":"Molestiae praesentium minus."},"platforms":{"type":"array","items":{"type":"string","example":"Eaque nesciunt."},"description":"Suggested default platforms","example":["Inventore in eligendi ipsam.","Vel atque eos reiciendis sit minima non.","Et itaque ut dolores in voluptas."]},"program_type":{"type":"string","description":"Funnel context","example":"Pariatur mollitia incidunt autem."},"project_id":{"type":"string","description":"Owning project","example":"Et consequuntur suscipit."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"url":{"type":"string","description":"Event/course page URL","example":"Mollitia aut tempore rerum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","url":"Nostrum similique omnis iste.","version":1280403017059047628},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et itaque rem eos et deleniti dolores."},"campaign_name":{"type":"string","description":"Campaign name","example":"Enim vitae officia dolorem odio."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus a."},"id":{"type":"string","description":"Campaign UUID","example":"Beatae velit laudantium error eum et aut."},"platform":{"type":"string","description":"Channel","example":"Facilis qui libero."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Facere qui omnis."},"project_id":{"type":"string","description":"Owning project","example":"Beatae harum similique corporis id eum."},"status":{"type":"string","description":"Campaign status","example":"Beatae quia qui excepturi minima."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5260218798443375074,"format":"int64"}},"example":{"brief_id":"Non quo necessitatibus.","campaign_name":"Exercitationem accusantium nihil.","etag":"Omnis doloremque at fugit dolor et.","id":"Quod sunt quae et nesciunt iure quis.","platform":"Molestiae est accusantium laudantium nostrum.","platform_campaign_id":"Dolores sit.","project_id":"Ut mollitia nihil ducimus.","status":"Quod alias ipsum voluptates pariatur magni.","version":2477378437106771259},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptatibus nihil nisi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Vitae illo consequuntur esse."},"id":{"type":"string","description":"Campaign UUID","example":"Hic ut sapiente harum aliquam sunt eum."},"platform":{"type":"string","description":"Channel","example":"Distinctio tempore qui velit omnis dolorem est."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Quia recusandae dignissimos dolore harum totam."},"project_id":{"type":"string","description":"Owning project","example":"Eaque occaecati."},"status":{"type":"string","description":"Campaign status","example":"Libero recusandae ut ullam aliquam."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4964407865557967175,"format":"int64"}},"example":{"brief_id":"Sunt deleniti.","campaign_name":"Assumenda excepturi.","id":"Consequatur minus.","platform":"Natus quia labore non ut dolores et.","platform_campaign_id":"Voluptatem ipsa.","project_id":"Iste nemo.","status":"Tempora est eveniet sequi ea.","version":4255946399444764188},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Est et magni."},"campaign_name":{"type":"string","description":"Campaign name","example":"Repellendus eveniet veritatis impedit aut iste earum."},"id":{"type":"string","description":"Campaign UUID","example":"Consequatur possimus."},"platform":{"type":"string","description":"Channel","example":"Et provident illo non quisquam iure doloremque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Ut aliquid."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sit delectus veniam."},"status":{"type":"string","description":"Campaign status","example":"Quod exercitationem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5517772416028431681,"format":"int64"}},"example":{"brief_id":"Sunt quis odio enim nam id voluptatem.","campaign_name":"Neque quia.","id":"Saepe ab qui.","platform":"Vero alias temporibus illum.","platform_campaign_id":"Ullam eaque suscipit harum.","project_id":"Ab laboriosam sunt quis omnis.","status":"Et veniam itaque optio consequatur nulla sint.","version":6009088986580236396},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut ut odio odio sed minus quia."},"platforms":{"type":"array","items":{"type":"string","example":"Vero at ut quis."},"description":"Platforms to create campaigns on (binding selection)","example":["Aut fugit alias.","Qui maiores quia non unde deserunt.","Nihil sunt doloremque."]}},"example":{"config":"Modi voluptatum veniam molestiae quibusdam.","platforms":["Architecto autem iste.","In ipsa tempore incidunt velit provident perspiciatis.","Tempore sunt itaque omnis.","Ex sunt sit beatae."]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Sit cupiditate non."},"config":{"description":"Campaign configuration snapshot","example":"Eveniet esse officia explicabo dolor deserunt."},"status":{"type":"string","description":"Campaign status","example":"Modi possimus consequatur."}},"example":{"campaign_name":"Voluptatibus aspernatur.","config":"Hic vel ut.","status":"Accusamus nam cupiditate."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Minus autem."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Debitis eum ipsa sed.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Mollitia molestiae saepe qui ex commodi.","event_details":"Quia ut atque.","event_slug":"Voluptate et corporis voluptatum occaecati quis perspiciatis.","keywords":"Expedita unde molestiae.","platforms":["Vel nobis non molestias non.","Ut expedita voluptatum sit.","Quasi voluptas corporis velit et."],"program_type":"membership","targeting":"Voluptas dolor et incidunt pariatur quod odit.","url":"Nesciunt unde ullam occaecati maxime."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Eligendi earum qui est et id laudantium.","platforms":["Ea magnam ut nihil quo tenetur.","Fugiat natus.","Et tempore."]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."},"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"},"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."},"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."},"credentials":{"client_id":"Error necessitatibus et autem doloribus est.","client_secret":"Maxime labore illo maxime provident.","developer_token":"Dignissimos necessitatibus consequuntur.","refresh_token":"Repudiandae voluptatem vitae iste maxime modi laborum."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."},"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."},"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Praesentium voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam ut sed natus et unde."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Accusamus in quod."},"project_id":{"type":"string","description":"Owning project","example":"Qui impedit temporibus eveniet eos omnis cumque."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1246943015343350087,"format":"int64"}},"example":{"account_id":"Ut quisquam nisi repellendus quos magnam.","etag":"Nihil quaerat asperiores pariatur.","has_credentials":true,"id":"Accusamus incidunt minus veritatis.","label":"Ex id corrupti sed quo perferendis.","login_customer_id":"Vel veritatis hic rerum accusamus velit error.","project_id":"Unde hic est quia pariatur odit ullam.","status":"active","version":4262114400172519549},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam eaque voluptatem omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem ut."},"label":{"type":"string","description":"Optional friendly name","example":"Qui mollitia et eum veniam."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Culpa sed minima iure."},"project_id":{"type":"string","description":"Owning project","example":"Ut recusandae modi."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2166778479612099571,"format":"int64"}},"example":{"account_id":"Soluta dolore vitae.","has_credentials":false,"id":"Enim occaecati beatae eveniet molestiae ad voluptatum.","label":"Quaerat et eius culpa magni illum consequatur.","login_customer_id":"Asperiores et maiores reiciendis laudantium dolor ipsam.","project_id":"Accusantium et.","status":"error","version":2560433690780116012},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maxime nesciunt repellendus."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium odit rerum commodi ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Magnam atque ullam qui rerum numquam quo."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem aut debitis vitae unde velit eos."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1674128305180380972,"format":"int64"}},"example":{"account_id":"Perferendis omnis ad voluptas esse.","has_credentials":false,"id":"A quia magnam culpa ipsam totam.","label":"Sequi aut veniam ratione.","login_customer_id":"Quidem quo et enim totam et.","project_id":"Quaerat molestias.","status":"inactive","version":7506513470866505325},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"In praesentium cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolorem sit."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas necessitatibus cumque non porro qui molestias."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptatum mollitia nulla perferendis possimus."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6176866709241070937,"format":"int64"}},"example":{"account_id":"Fuga atque.","has_credentials":true,"id":"Iure et.","label":"Qui omnis nesciunt qui consequuntur.","login_customer_id":"Odit provident sed quo aperiam.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"inactive","version":5760426389627270301},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Et vel beatae molestiae fuga."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Vitae consequatur eos."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Dolores quidem necessitatibus voluptatem consequatur sit."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Labore quia esse consectetur tenetur eum.","client_secret":"Aut ut sit nisi architecto.","developer_token":"Rerum et recusandae possimus quis.","refresh_token":"Sed corrupti sit."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor molestiae quia voluptatem deserunt libero."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Non illo ab in voluptatem minus est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas tenetur esse."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat ipsa voluptatem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Aut impedit a veritatis."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda sed minima nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Consequuntur sed ea sunt debitis."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptas qui voluptas veniam sint voluptas."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1552956989772584247,"format":"int64"}},"example":{"account_id":"Ratione dicta.","brand_kit":"Deleniti reprehenderit saepe quas commodi qui qui.","has_credentials":true,"id":"Molestiae soluta vel ad et in voluptatem.","label":"Dolores qui.","portal_id":"Non qui ad cumque voluptas qui facere.","project_id":"Perspiciatis ea dolor.","sender_email":"Voluptatem saepe eligendi eum non.","sender_name":"Possimus totam occaecati enim eaque.","status":"inactive","version":8244843411375537375},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere iste."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Magni est officiis enim qui occaecati."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto recusandae voluptates excepturi reiciendis numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Aspernatur delectus rem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ad doloremque soluta et quam totam error."},"project_id":{"type":"string","description":"Owning project","example":"Amet dolorem qui eaque ut iste."},"sender_email":{"type":"string","description":"Default sender address","example":"Repudiandae voluptate est enim aut laborum."},"sender_name":{"type":"string","description":"Default sender name","example":"Non consequatur est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4558831950104085533,"format":"int64"}},"example":{"account_id":"Ut voluptatem velit eos aut est est.","brand_kit":"Autem aperiam quis.","has_credentials":false,"id":"Autem ullam.","label":"In eveniet explicabo voluptatem et quis totam.","portal_id":"Et molestiae blanditiis nihil dolor exercitationem.","project_id":"Quis sed consequatur velit atque nam.","sender_email":"Placeat dolores culpa sed.","sender_name":"Quae qui optio magni itaque iure.","status":"inactive","version":657346491219148846},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui dignissimos."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi vel aut rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim odit numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Beatae quis dignissimos voluptatem et labore sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ut unde dolore id."},"project_id":{"type":"string","description":"Owning project","example":"Placeat aut dolores at."},"sender_email":{"type":"string","description":"Default sender address","example":"Necessitatibus fuga ducimus dolorem ut aspernatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Ad optio magnam sequi esse."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3131513535227055982,"format":"int64"}},"example":{"account_id":"Dolor eum et consequatur.","brand_kit":"Iure odio at magnam saepe.","has_credentials":true,"id":"Ad minus vero assumenda cum nemo.","label":"Quae adipisci doloribus ullam.","portal_id":"Doloremque rerum sed consequatur dolor quia.","project_id":"Nobis assumenda aut dolorem ea veniam.","sender_email":"Vero dolorum incidunt.","sender_name":"Nihil deleniti dolores dignissimos perferendis tempore eum.","status":"error","version":3519661115667163110},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"platforms":{"type":"array","items":{"type":"string","example":"Odio praesentium perferendis eveniet sint voluptatibus quam."},"description":"Platforms this job will create on","example":["Consequuntur voluptatem est qui.","Quis iste eaque."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Debitis nam.","platforms":["Aut quia distinctio consequatur dolore dolor.","Consequatur voluptatem.","Sed reprehenderit provident."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fuga quos."},"job_id":{"type":"string","description":"Job UUID","example":"Sit qui aut aut."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Quisquam et consequuntur ut sunt aliquam et."},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dicta libero iure culpa est possimus dolores.","job_id":"Minus officiis beatae sed aut quia.","result":"Quia qui fugiat est itaque est fugiat.","status":"queued"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex ipsa nihil esse voluptate in consectetur."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed voluptatum et impedit quod rem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia magni aut nisi est."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas dolorem necessitatibus illum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Omnis corrupti facere eum aliquid est repellat."},"project_id":{"type":"string","description":"Owning project","example":"Sint est sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2425775250383083650,"format":"int64"}},"example":{"account_id":"Quo nostrum quia.","etag":"Velit quis.","has_credentials":true,"id":"Esse sit id incidunt mollitia non sed.","label":"Perferendis culpa voluptatem nostrum eaque deleniti.","org_id":"Aliquam animi.","project_id":"Minima est distinctio accusamus.","status":"error","version":8954977623991310377},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus ut necessitatibus in."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aspernatur nihil et incidunt dolorem dolor sed."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem repellat expedita inventore."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Aliquam ratione ipsum reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Delectus harum voluptates sit est corporis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2355245747867951235,"format":"int64"}},"example":{"account_id":"Magnam voluptates molestiae libero autem quod.","has_credentials":true,"id":"Hic est odio.","label":"Esse mollitia et dolorum accusantium aspernatur quos.","org_id":"Dolores dolore id dolore sed.","project_id":"Occaecati rerum reiciendis.","status":"inactive","version":6928761352190945924},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","org_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","org_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Distinctio magnam."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Architecto deserunt vero ducimus distinctio.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quae qui inventore dolorem deserunt."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"In aut nam rerum."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Doloribus voluptas mollitia doloremque totam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos amet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eum expedita non voluptas sit voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Totam hic quibusdam eveniet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia doloremque commodi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Ab quasi tempora dolor."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8632050897094076248,"format":"int64"}},"example":{"account_id":"Molestias ducimus id.","app_id":"Laborum maiores est ea ducimus ipsum dolorem.","etag":"Et quia ex et alias ea.","has_credentials":true,"id":"Quia iusto maxime.","label":"Error sit nihil iure officiis nemo.","page_id":"Quas quis corporis.","project_id":"Illum accusamus debitis explicabo praesentium sint.","status":"deleted","version":6628357942141561962},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"app_id":{"type":"string","description":"Meta app ID","example":"In vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Error deleniti vitae molestiae qui nobis.","app_id":"Enim non asperiores velit aut.","has_credentials":false,"id":"Nobis qui sunt laboriosam ipsa.","label":"Autem eaque eaque dicta ut magni.","page_id":"Cumque quis accusantium.","project_id":"Et vel dolorum aut inventore consequatur.","status":"inactive","version":8399692053212789191},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit nihil enim sit."},"app_id":{"type":"string","description":"Meta app ID","example":"Non ipsam optio in ratione accusamus quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod minima."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dolores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Qui vitae iste."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum et et laudantium."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6379674624138849400,"format":"int64"}},"example":{"account_id":"Aut perspiciatis.","app_id":"Quibusdam ea nam aut.","has_credentials":true,"id":"Ipsam eligendi est dolore.","label":"Excepturi natus est est saepe doloribus unde.","page_id":"Sit totam ut et.","project_id":"Consequatur aut vero.","status":"active","version":6192957101395237768},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nihil at."},"app_id":{"type":"string","description":"Meta app ID","example":"Maxime eos deserunt quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolores earum."},"label":{"type":"string","description":"Optional friendly name","example":"Optio quia similique vero est impedit quo."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quia tempore sit soluta quia."},"project_id":{"type":"string","description":"Owning project","example":"Est consequatur rerum neque velit nulla modi."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6683913012343616485,"format":"int64"}},"example":{"account_id":"Qui quas aut provident suscipit.","app_id":"Excepturi qui.","has_credentials":true,"id":"Sed velit distinctio.","label":"Veniam amet et quisquam voluptatem fuga.","page_id":"Molestiae id quae vero aut repellendus.","project_id":"Necessitatibus eos rerum.","status":"inactive","version":747656330949987636},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Consequatur hic voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto fugit non asperiores quidem natus."},"page_id":{"type":"string","description":"Facebook page ID","example":"Nostrum atque illum nesciunt adipisci odit corrupti."}},"example":{"account_id":"act_193556282970417","app_id":"Occaecati earum unde ut.","label":"Omnis quidem dolor ipsum voluptas.","page_id":"Occaecati id ea sunt dolorem necessitatibus neque."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Vel architecto quae error dolor placeat."},"app_secret":{"type":"string","description":"Meta app secret","example":"Minus et."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Fugiat aliquid aspernatur voluptatem in cupiditate.","app_secret":"Et dolorem quod."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos ex laborum et doloremque."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ab non sunt dolores quo est ratione."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Repudiandae eum."},"label":{"type":"string","description":"Optional friendly name","example":"Quod amet itaque aut."},"project_id":{"type":"string","description":"Owning project","example":"Ut itaque voluptatem unde adipisci aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6109053107717412647,"format":"int64"}},"example":{"account_id":"Soluta beatae error enim velit voluptates officiis.","customer_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Totam dolorum quas quia quam voluptate.","label":"Aut numquam est accusantium ut vitae.","project_id":"Iste architecto voluptatem velit odio.","status":"error","version":7566507239259662295},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Officiis modi quae consequatur voluptatem et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sed dolorum cupiditate quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Dolorem ea et quidem quibusdam officiis.","customer_id":"Sed sint dolor eaque culpa quae.","has_credentials":true,"id":"Culpa veritatis ut adipisci minus.","label":"Incidunt deleniti.","project_id":"Vero eum ea perspiciatis rerum.","status":"deleted","version":1470629891228199804},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eveniet amet accusantium qui pariatur odio."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Et id sint suscipit quia ipsa voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Omnis id."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat dolores iure dolore voluptatem."},"project_id":{"type":"string","description":"Owning project","example":"Omnis aut mollitia pariatur."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1077022898145795137,"format":"int64"}},"example":{"account_id":"Sapiente perspiciatis dolores dignissimos soluta non vel.","customer_id":"Velit distinctio animi fugit provident rerum.","has_credentials":true,"id":"Non neque optio.","label":"Perspiciatis consequatur beatae sunt officiis sequi qui.","project_id":"Architecto molestiae cum.","status":"inactive","version":8699718175951963580},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Hic voluptatem ad similique sunt ratione."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Dicta et ratione impedit recusandae dolor."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Mollitia vel temporibus sunt nulla esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatem incidunt cum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vero ut et neque soluta distinctio voluptas."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Libero sapiente."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3465638753396319382,"format":"int64"}},"example":{"account_id":"Inventore ratione id vel iusto optio repellendus.","etag":"Quos rerum.","has_credentials":true,"id":"Occaecati quaerat eum quia a excepturi.","label":"Inventore aut molestiae voluptas hic.","project_id":"Ut possimus quidem eos culpa quaerat.","status":"active","version":2911200286629229215},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Cumque laborum ipsum accusantium voluptatem libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tenetur atque et et quia."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut tenetur ipsum ea ad."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6681602602405949516,"format":"int64"}},"example":{"account_id":"In iure molestiae quisquam.","has_credentials":false,"id":"Necessitatibus non eum ipsum eveniet quam.","label":"Accusamus eos neque velit.","project_id":"Aut amet aut voluptatum magnam.","status":"deleted","version":3936961167651696720},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi nostrum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam in et."},"label":{"type":"string","description":"Optional friendly name","example":"Illo ut ut ut."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem maiores ipsam dicta cum odit repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1189484283141975528,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","has_credentials":true,"id":"Debitis atque laboriosam unde facilis.","label":"Voluptatem optio.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati hic ut magnam facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Quo ullam."},"project_id":{"type":"string","description":"Owning project","example":"Ea voluptatum pariatur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4047597311733105158,"format":"int64"}},"example":{"account_id":"Perferendis et.","has_credentials":false,"id":"Sed error quisquam recusandae nesciunt et itaque.","label":"Quos qui quo et.","project_id":"A debitis ut ea.","status":"deleted","version":4664403850667403290},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem fugiat et."}},"example":{"account_id":"t2_gv9wtbfa","label":"Facere quas qui aut rerum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Ab quo ullam ad."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quos et est placeat explicabo."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Rerum tenetur ut voluptatem quo."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Iste aut cum voluptatem qui et.","client_secret":"Aperiam facere voluptas quis nihil.","refresh_token":"Rem asperiores eligendi vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ex ea ullam corrupti.","client_secret":"Et omnis accusantium.","developer_token":"Iure modi asperiores ut.","refresh_token":"Consectetur sint nesciunt."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non sint praesentium quia."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Fugit enim et sint consectetur ea minus."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Debitis labore aut.","app_secret":"Porro ab id necessitatibus consequatur natus tempora."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Facilis facilis aut suscipit aut odio iste.","client_secret":"Deleniti earum magni quibusdam.","refresh_token":"Tenetur velit quaerat aut."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Amet et eaque.","access_token_secret":"Consequatur iste sed illo adipisci sunt.","consumer_key":"Neque ipsum nihil cumque repellendus.","consumer_secret":"Soluta aut sed quibusdam reiciendis qui vel."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Earum id consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Possimus ipsam perspiciatis enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Molestiae itaque autem aliquam voluptatibus assumenda mollitia.","etag":"Nemo sint et consequatur vel quisquam libero.","funding_instrument_id":"Eum et sint possimus omnis dolorem.","has_credentials":false,"id":"Dolorum id ut molestias.","label":"Rerum non assumenda molestiae modi impedit.","project_id":"Adipisci ipsa.","status":"deleted","version":1754395146238114720},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Provident nostrum vel ut nulla et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Magnam dolor et aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quod nihil quia id sed voluptas fuga."},"label":{"type":"string","description":"Optional friendly name","example":"Qui qui impedit assumenda voluptas cumque."},"project_id":{"type":"string","description":"Owning project","example":"Nulla temporibus recusandae consequatur nulla quam non."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7352010610499081653,"format":"int64"}},"example":{"account_id":"Ut et laborum.","funding_instrument_id":"Iusto reiciendis.","has_credentials":false,"id":"Magnam nemo cum delectus.","label":"Et voluptatem mollitia placeat aut laudantium.","project_id":"Minus est dolor.","status":"inactive","version":760324478171279387},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Necessitatibus quia facere vitae aperiam velit corrupti."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Deserunt minima quis impedit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut saepe beatae quasi temporibus in."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas doloremque nobis consectetur voluptas voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Provident corrupti ut similique."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8091372322961997197,"format":"int64"}},"example":{"account_id":"Saepe eius earum.","funding_instrument_id":"Est est molestias reprehenderit placeat.","has_credentials":false,"id":"In voluptate debitis earum voluptates repellat.","label":"Repellendus dolore expedita commodi sit omnis et.","project_id":"Aut et ut dolorem tempore.","status":"inactive","version":2286015844327380649},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed qui dolor illo facere ut voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Rerum maiores in alias est laboriosam saepe."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse odio dolorem similique sapiente ab."},"label":{"type":"string","description":"Optional friendly name","example":"Incidunt nam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Pariatur deserunt aut rem molestiae assumenda."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Quae et perspiciatis numquam.","funding_instrument_id":"Cupiditate provident molestiae quia neque atque delectus.","has_credentials":true,"id":"Perferendis placeat earum occaecati et.","label":"Assumenda quam possimus aut ipsa.","project_id":"Eaque magni omnis dolorem.","status":"error","version":413964225916483826},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Accusantium voluptas ratione dignissimos esse et labore."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus tempore rem quo."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Cumque perspiciatis quam.","label":"Iste numquam optio possimus velit."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Est magni odio aut omnis vel."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iure ducimus voluptatem."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nam sunt aut inventore impedit unde."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quia ab recusandae praesentium."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Magnam cum veritatis mollitia vel velit.","access_token_secret":"Eum perferendis qui qui soluta repudiandae quae.","consumer_key":"Ullam consequatur ut eveniet tempore est.","consumer_secret":"Iusto fugiat ad et."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Hic voluptas debitis error.","config":"Ut consectetur.","status":"Veniam eum ut libero quibusdam debitis."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Sed omnis.","brand_kit":"Sed maiores qui sed exercitationem quam.","label":"Ut amet nostrum laborum minima ipsum.","portal_id":"Aut id in.","sender_email":"Et magnam cumque quasi magni ducimus.","sender_name":"Suscipit sed minus soluta quasi."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Ratione sunt nostrum tenetur repellendus dolorem cum.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Harum et minus voluptas.","label":"Alias non sequi consequatur dolorum.","page_id":"Voluptatem voluptas omnis est tempora ipsum aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Error laudantium.","customer_id":"Similique odio adipisci dolore iste.","label":"Non nostrum dolorum iure eaque animi."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aliquam consequuntur quo aliquid ducimus."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Commodi architecto unde rerum quisquam ut.","label":"Quo sit iusto laudantium voluptates neque."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et eum ex doloremque quia."},"example":"Eum itaque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Architecto voluptas ratione delectus ut adipisci.","event_details":"Quas qui mollitia perferendis eveniet voluptas est.","event_slug":"Ullam tenetur quia totam magni sunt repellat.","id":"A quos a sed exercitationem ut.","keywords":"Temporibus aliquam animi unde.","platforms":["Quo eum dignissimos iure.","Ea quis."],"program_type":"Doloremque itaque eius magni autem.","project_id":"Ut minus in nemo perspiciatis et qui.","status":"draft","targeting":"Ut est nobis aspernatur.","url":"Ex tempore.","version":1756394405346388080}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aperiam et ab."},"example":"Tempore vel quia cum."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Recusandae recusandae est et fuga veniam natus."},"example":"Et iusto doloremque odio."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsum expedita animi."},"example":"Ratione est omnis voluptas praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolorum excepturi quibusdam.","event_details":"Enim magnam eius voluptas voluptatibus deleniti.","event_slug":"Hic vero et.","id":"Voluptas et accusamus quia et officiis ipsum.","keywords":"Amet iusto provident sequi est.","platforms":["Aspernatur qui quidem est eligendi.","Non accusantium quis architecto."],"program_type":"Incidunt ipsum est perspiciatis soluta voluptas est.","project_id":"Explicabo cupiditate rerum.","status":"draft","targeting":"Quaerat ea accusantium.","url":"Ut ea alias.","version":4496268214732198365}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aspernatur voluptatum facilis."},"example":"Laboriosam et."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Veniam maiores dolorum sit et.","event_details":"Dolor ut.","event_slug":"Et assumenda recusandae.","id":"Saepe pariatur.","keywords":"Porro sed minus illo rerum ut.","platforms":["Id incidunt qui et ratione sit quaerat.","Ipsum quia ad a.","Veritatis omnis excepturi.","Et pariatur molestias autem."],"program_type":"Soluta alias natus aut eligendi ea.","project_id":"Est quaerat id qui repudiandae.","status":"draft","targeting":"Totam sequi.","url":"Sint eveniet dicta numquam doloremque ab cumque.","version":4401871562627166296}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Earum debitis."},"example":"Perspiciatis dolor pariatur quae amet."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Occaecati quam nostrum quis."},"example":"Maxime temporibus earum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Blanditiis et qui est dolorem eos.","event_details":"Modi sed.","event_slug":"Eligendi earum qui est et id laudantium.","id":"Sed ea.","keywords":"Dolorem sed atque.","platforms":["Veritatis harum ab nobis.","Atque inventore fugiat aut laboriosam maxime facere."],"program_type":"Et tempore.","project_id":"Ut nihil quo tenetur doloribus fugiat natus.","status":"archived","targeting":"Provident id quia porro rerum.","url":"Ratione incidunt est saepe.","version":2165165569618896837}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Qui minus sit necessitatibus."},"example":"Aut est et."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Id ducimus eius et laboriosam omnis vitae.","platforms":["Non voluptas ut enim.","Rerum sint optio."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Debitis ea molestiae eum voluptatum."},"example":"Illo eveniet."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur nemo molestiae modi ut non atque."},"example":"Sed commodi voluptatibus."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ut consectetur.","campaign_name":"Est qui molestiae rerum adipisci minima quibusdam.","id":"Hic voluptas debitis error.","platform":"Commodi quam voluptates.","platform_campaign_id":"Optio dolorem omnis.","project_id":"Veniam eum ut libero quibusdam debitis.","status":"Accusantium sunt culpa libero quisquam.","version":6082718548704928320}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Aut molestias aut excepturi cumque."},"example":"Esse voluptate non autem."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut hic distinctio non recusandae et qui."},"example":"Totam unde."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Enim ea.","campaign_name":"Totam sapiente vitae numquam ut nesciunt voluptas.","id":"Necessitatibus expedita.","platform":"Asperiores et.","platform_campaign_id":"Laboriosam quis facere.","project_id":"Beatae autem autem.","status":"Exercitationem consectetur.","version":6868385032394830606}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ut nostrum officiis et accusamus provident."},"example":"Rerum reiciendis similique."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit ut repellat voluptas."},"example":"Repudiandae odit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ut laborum nostrum veniam qui rerum.","has_credentials":true,"id":"Aut ratione sunt nostrum tenetur.","label":"Fugit enim et sint consectetur ea minus.","login_customer_id":"Magnam ut et ab.","project_id":"Dolorem cum.","status":"active","version":5799897036572741099}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sapiente ut sit quod.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quo omnis et et molestiae dolorum."},"example":"Consequatur iste eum amet vel impedit et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Deleniti itaque voluptas magnam.","brand_kit":"Dolor id.","has_credentials":false,"id":"Dolorem sapiente.","label":"Sint autem.","portal_id":"Vitae optio ut et consequuntur.","project_id":"Aut natus.","sender_email":"Libero autem ut.","sender_name":"Debitis soluta sed quod dicta aperiam eveniet.","status":"error","version":7443019901611180865}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Architecto ab et libero ea aut."},"example":"Corrupti aut earum rerum ducimus dicta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Qui et.","brand_kit":"Porro ea cum et magni adipisci.","has_credentials":false,"id":"Ad esse neque earum modi.","label":"Ab voluptatem esse.","portal_id":"Aut culpa impedit sit quibusdam nulla adipisci.","project_id":"Quis possimus placeat.","sender_email":"Dolorem molestias natus velit.","sender_name":"Non dolorum odit est.","status":"active","version":8186374755967651666}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et rerum repudiandae et at iusto."},"example":"Voluptas esse qui quisquam quae est magni."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Ut aut.","brand_kit":"Ut voluptas et accusamus natus.","has_credentials":false,"id":"Saepe rerum sunt eum et qui aut.","label":"Voluptas expedita omnis ex.","portal_id":"Minima ut quasi voluptatum officia quod error.","project_id":"Ut quia harum.","sender_email":"Quia inventore est quia enim illo.","sender_name":"Eligendi aperiam.","status":"error","version":9020823344753101103}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et officia sequi et quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur sint et vel molestiae."},"example":"Natus pariatur et et sed debitis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate est illo repellat et cum repellat."},"example":"Facilis repellat eveniet reiciendis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Nobis ipsam.","label":"Velit sapiente qui iusto quis magni et.","org_id":"Officiis deleniti ipsam nam.","project_id":"Aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quaerat iure ipsam."},"example":"Minima adipisci aut quia quisquam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Minus voluptas asperiores debitis labore aut.","has_credentials":true,"id":"Enim consequatur id voluptatem adipisci alias.","label":"Tempora ipsum aut enim harum.","org_id":"Necessitatibus consequatur natus tempora ut.","project_id":"Sequi consequatur dolorum sint voluptatem voluptas omnis.","status":"error","version":7443611122231905788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Nihil ad hic repellendus nobis voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Asperiores ipsum quam.","app_id":"Cum rem architecto vel quibusdam vel autem.","has_credentials":false,"id":"Non praesentium voluptas saepe sit.","label":"Reiciendis qui id tenetur exercitationem aperiam incidunt.","page_id":"Qui suscipit rerum quo eligendi tempora.","project_id":"Sed qui.","status":"active","version":5968285761891001183}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia facilis sit."},"example":"Possimus accusantium expedita alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ratione quis.","app_id":"Aut assumenda unde occaecati eum tenetur nam.","has_credentials":true,"id":"Voluptatibus qui cupiditate voluptatem.","label":"Ut in possimus quia nulla.","page_id":"Vel consequatur ea deserunt.","project_id":"Et corporis officia sint.","status":"error","version":935673982343451083}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit harum ipsa et."},"example":"Commodi et nihil et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Aliquid ducimus quia.","app_id":"Quas tenetur velit quaerat aut.","has_credentials":true,"id":"Hic delectus.","label":"Quibusdam aliquam consequuntur.","page_id":"Aut odio iste assumenda deleniti earum magni.","project_id":"Maxime ut possimus expedita.","status":"inactive","version":7469982570284737303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et quo.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Amet qui provident."},"example":"Ut ea."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","customer_id":"Est aut labore sint natus.","has_credentials":false,"id":"Vero quis consequuntur.","label":"Ut fugiat magnam quia.","project_id":"Quis quo illum cum quod.","status":"active","version":343208040254291221}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum laboriosam dignissimos reiciendis et quisquam."},"example":"Deserunt reiciendis dolorem totam voluptatem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Autem aspernatur ea voluptatem.","customer_id":"Accusantium aspernatur facere tempora voluptatem dicta rerum.","has_credentials":true,"id":"Eos explicabo non quidem.","label":"Nam voluptas sed et doloremque reiciendis pariatur.","project_id":"Debitis itaque itaque dolores nihil.","status":"deleted","version":8497111294039610948}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laudantium doloremque aut eligendi perferendis aut."},"example":"Consectetur delectus libero id."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"In expedita.","customer_id":"Magni ducimus nulla suscipit sed minus soluta.","has_credentials":false,"id":"Iste voluptatem et voluptatem ut ut.","label":"Quia sed omnis quaerat aut.","project_id":"Nostrum laborum minima.","status":"error","version":7283482467977491974}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed maiores qui sed exercitationem quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed ipsam enim esse iure est."},"example":"Aut sunt ex et autem delectus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Ipsam temporibus sint et necessitatibus dolorem ut.","has_credentials":true,"id":"Quidem illo numquam doloremque et.","label":"Fugiat adipisci eos rerum.","project_id":"Perferendis ut quia aut.","status":"active","version":1442766184420227830}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem omnis aspernatur veritatis adipisci."},"example":"Voluptas ipsam iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Asperiores velit enim tempore expedita ut.","has_credentials":false,"id":"Sapiente et et itaque dolores in.","label":"Consequatur nihil explicabo vero commodi est.","project_id":"Rem dolores eligendi ea.","status":"deleted","version":2256150830368172012}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Adipisci omnis veritatis omnis praesentium omnis."},"example":"Natus aliquam aut quas aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Architecto unde rerum quisquam ut.","has_credentials":true,"id":"Veniam debitis aut similique ullam temporibus qui.","label":"Voluptates neque expedita.","project_id":"Sit iusto.","status":"deleted","version":2250019048790832853}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Repellendus sint.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam voluptatibus nihil."},"example":"Voluptas consequatur iusto nostrum pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Numquam quia.","funding_instrument_id":"Autem provident est.","has_credentials":true,"id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Sit ex commodi sapiente a illum.","project_id":"Pariatur voluptas odit fuga illo.","status":"active","version":4562568070495708080}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Saepe non tempore."},"example":"Tempore qui est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","funding_instrument_id":"Accusamus ratione consequuntur aut et corrupti.","has_credentials":false,"id":"Beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laborum ut magnam aut illum commodi placeat."},"example":"Voluptas libero pariatur ut qui sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Odio adipisci dolore iste ipsa.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsa sint optio nobis quae corporis."},"example":"Et iste."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Veniam et.","job_id":"Iure modi asperiores ut.","result":"Autem voluptates iste.","status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Eaque ut laudantium nostrum ratione."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non iusto odit consequatur in vero soluta."},"event_details":{"description":"Extracted event/course details","example":"Laboriosam nostrum quos expedita voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"keywords":{"description":"Keyword list","example":"Eius laborum."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Voluptate itaque fugit rerum cumque."},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7582961521318439491,"format":"int64"}},"example":{"copy":"Ut ut odio odio sed minus quia.","etag":"Itaque omnis ut.","event_details":"Nihil sunt doloremque.","event_slug":"Porro ut et cupiditate.","id":"Eius dicta.","keywords":"Ea architecto autem iste.","platforms":["Necessitatibus dolorem enim beatae.","Minus vero at ut quis.","Molestiae aut fugit alias.","Qui maiores quia non unde deserunt."],"program_type":"Non assumenda perspiciatis.","project_id":"Ullam distinctio dolore velit.","status":"draft","targeting":"In ipsa tempore incidunt velit provident perspiciatis.","url":"Ea ullam minima voluptatem vel deleniti.","version":1281384136826250351},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quod enim pariatur et occaecati veritatis voluptatem."},"event_details":{"description":"Extracted event/course details","example":"Iure enim dolore est."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"keywords":{"description":"Keyword list","example":"Architecto aliquam mollitia labore sapiente dolores tenetur."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Accusamus qui."},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1931126915939314041,"format":"int64"}},"example":{"copy":"Necessitatibus sit.","event_details":"Sit dignissimos incidunt voluptas.","event_slug":"Reiciendis enim.","id":"Mollitia ea.","keywords":"Quis aperiam deserunt nostrum consectetur et sed.","platforms":["Nemo nihil dolorum consequatur sed tempora qui.","Hic vel aspernatur at quam est ea."],"program_type":"Ad quae nisi.","project_id":"Et amet sunt.","status":"approved","targeting":"Libero blanditiis.","url":"Cum et ab ipsum.","version":1441686313140477581},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Praesentium et."},"event_details":{"description":"Extracted event/course details","example":"Dolor consectetur eos iste."},"event_slug":{"type":"string","description":"Event/course slug","example":"Dolores laborum sed."},"id":{"type":"string","description":"Brief UUID","example":"Nulla sunt autem eos rerum provident dicta."},"keywords":{"description":"Keyword list","example":"Veniam iusto consequatur quia sed officia eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"Est quis impedit."},"description":"Suggested default platforms","example":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."]},"program_type":{"type":"string","description":"Funnel context","example":"Commodi odio sunt esse mollitia incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem voluptate dolor dolores provident."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Qui impedit."},"url":{"type":"string","description":"Event/course page URL","example":"Veritatis itaque."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1624749011573187666,"format":"int64"}},"example":{"copy":"Amet quaerat modi.","event_details":"Velit quis harum recusandae est ipsum.","event_slug":"Quo necessitatibus necessitatibus.","id":"Minus reprehenderit dignissimos aut velit.","keywords":"Eum totam voluptatem eos.","platforms":["Voluptatem rerum praesentium voluptatem blanditiis non.","Temporibus in repudiandae tenetur.","Saepe vel aut animi sit esse ratione.","Blanditiis laborum est quasi dignissimos."],"program_type":"Repellendus omnis doloribus amet cum.","project_id":"At sint laborum veniam.","status":"approved","targeting":"Sint exercitationem.","url":"Sint dicta.","version":6296331077615132388},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Placeat dolores numquam molestias quibusdam aliquid."},"event_details":{"description":"Extracted event/course details","example":"Et itaque ut dolores in voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Autem quo tempora voluptate fuga."},"id":{"type":"string","description":"Brief UUID","example":"Sit in quia molestiae perspiciatis alias et."},"keywords":{"description":"Keyword list","example":"Fuga est aliquam debitis."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum cum eaque nesciunt est totam inventore."},"description":"Suggested default platforms","example":["Ipsam aut vel.","Eos reiciendis.","Minima non."]},"program_type":{"type":"string","description":"Funnel context","example":"Libero et consequuntur suscipit distinctio pariatur mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Ex molestiae praesentium."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Deleniti est natus sequi beatae consectetur."},"url":{"type":"string","description":"Event/course page URL","example":"Distinctio maiores mollitia aut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7075859053648216976,"format":"int64"}},"example":{"copy":"Distinctio tempore qui velit omnis dolorem est.","event_details":"Voluptatibus nihil nisi.","event_slug":"Est molestiae voluptates ipsum neque sapiente aliquid.","id":"Et quis consequatur dolores repellat nostrum similique.","keywords":"Quia recusandae dignissimos dolore harum totam.","platforms":["Nobis hic eos magni eos voluptatem.","Hic ut sapiente harum aliquam sunt eum.","Eaque occaecati."],"program_type":"Minima aut fugit eos et iure laudantium.","project_id":"Iste aliquid.","status":"draft","targeting":"Vitae illo consequuntur esse.","url":"Velit sunt molestiae eius.","version":7533657070215672415},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Et provident illo non quisquam iure doloremque."},"event_details":{"description":"Extracted event/course details","example":"Est et magni."},"event_slug":{"type":"string","description":"Event/course slug","example":"Voluptatem ipsa."},"id":{"type":"string","description":"Brief UUID","example":"Ut ullam aliquam dolore iure consequatur."},"keywords":{"description":"Keyword list","example":"Ut aliquid."},"platforms":{"type":"array","items":{"type":"string","example":"Tempora est eveniet sequi ea."},"description":"Suggested default platforms","example":["Consequatur possimus.","Assumenda sit delectus veniam."]},"program_type":{"type":"string","description":"Funnel context","example":"Quia labore non ut dolores et."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum iste nemo fugiat sunt deleniti officia."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Repellendus eveniet veritatis impedit aut iste earum."},"url":{"type":"string","description":"Event/course page URL","example":"Assumenda excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2088061558739708952,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Quis odio enim nam id voluptatem.","id":"Accusamus pariatur saepe.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Eaque suscipit harum sint neque quia fuga.","Veniam itaque optio consequatur nulla sint."],"program_type":"Laboriosam sunt quis omnis animi.","project_id":"Qui et.","status":"approved","targeting":"Cupiditate aut.","url":"Vero alias temporibus illum.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Facere qui omnis."},"campaign_name":{"type":"string","description":"Campaign name","example":"Dolores natus a sint quod sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa non."},"id":{"type":"string","description":"Campaign UUID","example":"Et itaque rem eos et deleniti dolores."},"platform":{"type":"string","description":"Channel","example":"Enim vitae officia dolorem odio."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Beatae quia qui excepturi minima."},"project_id":{"type":"string","description":"Owning project","example":"Facilis qui libero."},"status":{"type":"string","description":"Campaign status","example":"Et nesciunt iure quis in ut mollitia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9203456138223090094,"format":"int64"}},"example":{"brief_id":"Dolores sit.","campaign_name":"Amet omnis.","etag":"Sit cupiditate non.","id":"Necessitatibus quibusdam.","platform":"Exercitationem accusantium nihil.","platform_campaign_id":"Quod alias ipsum voluptates pariatur magni.","project_id":"Est accusantium laudantium nostrum.","status":"At fugit dolor.","version":6873369027351486557},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quaerat et eius culpa magni illum consequatur."},"campaign_name":{"type":"string","description":"Campaign name","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"id":{"type":"string","description":"Campaign UUID","example":"Minima iure quos enim occaecati beatae."},"platform":{"type":"string","description":"Channel","example":"Soluta dolore vitae."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"In commodi et asperiores et."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Campaign status","example":"Assumenda voluptatem aut debitis vitae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":529135087014785401,"format":"int64"}},"example":{"brief_id":"Et et itaque qui repudiandae magnam.","campaign_name":"Quaerat molestias.","id":"Eos eius.","platform":"Ullam qui rerum numquam quo.","platform_campaign_id":"A quia magnam culpa ipsam totam.","project_id":"Odit rerum commodi ea et.","status":"Sequi aut veniam ratione.","version":4528974556497386277},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quo et enim totam et minima dolorem."},"campaign_name":{"type":"string","description":"Campaign name","example":"In praesentium cumque."},"id":{"type":"string","description":"Campaign UUID","example":"Omnis ad voluptas esse voluptates."},"platform":{"type":"string","description":"Channel","example":"Est tempora qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Voluptas necessitatibus cumque non porro qui molestias."},"project_id":{"type":"string","description":"Owning project","example":"Cumque mollitia."},"status":{"type":"string","description":"Campaign status","example":"Pariatur odio molestias voluptatum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7642665711405677689,"format":"int64"}},"example":{"brief_id":"Qui omnis nesciunt qui consequuntur.","campaign_name":"Odit provident sed quo aperiam.","id":"Perferendis possimus deserunt iure et.","platform":"Fuga atque.","platform_campaign_id":"Sequi culpa.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"Aspernatur nihil et incidunt dolorem dolor sed.","version":7197986407230546835},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Voluptatum veniam molestiae."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","twitter-ads"]}},"example":{"config":"Aspernatur voluptatem nobis.","platforms":["google-ads","meta-ads","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Modi possimus consequatur."},"config":{"description":"Campaign configuration snapshot","example":"Voluptatibus aspernatur."},"status":{"type":"string","description":"Campaign status","example":"Eveniet esse officia explicabo dolor deserunt."}},"example":{"campaign_name":"Accusamus nam cupiditate.","config":"Earum minus autem omnis qui debitis eum.","status":"Hic vel ut."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Veniam dolores quidem necessitatibus."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Sit reiciendis et vel beatae molestiae.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic est quia pariatur odit ullam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed quo perferendis nemo ut quisquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Quod impedit accusamus incidunt minus veritatis enim."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Repellendus quos magnam."},"project_id":{"type":"string","description":"Owning project","example":"Vel inventore aliquid aut non eligendi accusamus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2175885598856983154,"format":"int64"}},"example":{"account_id":"Quae qui inventore dolorem deserunt.","etag":"Rerum sint.","has_credentials":true,"id":"In id voluptatem nihil quaerat.","label":"Hic rerum accusamus velit error.","login_customer_id":"Magnam adipisci architecto deserunt.","project_id":"Pariatur repellat vel.","status":"active","version":1017420418363680400},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem maxime hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Harum voluptates sit est corporis."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus ut necessitatibus in."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Amet hic est."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem repellat expedita inventore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7828959688196597051,"format":"int64"}},"example":{"account_id":"Libero autem quod saepe ullam ipsum.","has_credentials":false,"id":"Quaerat occaecati rerum.","label":"Aspernatur quos est magnam voluptates.","login_customer_id":"Dolore sed.","project_id":"Quae esse mollitia et dolorum.","status":"error","version":3252068377050447352},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","login_customer_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","login_customer_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sed corrupti sit."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Labore quia esse consectetur tenetur eum."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut sit nisi architecto."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Natus vitae consequatur eos sit aut ut."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Praesentium voluptate.","client_secret":"Qui impedit temporibus eveniet eos omnis cumque.","developer_token":"Ipsam ut sed natus et unde.","refresh_token":"Rerum et recusandae possimus quis."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Atque qui dignissimos aut eaque eveniet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Odit numquam quia."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Aut dolores."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptatem beatae quis dignissimos voluptatem et labore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Modi vel aut rerum.","brand_kit":"Dolor eum et consequatur.","has_credentials":false,"id":"Ut unde dolore id.","label":"Ad optio magnam sequi esse.","portal_id":"Assumenda cum nemo esse nobis.","project_id":"Necessitatibus fuga ducimus dolorem ut aspernatur.","sender_email":"Aut dolorem ea veniam.","sender_name":"Quae adipisci doloribus ullam.","status":"deleted","version":9002316743787506494},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"At magnam saepe incidunt nisi est."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Deleniti non in iure dolores et quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio enim nisi doloremque rerum sed consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus non aliquid qui."},"project_id":{"type":"string","description":"Owning project","example":"Quia amet vero dolorum incidunt officia nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Neque sed alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Id ducimus excepturi est et est."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6047270410556243251,"format":"int64"}},"example":{"account_id":"Corrupti sint molestiae occaecati est.","brand_kit":"Nesciunt sed magnam sed vero nulla.","has_credentials":true,"id":"Recusandae similique assumenda ut quia.","label":"Nam eius nulla suscipit ullam.","portal_id":"Ratione nobis ut occaecati tenetur minima veritatis.","project_id":"Nesciunt minus natus non.","sender_email":"Impedit laborum quaerat qui ut ut qui.","sender_name":"Explicabo dolorem totam non.","status":"error","version":9169545032565251193},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sunt labore voluptate."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Beatae non et excepturi sit minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel et et iure tempora."},"label":{"type":"string","description":"Optional friendly name","example":"Eum ut."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus saepe quam culpa qui."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatum perspiciatis autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Ipsa molestias."},"sender_name":{"type":"string","description":"Default sender name","example":"Nam debitis hic qui consequatur laborum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2692133725202625638,"format":"int64"}},"example":{"account_id":"Aspernatur ipsam consequatur qui illo totam fuga.","brand_kit":"Libero quia quam harum molestiae cupiditate.","has_credentials":true,"id":"Et quisquam dicta.","label":"Aut tempora dolorem neque assumenda sed.","portal_id":"Consequatur sint.","project_id":"Eaque enim est libero enim quo.","sender_email":"Non illum expedita commodi in dolores nemo.","sender_name":"Eaque autem impedit tenetur voluptatibus.","status":"inactive","version":6362542183217834869},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Odit odio praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"Sint voluptatibus quam dicta voluptate consequuntur."},"description":"Platforms this job will create on","example":["Qui temporibus quis iste eaque.","Debitis nam.","Delectus ex aut quia."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur dolore dolor corporis consequatur voluptatem voluptates.","platforms":["Repudiandae sit qui aut aut.","Magnam quisquam et consequuntur ut sunt.","Et velit fuga quos est."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fugiat aut dicta libero."},"job_id":{"type":"string","description":"Job UUID","example":"Officiis beatae sed aut."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Est quia qui fugiat est itaque."},"status":{"type":"string","description":"Job status","example":"succeeded","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Beatae harum similique corporis id eum.","job_id":"Culpa est possimus dolores dignissimos.","result":"Laudantium error eum et aut.","status":"partial"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Omnis corrupti facere eum aliquid est repellat."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt mollitia non sed hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ex ipsa nihil esse voluptate in consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Sed voluptatum et impedit quod rem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Est distinctio accusamus a perferendis."},"project_id":{"type":"string","description":"Owning project","example":"Culpa quaerat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6865823349289112261,"format":"int64"}},"example":{"account_id":"Velit quis.","etag":"Vel architecto quae error dolor placeat.","has_credentials":true,"id":"Voluptatem nostrum.","label":"Ut nobis.","org_id":"Minus et.","project_id":"Deleniti voluptas quo nostrum quia.","status":"inactive","version":7197135224651925465},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Autem eaque eaque dicta ut magni.","has_credentials":true,"id":"In vel.","label":"Et vel dolorum aut inventore consequatur.","org_id":"Molestiae qui nobis culpa.","project_id":"Nobis qui sunt laboriosam ipsa.","status":"inactive","version":32502071618905206},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolores dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Temporibus dolorem cumque quis accusantium quia enim."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsum et et laudantium."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Sit est atque qui quaerat qui vitae."},"project_id":{"type":"string","description":"Owning project","example":"Asperiores velit aut alias quod minima."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1323696837483058057,"format":"int64"}},"example":{"account_id":"Consequatur aut vero.","has_credentials":true,"id":"Optio non.","label":"Ipsam eligendi est dolore.","org_id":"Est saepe doloribus unde id.","project_id":"Optio in ratione accusamus quasi.","status":"active","version":4544790407326456577},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptas est consequatur rerum neque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Perspiciatis perferendis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Ea nam aut aut dolores."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Optio quia similique vero est impedit quo."},"project_id":{"type":"string","description":"Owning project","example":"Sapiente sit totam ut et ullam."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5284871868291627638,"format":"int64"}},"example":{"account_id":"Eos deserunt quia expedita sed velit distinctio.","has_credentials":false,"id":"Nihil at.","label":"Sit soluta quia qui.","org_id":"Natus veniam amet.","project_id":"Libero officia et quia.","status":"inactive","version":1537409143960626181},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sint est sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Voluptas dolorem necessitatibus illum.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Ducimus distinctio deserunt quia magni."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Nisi est."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia doloremque commodi rerum."},"app_id":{"type":"string","description":"Meta app ID","example":"Error sit nihil iure officiis nemo."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos non molestias laudantium quia iusto maxime."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam hic quibusdam eveniet."},"label":{"type":"string","description":"Optional friendly name","example":"Veniam et ducimus quos amet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Illum accusamus debitis explicabo praesentium sint."},"project_id":{"type":"string","description":"Owning project","example":"Doloribus voluptas mollitia doloremque totam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4075428576386055706,"format":"int64"}},"example":{"account_id":"Corporis dolorem laborum maiores est ea ducimus.","app_id":"Tenetur ut.","etag":"Quo ullam ad iusto quos.","has_credentials":false,"id":"Molestias ducimus id.","label":"Ex et alias ea asperiores quas.","page_id":"Est placeat explicabo aliquid.","project_id":"Eius aut quo et.","status":"inactive","version":7062935514847310019},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Iure aut tenetur ipsum ea ad ducimus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam voluptatem fuga quia qui."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum vel molestiae id quae vero aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et et."},"project_id":{"type":"string","description":"Owning project","example":"Aut provident suscipit incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8554261525276101559,"format":"int64"}},"example":{"account_id":"Necessitatibus non eum ipsum eveniet quam.","app_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Aut temporibus.","label":"Eligendi non.","page_id":"Voluptatum magnam.","project_id":"Laborum ipsum accusantium voluptatem libero.","status":"error","version":8043832967599792035},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Odit illo ut ut."},"app_id":{"type":"string","description":"Meta app ID","example":"Perspiciatis debitis atque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"In iure molestiae quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Assumenda alias."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam aperiam et totam in."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8618836083038100083,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","app_id":"Ea voluptatum pariatur non.","has_credentials":true,"id":"Unde facilis.","label":"Voluptatem optio.","page_id":"Maiores consequatur.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam recusandae nesciunt et."},"app_id":{"type":"string","description":"Meta app ID","example":"Perferendis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo ullam."},"label":{"type":"string","description":"Optional friendly name","example":"Facilis dolor consectetur sed."},"page_id":{"type":"string","description":"Facebook page ID","example":"Ut ea sequi quos qui quo et."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati hic ut magnam facilis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8315950268383046552,"format":"int64"}},"example":{"account_id":"Non consequuntur qui qui impedit assumenda voluptas.","app_id":"Et nemo dicta illum omnis.","has_credentials":true,"id":"Beatae facilis dolor quod nihil quia.","label":"Recusandae consequatur nulla.","page_id":"Vel ut.","project_id":"Sed voluptas fuga officia nulla.","status":"error","version":8342264622249142271},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Occaecati id ea sunt dolorem necessitatibus neque."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur hic voluptatem."},"page_id":{"type":"string","description":"Facebook page ID","example":"Omnis quidem dolor ipsum voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Ab quasi tempora dolor.","label":"Occaecati earum unde ut.","page_id":"Non eum expedita non voluptas sit voluptatem."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"app_secret":{"type":"string","description":"Meta app secret","example":"Et dolorem quod."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Iusto fugit non asperiores quidem natus.","app_secret":"Nostrum atque illum nesciunt adipisci odit corrupti."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","customer_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","customer_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Doloremque dicta."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ratione impedit recusandae dolor consequatur."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Vel temporibus sunt nulla esse sed."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Rerum eveniet nam sunt.","etag":"Voluptatem quia ab recusandae praesentium nisi.","has_credentials":true,"id":"Hic quos inventore.","label":"Ad dolorem et.","project_id":"Id vel iusto optio repellendus.","status":"deleted","version":4971099885577230620},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium eligendi ut et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Est dolor velit et voluptatem mollitia placeat."},"project_id":{"type":"string","description":"Owning project","example":"Nemo cum delectus laudantium."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7301828793581898625,"format":"int64"}},"example":{"account_id":"Necessitatibus quia facere vitae aperiam velit corrupti.","has_credentials":true,"id":"Iste iusto reiciendis ipsa ut saepe beatae.","label":"Voluptas doloremque nobis consectetur voluptas voluptas.","project_id":"Temporibus in qui provident corrupti ut similique.","status":"deleted","version":8091372322961997197},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus dolore expedita commodi sit omnis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Deserunt minima quis impedit."},"label":{"type":"string","description":"Optional friendly name","example":"Aut et ut dolorem tempore."},"project_id":{"type":"string","description":"Owning project","example":"In voluptate debitis earum voluptates repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4154692188906674111,"format":"int64"}},"example":{"account_id":"Pariatur esse.","has_credentials":false,"id":"Quo porro.","label":"Molestias reprehenderit.","project_id":"Accusantium est.","status":"error","version":1321629448594002998},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere ut voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ab ea pariatur deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Repellat sequi sed qui dolor."},"project_id":{"type":"string","description":"Owning project","example":"Rem molestiae assumenda ea incidunt."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","has_credentials":false,"id":"Rerum maiores in alias est laboriosam saepe.","label":"Eaque magni omnis dolorem.","project_id":"Perferendis placeat earum occaecati et.","status":"inactive","version":7088601354925466349},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Et neque soluta."}},"example":{"account_id":"t2_gv9wtbfa","label":"Voluptas aliquid libero sapiente aspernatur fugit eum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quo vel iste aut cum voluptatem."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et et aperiam."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas quis nihil tempora rem asperiores."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Vero natus voluptatem.","client_secret":"Et minima.","refresh_token":"Quas qui aut rerum illum vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dicta qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur voluptate dolorum id ut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Id adipisci."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"project_id":{"type":"string","description":"Owning project","example":"Minima vitae illo cumque optio impedit."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6671950557225375758,"format":"int64"}},"example":{"account_id":"Vitae nemo sint et consequatur vel quisquam.","etag":"Sint possimus.","funding_instrument_id":"Dolorem neque hic voluptatem ad similique sunt.","has_credentials":true,"id":"Aut rerum non assumenda molestiae modi.","label":"Voluptatibus assumenda mollitia molestias eos.","project_id":"Vitae molestiae itaque autem.","status":"error","version":3850958169697422368},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam numquam et natus possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Provident molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Quas quia quam voluptate nam iste.","funding_instrument_id":"Temporibus aut numquam.","has_credentials":true,"id":"Non laudantium quis ab non sunt.","label":"Beatae totam.","project_id":"Quo est.","status":"active","version":1807846651493588341},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed dolorum cupiditate quia qui dicta."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quae totam et voluptates atque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Accusantium ut vitae dolor soluta beatae."},"label":{"type":"string","description":"Optional friendly name","example":"Molestiae veniam exercitationem blanditiis ratione non."},"project_id":{"type":"string","description":"Owning project","example":"Enim velit voluptates officiis tempora possimus rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2489572558350094249,"format":"int64"}},"example":{"account_id":"Adipisci minus et vero.","funding_instrument_id":"Occaecati incidunt deleniti sunt dolorem ea.","has_credentials":false,"id":"Voluptates ab quos provident magni et.","label":"Et culpa culpa veritatis.","project_id":"Reprehenderit officiis modi quae consequatur.","status":"inactive","version":8208341011850859357},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Cumque perspiciatis quam."},"label":{"type":"string","description":"Optional friendly name","example":"Iste numquam optio possimus velit."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Eveniet quia voluptatem impedit cumque doloribus.","label":"Possimus ipsam perspiciatis enim id."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Ullam consequatur ut eveniet tempore est."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iusto fugiat ad et."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Magni odio aut omnis vel."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Iure ducimus voluptatem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Necessitatibus tempore rem quo.","access_token_secret":"Accusantium voluptas ratione dignissimos esse et labore.","consumer_key":"Magnam cum veritatis mollitia vel velit.","consumer_secret":"Eum perferendis qui qui soluta repudiandae quae."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 3608e1f6..6ea9eca3 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -32,17 +32,16 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Mollitia molestiae saepe qui ex commodi. - event_details: Quia ut atque. - event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. - keywords: Expedita unde molestiae. + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. platforms: - - Vel nobis non molestias non. - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. + - Molestiae saepe qui. + - Commodi voluptatem expedita. program_type: membership - targeting: Voluptas dolor et incidunt pariatur quod odit. - url: Nesciunt unde ullam occaecati maxime. + targeting: Facilis iste. + url: Quia ut atque. responses: "201": description: Created response. @@ -52,25 +51,27 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Nisi est sint consequuntur omnis. - example: Neque sed alias. + example: Et eum ex doloremque quia. + example: Eum itaque. content: application/json: schema: $ref: '#/components/schemas/Brief2' example: - event_slug: Nemo perspiciatis et qui aliquam doloremque itaque. - id: Voluptatem cupiditate voluptas aliquam facilis iste sed. + copy: Architecto voluptas ratione delectus ut adipisci. + event_details: Quas qui mollitia perferendis eveniet voluptas est. + event_slug: Ullam tenetur quia totam magni sunt repellat. + id: A quos a sed exercitationem ut. + keywords: Temporibus aliquam animi unde. platforms: - - Tenetur quia totam magni. - - Repellat alias ex. - - Nihil quos quo eum. - - Iure praesentium ea quis. - program_type: Sed exercitationem ut totam ut minus. - project_id: Laboriosam tempore vero voluptatum a quos. - status: archived - url: Magni autem. - version: 9009752361610175063 + - Quo eum dignissimos iure. + - Ea quis. + program_type: Doloremque itaque eius magni autem. + project_id: Ut minus in nemo perspiciatis et qui. + status: draft + targeting: Ut est nobis aspernatur. + url: Ex tempore. + version: 1756394405346388080 "400": description: 'BadRequest: Bad request' content: @@ -142,11 +143,20 @@ paths: schema: type: string description: Brief UUID - example: Cum ipsum quo possimus. - example: Quam culpa. + example: Aperiam et ab. + example: Tempore vel quia cum. responses: "204": description: No Content response. + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -208,8 +218,8 @@ paths: schema: type: string description: Brief UUID - example: Id ducimus excepturi est et est. - example: Deleniti non in iure dolores et quis. + example: Recusandae recusandae est et fuga veniam natus. + example: Et iusto doloremque odio. responses: "200": description: OK response. @@ -219,25 +229,36 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Recusandae similique assumenda ut quia. - example: Nam eius nulla suscipit ullam. + example: Ipsum expedita animi. + example: Ratione est omnis voluptas praesentium. content: application/json: schema: $ref: '#/components/schemas/Brief3' example: - event_slug: Provident itaque. - id: Ut est nobis aspernatur. + copy: Dolorum excepturi quibusdam. + event_details: Enim magnam eius voluptas voluptatibus deleniti. + event_slug: Hic vero et. + id: Voluptas et accusamus quia et officiis ipsum. + keywords: Amet iusto provident sequi est. platforms: - - Cupiditate rerum magni incidunt. - - Est perspiciatis soluta voluptas est. - - Hic vero et. - - Ut ea alias. - program_type: Ea enim quidem odio et sequi consequatur. - project_id: Fugit qui tempora commodi reiciendis sit alias. + - Aspernatur qui quidem est eligendi. + - Non accusantium quis architecto. + program_type: Incidunt ipsum est perspiciatis soluta voluptas est. + project_id: Explicabo cupiditate rerum. status: draft - url: Voluptas et accusamus quia et officiis ipsum. - version: 5012609352100951313 + targeting: Quaerat ea accusantium. + url: Ut ea alias. + version: 4496268214732198365 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -299,8 +320,8 @@ paths: schema: type: string description: Brief UUID - example: Corrupti sint molestiae occaecati est. - example: Labore est ut ratione nobis ut occaecati. + example: Aspernatur voluptatum facilis. + example: Laboriosam et. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -318,17 +339,16 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Mollitia molestiae saepe qui ex commodi. - event_details: Quia ut atque. - event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. - keywords: Expedita unde molestiae. + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. platforms: - - Vel nobis non molestias non. - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. + - Molestiae saepe qui. + - Commodi voluptatem expedita. program_type: membership - targeting: Voluptas dolor et incidunt pariatur quod odit. - url: Nesciunt unde ullam occaecati maxime. + targeting: Facilis iste. + url: Quia ut atque. responses: "200": description: OK response. @@ -338,24 +358,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Minima veritatis sed impedit laborum. - example: Totam non qui. + example: Sapiente alias et error nobis minima. + example: Fuga maxime tempora rem. content: application/json: schema: $ref: '#/components/schemas/Brief4' example: - event_slug: Accusantium quaerat voluptatem iure vero quam consequatur. - id: Voluptas voluptatibus deleniti sit dolorum. + copy: Veniam maiores dolorum sit et. + event_details: Dolor ut. + event_slug: Et assumenda recusandae. + id: Saepe pariatur. + keywords: Porro sed minus illo rerum ut. platforms: - - Ex eveniet soluta adipisci occaecati. - - Pariatur vero est quaerat id. - - Repudiandae veniam soluta alias natus aut. - program_type: Illo quaerat. - project_id: Quibusdam ut amet iusto provident sequi. - status: approved - url: Tempore voluptatibus quo. - version: 8063317454231389303 + - Id incidunt qui et ratione sit quaerat. + - Ipsum quia ad a. + - Veritatis omnis excepturi. + - Et pariatur molestias autem. + program_type: Soluta alias natus aut eligendi ea. + project_id: Est quaerat id qui repudiandae. + status: draft + targeting: Totam sequi. + url: Sint eveniet dicta numquam doloremque ab cumque. + version: 4401871562627166296 "400": description: 'BadRequest: Bad request' content: @@ -445,8 +470,8 @@ paths: schema: type: string description: Brief UUID - example: Sed magnam sed vero nulla. - example: Vel et et iure tempora. + example: Earum debitis. + example: Perspiciatis dolor pariatur quae amet. responses: "200": description: OK response. @@ -456,23 +481,36 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatum perspiciatis autem. - example: Sunt labore voluptate. + example: Occaecati quam nostrum quis. + example: Maxime temporibus earum. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - event_slug: Officia et pariatur molestias autem ratione. - id: Et ratione sit. + copy: Blanditiis et qui est dolorem eos. + event_details: Modi sed. + event_slug: Eligendi earum qui est et id laudantium. + id: Sed ea. + keywords: Dolorem sed atque. platforms: - - Et quod porro. - - Minus illo rerum ut culpa totam sequi. - program_type: A omnis veritatis omnis. - project_id: Sed ipsum quia. - status: draft - url: Ut et veniam maiores. - version: 4401871562627166296 + - Veritatis harum ab nobis. + - Atque inventore fugiat aut laboriosam maxime facere. + program_type: Et tempore. + project_id: Ut nihil quo tenetur doloribus fugiat natus. + status: archived + targeting: Provident id quia porro rerum. + url: Ratione incidunt est saepe. + version: 2165165569618896837 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -535,8 +573,8 @@ paths: schema: type: string description: Brief UUID - example: Cum ipsa molestias voluptatibus nam debitis hic. - example: Consequatur laborum. + example: Qui minus sit necessitatibus. + example: Aut est et. requestBody: required: true content: @@ -545,11 +583,12 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Eligendi earum qui est et id laudantium. + config: Est voluptatum enim earum et doloribus. platforms: - - Ea magnam ut nihil quo tenetur. - - Fugiat natus. - - Et tempore. + - hubspot + - meta-ads + - reddit-ads + - twitter-ads responses: "202": description: Accepted response. @@ -558,12 +597,10 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Tempora veritatis harum ab nobis fuga atque. + job_id: Id ducimus eius et laboriosam omnis vitae. platforms: - - Laboriosam maxime facere culpa modi. - - Quod blanditiis et. - - Est dolorem eos amet dolorem sed. - - Architecto provident id quia porro. + - Non voluptas ut enim. + - Rerum sint optio. status: queued "400": description: 'BadRequest: Bad request' @@ -636,8 +673,8 @@ paths: schema: type: string description: Brief UUID - example: Beatae non et excepturi sit minus. - example: Et quisquam dicta. + example: Debitis ea molestiae eum voluptatum. + example: Illo eveniet. - name: campaign_id in: path description: Campaign UUID @@ -645,8 +682,8 @@ paths: schema: type: string description: Campaign UUID - example: Eaque enim est libero enim quo. - example: Aut tempora dolorem neque assumenda sed. + example: Consequatur nemo molestiae modi ut non atque. + example: Sed commodi voluptatibus. responses: "200": description: OK response. @@ -656,21 +693,30 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aspernatur ipsam consequatur qui illo totam fuga. - example: Qui non illum expedita commodi in dolores. + example: Nobis est fugit ratione consectetur exercitationem. + example: Aperiam quia doloribus omnis. content: application/json: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Id ducimus eius et laboriosam omnis vitae. - campaign_name: Labore iste voluptates quos. - id: Est voluptatum enim earum et doloribus. - platform: Voluptatem quas non voluptas ut. - platform_campaign_id: Modi rerum sint. - project_id: Ea consequatur et ut. - status: Dolorem dolor fugiat quia. - version: 5825706568637163425 + brief_id: Ut consectetur. + campaign_name: Est qui molestiae rerum adipisci minima quibusdam. + id: Hic voluptas debitis error. + platform: Commodi quam voluptates. + platform_campaign_id: Optio dolorem omnis. + project_id: Veniam eum ut libero quibusdam debitis. + status: Accusantium sunt culpa libero quisquam. + version: 6082718548704928320 + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -732,8 +778,8 @@ paths: schema: type: string description: Brief UUID - example: Similique eaque autem impedit tenetur voluptatibus. - example: Libero quia quam harum molestiae cupiditate. + example: Excepturi fugit. + example: Aut quia voluptates voluptates nisi. - name: campaign_id in: path description: Campaign UUID @@ -741,8 +787,8 @@ paths: schema: type: string description: Campaign UUID - example: Et eum ex doloremque quia. - example: Adipisci vel. + example: Aut molestias aut excepturi cumque. + example: Esse voluptate non autem. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -760,9 +806,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Hic voluptas debitis error. - config: Ut consectetur. - status: Veniam eum ut libero quibusdam debitis. + campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. + config: Error similique. + status: Maxime fugiat illo. responses: "200": description: OK response. @@ -772,21 +818,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Eum itaque. - example: Et iusto doloremque odio. + example: Ut hic distinctio non recusandae et qui. + example: Totam unde. content: application/json: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Harum distinctio reiciendis architecto atque maxime soluta. - campaign_name: Est ut ut alias ullam fugiat deserunt. - id: Accusantium sunt culpa libero quisquam. - platform: Ducimus porro maxime. - platform_campaign_id: Illo ipsam error similique quaerat. - project_id: Rerum amet aut tempora recusandae aspernatur. - status: Nihil iusto temporibus voluptas. - version: 6352110138661359662 + brief_id: Enim ea. + campaign_name: Totam sapiente vitae numquam ut nesciunt voluptas. + id: Necessitatibus expedita. + platform: Asperiores et. + platform_campaign_id: Laboriosam quis facere. + project_id: Beatae autem autem. + status: Exercitationem consectetur. + version: 6868385032394830606 "400": description: 'BadRequest: Bad request' content: @@ -926,21 +972,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sapiente alias et error nobis minima. - example: Fuga maxime tempora rem. + example: Tempora qui incidunt tempora. + example: Vero voluptates soluta. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Perspiciatis saepe consequatur doloribus sequi et. + account_id: Ipsum quaerat delectus cupiditate sit et. has_credentials: true - id: Nulla ut laboriosam. - label: Omnis suscipit corrupti reiciendis. - login_customer_id: Nihil quia omnis eaque aperiam eum. - project_id: Rerum delectus velit. - status: active - version: 3995988906528985875 + id: Eum dolorum. + label: Veniam velit sequi sit impedit dolorum voluptas. + login_customer_id: Sed non. + project_id: Distinctio vel. + status: error + version: 4111850562907897222 "404": description: 'NotFound: Resource not found' content: @@ -998,10 +1044,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ex ea ullam corrupti. - client_secret: Et omnis accusantium. - developer_token: Iure modi asperiores ut. - refresh_token: Consectetur sint nesciunt. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. responses: "201": description: Created response. @@ -1011,21 +1057,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ratione est omnis voluptas praesentium. - example: Laboriosam et. + example: Voluptas ut nostrum officiis et accusamus provident. + example: Rerum reiciendis similique. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Consequatur quos atque voluptates quo sit. - has_credentials: false - id: Autem veniam. - label: Quam sed rem quia consequuntur ut. - login_customer_id: Dolorum est aut blanditiis quidem qui. - project_id: Enim unde omnis. - status: inactive - version: 8150234719088577779 + account_id: Perspiciatis saepe consequatur doloribus sequi et. + has_credentials: true + id: Nulla ut laboriosam. + label: Omnis suscipit corrupti reiciendis. + login_customer_id: Nihil quia omnis eaque aperiam eum. + project_id: Rerum delectus velit. + status: active + version: 3995988906528985875 "400": description: 'BadRequest: Bad request' content: @@ -1109,21 +1155,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Earum debitis. - example: Occaecati quam nostrum quis. + example: Sit ut repellat voluptas. + example: Repudiandae odit. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Ipsum quaerat delectus cupiditate sit et. + account_id: Ut laborum nostrum veniam qui rerum. has_credentials: true - id: Eum dolorum. - label: Veniam velit sequi sit impedit dolorum voluptas. - login_customer_id: Sed non. - project_id: Distinctio vel. - status: error - version: 4111850562907897222 + id: Aut ratione sunt nostrum tenetur. + label: Fugit enim et sint consectetur ea minus. + login_customer_id: Magnam ut et ab. + project_id: Dolorem cum. + status: active + version: 5799897036572741099 "400": description: 'BadRequest: Bad request' content: @@ -1205,10 +1251,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Ex ea ullam corrupti. - client_secret: Et omnis accusantium. - developer_token: Iure modi asperiores ut. - refresh_token: Consectetur sint nesciunt. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. responses: "204": description: No Content response. @@ -1275,8 +1321,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Quibusdam magni et rerum sed voluptatum nesciunt. - ok: false + message: Sapiente ut sit quod. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -1380,24 +1426,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Commodi et nihil et. - example: Repellendus adipisci sit et enim quasi ut. + example: Quo omnis et et molestiae dolorum. + example: Consequatur iste eum amet vel impedit et. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Non dolorum odit est. - brand_kit: Natus veritatis sint autem necessitatibus. + account_id: Deleniti itaque voluptas magnam. + brand_kit: Dolor id. has_credentials: false - id: Tempore quo quae aut culpa impedit. - label: Aperiam dolorem molestias natus velit. - portal_id: Et magni adipisci magnam veniam. - project_id: Quibusdam nulla. - sender_email: Labore qui. - sender_name: Et corporis architecto dolorem sapiente repellendus. - status: deleted - version: 5377129987312416334 + id: Dolorem sapiente. + label: Sint autem. + portal_id: Vitae optio ut et consequuntur. + project_id: Aut natus. + sender_email: Libero autem ut. + sender_name: Debitis soluta sed quod dicta aperiam eveniet. + status: error + version: 7443019901611180865 "404": description: 'NotFound: Resource not found' content: @@ -1451,14 +1497,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Sed omnis. - brand_kit: Sed maiores qui sed exercitationem quam. - label: Ut amet nostrum laborum minima ipsum. - portal_id: Aut id in. - sender_email: Et magnam cumque quasi magni ducimus. - sender_name: Suscipit sed minus soluta quasi. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. credentials: - private_app_token: Non sint praesentium quia. + private_app_token: Distinctio aut. responses: "201": description: Created response. @@ -1468,24 +1514,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Totam tempora quod expedita. - example: Dignissimos fugiat voluptatibus natus. + example: Architecto ab et libero ea aut. + example: Corrupti aut earum rerum ducimus dicta. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Consequuntur omnis a dignissimos voluptate. - brand_kit: Ab voluptatem esse. + account_id: Qui et. + brand_kit: Porro ea cum et magni adipisci. has_credentials: false - id: Doloremque architecto ea et. - label: Aliquid et in. - portal_id: Est iste. - project_id: Asperiores facere et exercitationem soluta possimus. - sender_email: Ad esse neque earum modi. - sender_name: Quis possimus placeat. - status: inactive - version: 3236501119949951161 + id: Ad esse neque earum modi. + label: Ab voluptatem esse. + portal_id: Aut culpa impedit sit quibusdam nulla adipisci. + project_id: Quis possimus placeat. + sender_email: Dolorem molestias natus velit. + sender_name: Non dolorum odit est. + status: active + version: 8186374755967651666 "400": description: 'BadRequest: Bad request' content: @@ -1557,12 +1603,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Sed omnis. - brand_kit: Sed maiores qui sed exercitationem quam. - label: Ut amet nostrum laborum minima ipsum. - portal_id: Aut id in. - sender_email: Et magnam cumque quasi magni ducimus. - sender_name: Suscipit sed minus soluta quasi. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. responses: "200": description: OK response. @@ -1572,24 +1618,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas ipsam iste. - example: Delectus libero necessitatibus quis. + example: Et rerum repudiandae et at iusto. + example: Voluptas esse qui quisquam quae est magni. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Dolor id. - brand_kit: Ex id ut aut. + account_id: Ut aut. + brand_kit: Ut voluptas et accusamus natus. has_credentials: false - id: Modi velit vitae optio ut et consequuntur. - label: Debitis soluta sed quod dicta aperiam eveniet. - portal_id: Corrupti esse mollitia distinctio saepe rerum. - project_id: Libero autem ut. - sender_email: Eum et qui aut consequatur ut. - sender_name: Harum maxime voluptas expedita. - status: inactive - version: 5643656240528764613 + id: Saepe rerum sunt eum et qui aut. + label: Voluptas expedita omnis ex. + portal_id: Minima ut quasi voluptatum officia quod error. + project_id: Ut quia harum. + sender_email: Quia inventore est quia enim illo. + sender_name: Eligendi aperiam. + status: error + version: 9020823344753101103 "400": description: 'BadRequest: Bad request' content: @@ -1671,7 +1717,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Non sint praesentium quia. + private_app_token: Distinctio aut. responses: "204": description: No Content response. @@ -1738,8 +1784,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Similique ut minima. - ok: false + message: Et officia sequi et quam. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -1843,21 +1889,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempore vel quia cum. - example: Aut est et. + example: Consequatur sint et vel molestiae. + example: Natus pariatur et et sed debitis. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Magni voluptas odio assumenda totam. + account_id: Ducimus sequi. has_credentials: true - id: Ipsam vitae aut voluptatem. - label: Iusto quis magni et velit. - org_id: Officiis deleniti ipsam nam. - project_id: Ab quam velit sapiente. - status: deleted - version: 6633489521806040497 + id: Et placeat. + label: Aut et. + org_id: Culpa voluptas quia tenetur. + project_id: Qui esse. + status: inactive + version: 3277300697475451657 "404": description: 'NotFound: Resource not found' content: @@ -1912,10 +1958,10 @@ paths: example: config: account_id: "538170226" - label: Ratione sunt nostrum tenetur repellendus dolorem cum. + label: Tempora error rerum quae nihil. org_id: "208777" credentials: - access_token: Fugit enim et sint consectetur ea minus. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. responses: "201": description: Created response. @@ -1925,21 +1971,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Itaque quo. - example: Aperiam et ab. + example: Cupiditate est illo repellat et cum repellat. + example: Facilis repellat eveniet reiciendis. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Quae nihil magni. + account_id: Deserunt magni voluptas odio assumenda totam. has_credentials: true - id: Eum fugit repudiandae magnam ut. - label: Aut tempora error. - org_id: Voluptatem repudiandae laudantium expedita ut. - project_id: Ab laboriosam quis sapiente ut sit. - status: error - version: 7519523340683479876 + id: Nobis ipsam. + label: Velit sapiente qui iusto quis magni et. + org_id: Officiis deleniti ipsam nam. + project_id: Aut voluptatem inventore ab. + status: deleted + version: 6633489521806040497 "400": description: 'BadRequest: Bad request' content: @@ -2012,7 +2058,7 @@ paths: example: config: account_id: "538170226" - label: Ratione sunt nostrum tenetur repellendus dolorem cum. + label: Tempora error rerum quae nihil. org_id: "208777" responses: "200": @@ -2023,21 +2069,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Debitis ea molestiae eum voluptatum. - example: Consequatur nemo molestiae modi ut non atque. + example: Quaerat iure ipsam. + example: Minima adipisci aut quia quisquam. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Ducimus sequi. + account_id: Minus voluptas asperiores debitis labore aut. has_credentials: true - id: Et placeat. - label: Aut et. - org_id: Culpa voluptas quia tenetur. - project_id: Qui esse. - status: inactive - version: 3277300697475451657 + id: Enim consequatur id voluptatem adipisci alias. + label: Tempora ipsum aut enim harum. + org_id: Necessitatibus consequatur natus tempora ut. + project_id: Sequi consequatur dolorum sint voluptatem voluptas omnis. + status: error + version: 7443611122231905788 "400": description: 'BadRequest: Bad request' content: @@ -2119,7 +2165,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Fugit enim et sint consectetur ea minus. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. responses: "204": description: No Content response. @@ -2186,7 +2232,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Facere harum enim consequatur id voluptatem. + message: Nihil ad hic repellendus nobis voluptatem. ok: true "404": description: 'NotFound: Resource not found' @@ -2291,22 +2337,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aperiam quia doloribus omnis. - example: Aut quia voluptates voluptates nisi. + example: Incidunt sit. + example: Totam tempora quod expedita. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Mollitia a magni vel consequatur ea deserunt. - app_id: Inventore aliquid voluptatibus iste mollitia. - has_credentials: true - id: Et corporis officia sint. - label: Ratione quis. - page_id: Occaecati eum tenetur. - project_id: Ut in possimus quia nulla. - status: error - version: 2122032566439088184 + account_id: Asperiores ipsum quam. + app_id: Cum rem architecto vel quibusdam vel autem. + has_credentials: false + id: Non praesentium voluptas saepe sit. + label: Reiciendis qui id tenetur exercitationem aperiam incidunt. + page_id: Qui suscipit rerum quo eligendi tempora. + project_id: Sed qui. + status: active + version: 5968285761891001183 "404": description: 'NotFound: Resource not found' content: @@ -2361,12 +2407,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Harum et minus voluptas. - label: Alias non sequi consequatur dolorum. - page_id: Voluptatem voluptas omnis est tempora ipsum aut. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. credentials: - access_token: Debitis labore aut. - app_secret: Porro ab id necessitatibus consequatur natus tempora. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. responses: "201": description: Created response. @@ -2376,22 +2422,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sed commodi voluptatibus. - example: Fuga facilis asperiores enim nisi consequatur perspiciatis. + example: Quia facilis sit. + example: Possimus accusantium expedita alias. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Quo sint dolorum vel. - app_id: Dolores commodi aperiam voluptatibus. - has_credentials: false - id: Accusamus vero et voluptas accusamus sunt. - label: Vel blanditiis sunt ut facere. - page_id: Est non tenetur dolore. - project_id: Rerum cupiditate. - status: deleted - version: 8886302108378029553 + account_id: Ratione quis. + app_id: Aut assumenda unde occaecati eum tenetur nam. + has_credentials: true + id: Voluptatibus qui cupiditate voluptatem. + label: Ut in possimus quia nulla. + page_id: Vel consequatur ea deserunt. + project_id: Et corporis officia sint. + status: error + version: 935673982343451083 "400": description: 'BadRequest: Bad request' content: @@ -2464,9 +2510,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Harum et minus voluptas. - label: Alias non sequi consequatur dolorum. - page_id: Voluptatem voluptas omnis est tempora ipsum aut. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. responses: "200": description: OK response. @@ -2476,22 +2522,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut molestias aut excepturi cumque. - example: Ut hic distinctio non recusandae et qui. + example: Sit harum ipsa et. + example: Commodi et nihil et. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Eius voluptatem molestiae qui suscipit rerum. - app_id: Id facere maxime. - has_credentials: false - id: Saepe sit et sed qui dolorem reiciendis. - label: Asperiores ipsum quam. - page_id: Cum rem architecto vel quibusdam vel autem. - project_id: Id tenetur exercitationem aperiam incidunt. - status: error - version: 3981571209223840207 + account_id: Aliquid ducimus quia. + app_id: Quas tenetur velit quaerat aut. + has_credentials: true + id: Hic delectus. + label: Quibusdam aliquam consequuntur. + page_id: Aut odio iste assumenda deleniti earum magni. + project_id: Maxime ut possimus expedita. + status: inactive + version: 7469982570284737303 "400": description: 'BadRequest: Bad request' content: @@ -2573,8 +2619,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Debitis labore aut. - app_secret: Porro ab id necessitatibus consequatur natus tempora. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. responses: "204": description: No Content response. @@ -2641,7 +2687,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Delectus et maxime ut possimus expedita qui. + message: Et quo. ok: false "404": description: 'NotFound: Resource not found' @@ -2746,21 +2792,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Minima adipisci aut quia quisquam. - example: Magnam nihil qui doloremque nam magnam aliquid. + example: Amet qui provident. + example: Ut ea. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Possimus dolore. - customer_id: Vero quis consequuntur. - has_credentials: true - id: Autem aspernatur ea voluptatem. - label: Dicta rerum sed perferendis. - project_id: Voluptas eveniet assumenda accusantium aspernatur facere tempora. - status: deleted - version: 5431490552370585468 + account_id: Ut tempora consequuntur cumque repudiandae omnis ut. + customer_id: Est aut labore sint natus. + has_credentials: false + id: Vero quis consequuntur. + label: Ut fugiat magnam quia. + project_id: Quis quo illum cum quod. + status: active + version: 343208040254291221 "404": description: 'NotFound: Resource not found' content: @@ -2814,14 +2860,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Error laudantium. - customer_id: Similique odio adipisci dolore iste. - label: Non nostrum dolorum iure eaque animi. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. credentials: - client_id: Error necessitatibus et autem doloribus est. - client_secret: Maxime labore illo maxime provident. - developer_token: Dignissimos necessitatibus consequuntur. - refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. responses: "201": description: Created response. @@ -2831,21 +2877,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus pariatur et et sed debitis. - example: Necessitatibus reprehenderit illum. + example: Earum laboriosam dignissimos reiciendis et quisquam. + example: Deserunt reiciendis dolorem totam voluptatem. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Possimus nihil qui enim ratione voluptatem eos. - customer_id: Debitis itaque itaque dolores nihil. + account_id: Autem aspernatur ea voluptatem. + customer_id: Accusantium aspernatur facere tempora voluptatem dicta rerum. has_credentials: true - id: Ipsum voluptatem et quam beatae laborum omnis. - label: Aut quis qui laudantium dolore. - project_id: Esse aut et rem suscipit similique. - status: inactive - version: 5244933818906460264 + id: Eos explicabo non quidem. + label: Nam voluptas sed et doloremque reiciendis pariatur. + project_id: Debitis itaque itaque dolores nihil. + status: deleted + version: 8497111294039610948 "400": description: 'BadRequest: Bad request' content: @@ -2917,9 +2963,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Error laudantium. - customer_id: Similique odio adipisci dolore iste. - label: Non nostrum dolorum iure eaque animi. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. responses: "200": description: OK response. @@ -2929,21 +2975,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Possimus accusantium expedita alias. - example: Iusto molestiae cupiditate quis modi. + example: Laudantium doloremque aut eligendi perferendis aut. + example: Consectetur delectus libero id. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Est aut labore sint natus. - customer_id: Quas quibusdam. - has_credentials: true - id: Ut fugiat magnam quia. - label: Distinctio beatae. - project_id: Ut tempora consequuntur cumque repudiandae omnis ut. - status: deleted - version: 8986600307371048121 + account_id: In expedita. + customer_id: Magni ducimus nulla suscipit sed minus soluta. + has_credentials: false + id: Iste voluptatem et voluptatem ut ut. + label: Quia sed omnis quaerat aut. + project_id: Nostrum laborum minima. + status: error + version: 7283482467977491974 "400": description: 'BadRequest: Bad request' content: @@ -3025,10 +3071,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Error necessitatibus et autem doloribus est. - client_secret: Maxime labore illo maxime provident. - developer_token: Dignissimos necessitatibus consequuntur. - refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. responses: "204": description: No Content response. @@ -3095,8 +3141,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Harum iste voluptatem et voluptatem. - ok: false + message: Sed maiores qui sed exercitationem quam. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -3200,20 +3246,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et iste. - example: Odio eos earum fuga non est. + example: Sed ipsam enim esse iure est. + example: Aut sunt ex et autem delectus. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Molestias architecto dicta quidem illo numquam. - has_credentials: false - id: Explicabo vero commodi. - label: Minus ut est recusandae aspernatur eum fugit. - project_id: Qui asperiores velit enim tempore expedita. - status: error - version: 3837864470732187499 + account_id: Ipsam temporibus sint et necessitatibus dolorem ut. + has_credentials: true + id: Quidem illo numquam doloremque et. + label: Fugiat adipisci eos rerum. + project_id: Perferendis ut quia aut. + status: active + version: 1442766184420227830 "404": description: 'NotFound: Resource not found' content: @@ -3268,11 +3314,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Aliquam consequuntur quo aliquid ducimus. + label: Provident quia distinctio. credentials: - client_id: Facilis facilis aut suscipit aut odio iste. - client_secret: Deleniti earum magni quibusdam. - refresh_token: Tenetur velit quaerat aut. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. responses: "201": description: Created response. @@ -3282,20 +3328,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Exercitationem officia corrupti tempora ea. - example: Ipsa sint optio nobis quae corporis. + example: Dolorem omnis aspernatur veritatis adipisci. + example: Voluptas ipsam iste. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Blanditiis atque rerum et officiis sapiente et. - has_credentials: true - id: Harum provident quia distinctio ea. - label: Hic et sed. - project_id: Rem harum provident provident quia laboriosam magnam. + account_id: Asperiores velit enim tempore expedita ut. + has_credentials: false + id: Sapiente et et itaque dolores in. + label: Consequatur nihil explicabo vero commodi est. + project_id: Rem dolores eligendi ea. status: deleted - version: 1429619977254656560 + version: 2256150830368172012 "400": description: 'BadRequest: Bad request' content: @@ -3368,7 +3414,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Aliquam consequuntur quo aliquid ducimus. + label: Provident quia distinctio. responses: "200": description: OK response. @@ -3378,20 +3424,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Rerum reiciendis similique. - example: Saepe voluptatem dolores tempora qui. + example: Adipisci omnis veritatis omnis praesentium omnis. + example: Natus aliquam aut quas aliquid. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Expedita accusantium dolorum qui sed fugiat. + account_id: Architecto unde rerum quisquam ut. has_credentials: true - id: Sed fugiat. - label: Ipsam temporibus sint et necessitatibus dolorem ut. - project_id: Eos rerum. + id: Veniam debitis aut similique ullam temporibus qui. + label: Voluptates neque expedita. + project_id: Sit iusto. status: deleted - version: 3554537496380374690 + version: 2250019048790832853 "400": description: 'BadRequest: Bad request' content: @@ -3473,9 +3519,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Facilis facilis aut suscipit aut odio iste. - client_secret: Deleniti earum magni quibusdam. - refresh_token: Tenetur velit quaerat aut. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. responses: "204": description: No Content response. @@ -3542,8 +3588,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ullam temporibus. - ok: false + message: Repellendus sint. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -3647,21 +3693,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Repudiandae odit. - example: Temporibus ipsum necessitatibus ratione possimus. + example: Ullam voluptatibus nihil. + example: Voluptas consequatur iusto nostrum pariatur. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Non possimus quos voluptatem doloremque consequatur deleniti. - funding_instrument_id: Fuga illo dolorem sit ex commodi sapiente. - has_credentials: false - id: Ut eveniet iusto quidem. - label: Quaerat ut neque expedita nostrum. - project_id: Accusamus ratione consequuntur aut et corrupti. - status: error - version: 5145245548849296683 + account_id: Numquam quia. + funding_instrument_id: Autem provident est. + has_credentials: true + id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Sit ex commodi sapiente a illum. + project_id: Pariatur voluptas odit fuga illo. + status: active + version: 4562568070495708080 "404": description: 'NotFound: Resource not found' content: @@ -3716,13 +3762,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Commodi architecto unde rerum quisquam ut. - label: Quo sit iusto laudantium voluptates neque. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. credentials: - access_token: Amet et eaque. - access_token_secret: Consequatur iste sed illo adipisci sunt. - consumer_key: Neque ipsum nihil cumque repellendus. - consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. responses: "201": description: Created response. @@ -3732,21 +3778,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vero voluptates soluta. - example: Eligendi consequatur officia labore eos. + example: Saepe non tempore. + example: Tempore qui est. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Beatae aliquam quia officiis hic ea. - funding_instrument_id: Debitis vitae quae debitis sunt. - has_credentials: true - id: Aperiam et ipsam vitae. - label: Voluptate nisi natus sint. - project_id: Velit est quis aliquid aliquam. - status: deleted - version: 1415133980301644723 + account_id: Est consequatur eveniet in fuga ut. + funding_instrument_id: Accusamus ratione consequuntur aut et corrupti. + has_credentials: false + id: Beatae aliquam quia officiis hic ea. + label: Vitae quae debitis sunt aperiam ex voluptatibus. + project_id: Ut dolor velit. + status: active + version: 2352400902970282412 "400": description: 'BadRequest: Bad request' content: @@ -3819,8 +3865,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Commodi architecto unde rerum quisquam ut. - label: Quo sit iusto laudantium voluptates neque. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. responses: "200": description: OK response. @@ -3830,21 +3876,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Facilis repellat eveniet reiciendis. - example: Non placeat. + example: Laborum ut magnam aut illum commodi placeat. + example: Voluptas libero pariatur ut qui sint. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Ut sint. - funding_instrument_id: Rerum omnis veritatis. - has_credentials: false - id: Excepturi dolorem autem ipsa autem provident. - label: Quis et odio tenetur optio. - project_id: Iure quo culpa. - status: inactive - version: 36658389617783588 + account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + funding_instrument_id: Eaque animi molestias error laudantium. + has_credentials: true + id: Quis et odio tenetur optio. + label: Iste eveniet laudantium rerum. + project_id: Ut sint. + status: error + version: 7980949958307848867 "400": description: 'BadRequest: Bad request' content: @@ -3926,10 +3972,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Amet et eaque. - access_token_secret: Consequatur iste sed illo adipisci sunt. - consumer_key: Neque ipsum nihil cumque repellendus. - consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. responses: "204": description: No Content response. @@ -3996,7 +4042,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Maxime incidunt asperiores. + message: Odio adipisci dolore iste ipsa. ok: true "404": description: 'NotFound: Resource not found' @@ -4051,8 +4097,8 @@ paths: schema: type: string description: Job UUID - example: Ipsum expedita animi. - example: Velit at omnis autem. + example: Ipsa sint optio nobis quae corporis. + example: Et iste. responses: "200": description: OK response. @@ -4061,10 +4107,19 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Voluptas nam. - job_id: Nesciunt asperiores et est. - result: Facere sint totam sapiente vitae numquam ut. - status: partial + error: Veniam et. + job_id: Iure modi asperiores ut. + result: Autem voluptates iste. + status: running + "400": + description: 'BadRequest: Bad request' + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestError' + example: + code: "400" + message: The request was invalid. "404": description: 'NotFound: Resource not found' content: @@ -4125,10 +4180,16 @@ components: Brief: type: object properties: + copy: + description: Ad copy + example: Eaque ut laudantium nostrum ratione. etag: type: string description: ETag header value (mirrors version) - example: Quos expedita voluptas qui eaque. + example: Non iusto odit consequatur in vero soluta. + event_details: + description: Extracted event/course details + example: Laboriosam nostrum quos expedita voluptas. event_slug: type: string description: Event/course slug @@ -4137,6 +4198,9 @@ components: type: string description: Brief UUID example: Et qui ut libero numquam. + keywords: + description: Keyword list + example: Eius laborum. platforms: type: array items: @@ -4162,6 +4226,9 @@ components: - draft - approved - archived + targeting: + description: Targeting recommendation + example: Voluptate itaque fugit rerum cumque. url: type: string description: Event/course page URL @@ -4169,21 +4236,26 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8483228206992747737 + example: 7582961521318439491 format: int64 example: - etag: Repudiandae necessitatibus dolorem enim beatae quia. - event_slug: Consequatur in vero soluta. - id: Laudantium nostrum ratione id eius laborum aspernatur. + copy: Ut ut odio odio sed minus quia. + etag: Itaque omnis ut. + event_details: Nihil sunt doloremque. + event_slug: Porro ut et cupiditate. + id: Eius dicta. + keywords: Ea architecto autem iste. platforms: - - Distinctio dolore velit pariatur. - - Assumenda perspiciatis dolor porro. - - Et cupiditate molestiae ea ullam minima voluptatem. - program_type: Molestiae suscipit non iusto. - project_id: Itaque fugit rerum cumque. + - Necessitatibus dolorem enim beatae. + - Minus vero at ut quis. + - Molestiae aut fugit alias. + - Qui maiores quia non unde deserunt. + program_type: Non assumenda perspiciatis. + project_id: Ullam distinctio dolore velit. status: draft - url: Eius dicta. - version: 5990824706789002616 + targeting: In ipsa tempore incidunt velit provident perspiciatis. + url: Ea ullam minima voluptatem vel deleniti. + version: 1281384136826250351 required: - id - project_id @@ -4194,6 +4266,12 @@ components: Brief2: type: object properties: + copy: + description: Ad copy + example: Quod enim pariatur et occaecati veritatis voluptatem. + event_details: + description: Extracted event/course details + example: Iure enim dolore est. event_slug: type: string description: Event/course slug @@ -4202,6 +4280,9 @@ components: type: string description: Brief UUID example: Et optio sed omnis aut voluptatem voluptas. + keywords: + description: Keyword list + example: Architecto aliquam mollitia labore sapiente dolores tenetur. platforms: type: array items: @@ -4224,11 +4305,14 @@ components: status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived + targeting: + description: Targeting recommendation + example: Accusamus qui. url: type: string description: Event/course page URL @@ -4236,19 +4320,23 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7907674416929152715 + example: 1931126915939314041 format: int64 example: - event_slug: Tenetur non accusamus qui ex. - id: Dolore est dolorem quod enim pariatur. + copy: Necessitatibus sit. + event_details: Sit dignissimos incidunt voluptas. + event_slug: Reiciendis enim. + id: Mollitia ea. + keywords: Quis aperiam deserunt nostrum consectetur et sed. platforms: - - Et amet sunt. - - Ad quae nisi. - program_type: Aut architecto aliquam mollitia labore sapiente. - project_id: Occaecati veritatis. - status: draft - url: Quia mollitia. - version: 7441335261794230827 + - Nemo nihil dolorum consequatur sed tempora qui. + - Hic vel aspernatur at quam est ea. + program_type: Ad quae nisi. + project_id: Et amet sunt. + status: approved + targeting: Libero blanditiis. + url: Cum et ab ipsum. + version: 1441686313140477581 required: - id - project_id @@ -4259,62 +4347,79 @@ components: Brief3: type: object properties: + copy: + description: Ad copy + example: Praesentium et. + event_details: + description: Extracted event/course details + example: Dolor consectetur eos iste. event_slug: type: string description: Event/course slug - example: Hic vel aspernatur at quam est ea. + example: Dolores laborum sed. id: type: string description: Brief UUID - example: Blanditiis cum et. + example: Nulla sunt autem eos rerum provident dicta. + keywords: + description: Keyword list + example: Veniam iusto consequatur quia sed officia eligendi. platforms: type: array items: type: string - example: Necessitatibus sit. + example: Est quis impedit. description: Suggested default platforms example: - - Aperiam deserunt nostrum consectetur. - - Sed praesentium libero blanditiis qui minima. - - Nulla sunt autem eos rerum provident dicta. + - Harum et consequatur eligendi eum necessitatibus. + - Magnam ut. + - Voluptate voluptates corrupti sapiente. + - Dolorum repellat expedita ut recusandae dolor. program_type: type: string description: Funnel context - example: Nemo nihil dolorum consequatur sed tempora qui. + example: Commodi odio sunt esse mollitia incidunt. project_id: type: string description: Owning project - example: Ipsum eius. + example: Voluptatem voluptate dolor dolores provident. status: type: string description: Lifecycle status - example: archived + example: draft enum: - draft - approved - archived + targeting: + description: Targeting recommendation + example: Qui impedit. url: type: string description: Event/course page URL - example: Sit dignissimos incidunt voluptas. + example: Veritatis itaque. version: type: integer description: Optimistic-concurrency version - example: 8003111466267168066 + example: 1624749011573187666 format: int64 example: - event_slug: Veritatis itaque. - id: Dolor dolores provident porro. + copy: Amet quaerat modi. + event_details: Velit quis harum recusandae est ipsum. + event_slug: Quo necessitatibus necessitatibus. + id: Minus reprehenderit dignissimos aut velit. + keywords: Eum totam voluptatem eos. platforms: - - Harum et consequatur eligendi eum necessitatibus. - - Magnam ut. - - Voluptate voluptates corrupti sapiente. - - Dolorum repellat expedita ut recusandae dolor. - program_type: Dolores laborum sed. - project_id: Odio sunt esse mollitia incidunt. + - Voluptatem rerum praesentium voluptatem blanditiis non. + - Temporibus in repudiandae tenetur. + - Saepe vel aut animi sit esse ratione. + - Blanditiis laborum est quasi dignissimos. + program_type: Repellendus omnis doloribus amet cum. + project_id: At sint laborum veniam. status: approved - url: Est quis impedit. - version: 9059453485160266445 + targeting: Sint exercitationem. + url: Sint dicta. + version: 6296331077615132388 required: - id - project_id @@ -4325,61 +4430,77 @@ components: Brief4: type: object properties: + copy: + description: Ad copy + example: Placeat dolores numquam molestias quibusdam aliquid. + event_details: + description: Extracted event/course details + example: Et itaque ut dolores in voluptas. event_slug: type: string description: Event/course slug - example: Impedit dolores. + example: Autem quo tempora voluptate fuga. id: type: string description: Brief UUID - example: Eos iste corporis praesentium. + example: Sit in quia molestiae perspiciatis alias et. + keywords: + description: Keyword list + example: Fuga est aliquam debitis. platforms: type: array items: type: string - example: At sint laborum veniam. + example: Rerum cum eaque nesciunt est totam inventore. description: Suggested default platforms example: - - Omnis doloribus. - - Cum ut quo. - - Necessitatibus id sint dicta assumenda omnis voluptatem. - - Praesentium voluptatem blanditiis non totam temporibus. + - Ipsam aut vel. + - Eos reiciendis. + - Minima non. program_type: type: string description: Funnel context - example: Officia eligendi alias. + example: Libero et consequuntur suscipit distinctio pariatur mollitia. project_id: type: string description: Owning project - example: Quis veniam iusto consequatur quia. + example: Ex molestiae praesentium. status: type: string description: Lifecycle status - example: approved + example: draft enum: - draft - approved - archived + targeting: + description: Targeting recommendation + example: Deleniti est natus sequi beatae consectetur. url: type: string description: Event/course page URL - example: Alias minus reprehenderit dignissimos aut velit. + example: Distinctio maiores mollitia aut. version: type: integer description: Optimistic-concurrency version - example: 8443584423631303721 + example: 7075859053648216976 format: int64 example: - event_slug: Velit quis harum recusandae est ipsum. - id: Aperiam saepe. + copy: Distinctio tempore qui velit omnis dolorem est. + event_details: Voluptatibus nihil nisi. + event_slug: Est molestiae voluptates ipsum neque sapiente aliquid. + id: Et quis consequatur dolores repellat nostrum similique. + keywords: Quia recusandae dignissimos dolore harum totam. platforms: - - Totam voluptatem eos doloribus sint exercitationem eligendi. - - Quidem sit in quia molestiae perspiciatis alias. - program_type: Laborum est quasi dignissimos. - project_id: Aut animi sit esse ratione aliquid. - status: approved - url: Amet quaerat modi. - version: 3775655592825521439 + - Nobis hic eos magni eos voluptatem. + - Hic ut sapiente harum aliquam sunt eum. + - Eaque occaecati. + program_type: Minima aut fugit eos et iure laudantium. + project_id: Iste aliquid. + status: draft + targeting: Vitae illo consequuntur esse. + url: Velit sunt molestiae eius. + version: 7533657070215672415 required: - id - project_id @@ -4390,32 +4511,40 @@ components: Brief5: type: object properties: + copy: + description: Ad copy + example: Et provident illo non quisquam iure doloremque. + event_details: + description: Extracted event/course details + example: Est et magni. event_slug: type: string description: Event/course slug - example: Tempora voluptate fuga ea distinctio. + example: Voluptatem ipsa. id: type: string description: Brief UUID - example: Molestiae praesentium minus. + example: Ut ullam aliquam dolore iure consequatur. + keywords: + description: Keyword list + example: Ut aliquid. platforms: type: array items: type: string - example: Eaque nesciunt. + example: Tempora est eveniet sequi ea. description: Suggested default platforms example: - - Inventore in eligendi ipsam. - - Vel atque eos reiciendis sit minima non. - - Et itaque ut dolores in voluptas. + - Consequatur possimus. + - Assumenda sit delectus veniam. program_type: type: string description: Funnel context - example: Pariatur mollitia incidunt autem. + example: Quia labore non ut dolores et. project_id: type: string description: Owning project - example: Et consequuntur suscipit. + example: Nostrum iste nemo fugiat sunt deleniti officia. status: type: string description: Lifecycle status @@ -4424,28 +4553,33 @@ components: - draft - approved - archived + targeting: + description: Targeting recommendation + example: Repellendus eveniet veritatis impedit aut iste earum. url: type: string description: Event/course page URL - example: Mollitia aut tempore rerum. + example: Assumenda excepturi. version: type: integer description: Optimistic-concurrency version - example: 3896136867528920326 + example: 2088061558739708952 format: int64 example: - event_slug: Aut omnis labore et quis consequatur dolores. - id: Numquam molestias quibusdam aliquid deleniti. + copy: Commodi qui mollitia et eum veniam. + event_details: Alias voluptatem ut consequatur ut recusandae. + event_slug: Quis odio enim nam id voluptatem. + id: Accusamus pariatur saepe. + keywords: Aliquam eaque voluptatem omnis. platforms: - - Minima aut fugit eos et iure laudantium. - - Est molestiae voluptates ipsum neque sapiente aliquid. - - Velit sunt molestiae eius. - - Reprehenderit nobis hic eos magni. - program_type: Est natus sequi beatae. - project_id: Est aliquam debitis natus. + - Eaque suscipit harum sint neque quia fuga. + - Veniam itaque optio consequatur nulla sint. + program_type: Laboriosam sunt quis omnis animi. + project_id: Qui et. status: approved - url: Nostrum similique omnis iste. - version: 1280403017059047628 + targeting: Cupiditate aut. + url: Vero alias temporibus illum. + version: 232152934679383541 required: - id - project_id @@ -4515,50 +4649,50 @@ components: brief_id: type: string description: Parent brief - example: Et itaque rem eos et deleniti dolores. + example: Facere qui omnis. campaign_name: type: string description: Campaign name - example: Enim vitae officia dolorem odio. + example: Dolores natus a sint quod sunt. etag: type: string description: ETag header value (mirrors version) - example: Natus a. + example: Ipsa non. id: type: string description: Campaign UUID - example: Beatae velit laudantium error eum et aut. + example: Et itaque rem eos et deleniti dolores. platform: type: string description: Channel - example: Facilis qui libero. + example: Enim vitae officia dolorem odio. platform_campaign_id: type: string description: ID returned by the ad platform - example: Facere qui omnis. + example: Beatae quia qui excepturi minima. project_id: type: string description: Owning project - example: Beatae harum similique corporis id eum. + example: Facilis qui libero. status: type: string description: Campaign status - example: Beatae quia qui excepturi minima. + example: Et nesciunt iure quis in ut mollitia. version: type: integer description: Optimistic-concurrency version - example: 5260218798443375074 + example: 9203456138223090094 format: int64 example: - brief_id: Non quo necessitatibus. - campaign_name: Exercitationem accusantium nihil. - etag: Omnis doloremque at fugit dolor et. - id: Quod sunt quae et nesciunt iure quis. - platform: Molestiae est accusantium laudantium nostrum. - platform_campaign_id: Dolores sit. - project_id: Ut mollitia nihil ducimus. - status: Quod alias ipsum voluptates pariatur magni. - version: 2477378437106771259 + brief_id: Dolores sit. + campaign_name: Amet omnis. + etag: Sit cupiditate non. + id: Necessitatibus quibusdam. + platform: Exercitationem accusantium nihil. + platform_campaign_id: Quod alias ipsum voluptates pariatur magni. + project_id: Est accusantium laudantium nostrum. + status: At fugit dolor. + version: 6873369027351486557 required: - id - project_id @@ -4573,45 +4707,45 @@ components: brief_id: type: string description: Parent brief - example: Voluptatibus nihil nisi. + example: Quaerat et eius culpa magni illum consequatur. campaign_name: type: string description: Campaign name - example: Vitae illo consequuntur esse. + example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. id: type: string description: Campaign UUID - example: Hic ut sapiente harum aliquam sunt eum. + example: Minima iure quos enim occaecati beatae. platform: type: string description: Channel - example: Distinctio tempore qui velit omnis dolorem est. + example: Soluta dolore vitae. platform_campaign_id: type: string description: ID returned by the ad platform - example: Quia recusandae dignissimos dolore harum totam. + example: In commodi et asperiores et. project_id: type: string description: Owning project - example: Eaque occaecati. + example: Molestiae ad voluptatum ducimus accusantium et. status: type: string description: Campaign status - example: Libero recusandae ut ullam aliquam. + example: Assumenda voluptatem aut debitis vitae. version: type: integer description: Optimistic-concurrency version - example: 4964407865557967175 + example: 529135087014785401 format: int64 example: - brief_id: Sunt deleniti. - campaign_name: Assumenda excepturi. - id: Consequatur minus. - platform: Natus quia labore non ut dolores et. - platform_campaign_id: Voluptatem ipsa. - project_id: Iste nemo. - status: Tempora est eveniet sequi ea. - version: 4255946399444764188 + brief_id: Et et itaque qui repudiandae magnam. + campaign_name: Quaerat molestias. + id: Eos eius. + platform: Ullam qui rerum numquam quo. + platform_campaign_id: A quia magnam culpa ipsam totam. + project_id: Odit rerum commodi ea et. + status: Sequi aut veniam ratione. + version: 4528974556497386277 required: - id - project_id @@ -4626,45 +4760,45 @@ components: brief_id: type: string description: Parent brief - example: Est et magni. + example: Quo et enim totam et minima dolorem. campaign_name: type: string description: Campaign name - example: Repellendus eveniet veritatis impedit aut iste earum. + example: In praesentium cumque. id: type: string description: Campaign UUID - example: Consequatur possimus. + example: Omnis ad voluptas esse voluptates. platform: type: string description: Channel - example: Et provident illo non quisquam iure doloremque. + example: Est tempora qui. platform_campaign_id: type: string description: ID returned by the ad platform - example: Ut aliquid. + example: Voluptas necessitatibus cumque non porro qui molestias. project_id: type: string description: Owning project - example: Assumenda sit delectus veniam. + example: Cumque mollitia. status: type: string description: Campaign status - example: Quod exercitationem. + example: Pariatur odio molestias voluptatum. version: type: integer description: Optimistic-concurrency version - example: 5517772416028431681 + example: 7642665711405677689 format: int64 example: - brief_id: Sunt quis odio enim nam id voluptatem. - campaign_name: Neque quia. - id: Saepe ab qui. - platform: Vero alias temporibus illum. - platform_campaign_id: Ullam eaque suscipit harum. - project_id: Ab laboriosam sunt quis omnis. - status: Et veniam itaque optio consequatur nulla sint. - version: 6009088986580236396 + brief_id: Qui omnis nesciunt qui consequuntur. + campaign_name: Odit provident sed quo aperiam. + id: Perferendis possimus deserunt iure et. + platform: Fuga atque. + platform_campaign_id: Sequi culpa. + project_id: Ea quidem ducimus tempora ea molestias. + status: Aspernatur nihil et incidunt dolorem dolor sed. + version: 7197986407230546835 required: - id - project_id @@ -4678,24 +4812,31 @@ components: properties: config: description: Per-platform campaign configuration - example: Ut ut odio odio sed minus quia. + example: Voluptatum veniam molestiae. platforms: type: array items: type: string - example: Vero at ut quis. + example: google-ads + enum: + - google-ads + - linkedin-ads + - meta-ads + - reddit-ads + - twitter-ads + - microsoft-ads + - hubspot description: Platforms to create campaigns on (binding selection) example: - - Aut fugit alias. - - Qui maiores quia non unde deserunt. - - Nihil sunt doloremque. + - meta-ads + - google-ads + - twitter-ads example: - config: Modi voluptatum veniam molestiae quibusdam. + config: Aspernatur voluptatem nobis. platforms: - - Architecto autem iste. - - In ipsa tempore incidunt velit provident perspiciatis. - - Tempore sunt itaque omnis. - - Ex sunt sit beatae. + - google-ads + - meta-ads + - microsoft-ads required: - platforms CampaignUpdateInput: @@ -4704,18 +4845,18 @@ components: campaign_name: type: string description: Campaign name - example: Sit cupiditate non. + example: Modi possimus consequatur. config: description: Campaign configuration snapshot - example: Eveniet esse officia explicabo dolor deserunt. + example: Voluptatibus aspernatur. status: type: string description: Campaign status - example: Modi possimus consequatur. + example: Eveniet esse officia explicabo dolor deserunt. example: - campaign_name: Voluptatibus aspernatur. - config: Hic vel ut. - status: Accusamus nam cupiditate. + campaign_name: Accusamus nam cupiditate. + config: Earum minus autem omnis qui debitis eum. + status: Hic vel ut. required: - campaign_name - status @@ -4759,14 +4900,14 @@ components: message: type: string description: Human-readable detail - example: Minus autem. + example: Veniam dolores quidem necessitatibus. ok: type: boolean description: Whether the credential authenticated against the provider example: false example: - message: Debitis eum ipsa sed. - ok: true + message: Sit reiciendis et vel beatae molestiae. + ok: false required: - ok CreateBriefRequestBody: @@ -4776,17 +4917,16 @@ components: $ref: '#/components/schemas/BriefInput' example: brief: - copy: Mollitia molestiae saepe qui ex commodi. - event_details: Quia ut atque. - event_slug: Voluptate et corporis voluptatum occaecati quis perspiciatis. - keywords: Expedita unde molestiae. + copy: Et incidunt pariatur quod. + event_details: Molestiae inventore voluptas. + event_slug: Voluptas corporis velit et. + keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. platforms: - - Vel nobis non molestias non. - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. + - Molestiae saepe qui. + - Commodi voluptatem expedita. program_type: membership - targeting: Voluptas dolor et incidunt pariatur quod odit. - url: Nesciunt unde ullam occaecati maxime. + targeting: Facilis iste. + url: Quia ut atque. required: - brief CreateCampaignsRequestBody: @@ -4796,11 +4936,12 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Eligendi earum qui est et id laudantium. + config: Est voluptatum enim earum et doloribus. platforms: - - Ea magnam ut nihil quo tenetur. - - Fugiat natus. - - Et tempore. + - hubspot + - meta-ads + - reddit-ads + - twitter-ads required: - input CreateGoogleAdsRequestBody: @@ -4816,10 +4957,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ex ea ullam corrupti. - client_secret: Et omnis accusantium. - developer_token: Iure modi asperiores ut. - refresh_token: Consectetur sint nesciunt. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - config - credentials @@ -4832,14 +4973,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Sed omnis. - brand_kit: Sed maiores qui sed exercitationem quam. - label: Ut amet nostrum laborum minima ipsum. - portal_id: Aut id in. - sender_email: Et magnam cumque quasi magni ducimus. - sender_name: Suscipit sed minus soluta quasi. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. credentials: - private_app_token: Non sint praesentium quia. + private_app_token: Distinctio aut. required: - config - credentials @@ -4853,10 +4994,10 @@ components: example: config: account_id: "538170226" - label: Ratione sunt nostrum tenetur repellendus dolorem cum. + label: Tempora error rerum quae nihil. org_id: "208777" credentials: - access_token: Fugit enim et sint consectetur ea minus. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - config - credentials @@ -4870,12 +5011,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Harum et minus voluptas. - label: Alias non sequi consequatur dolorum. - page_id: Voluptatem voluptas omnis est tempora ipsum aut. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. credentials: - access_token: Debitis labore aut. - app_secret: Porro ab id necessitatibus consequatur natus tempora. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - config - credentials @@ -4888,14 +5029,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Error laudantium. - customer_id: Similique odio adipisci dolore iste. - label: Non nostrum dolorum iure eaque animi. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. credentials: - client_id: Error necessitatibus et autem doloribus est. - client_secret: Maxime labore illo maxime provident. - developer_token: Dignissimos necessitatibus consequuntur. - refresh_token: Repudiandae voluptatem vitae iste maxime modi laborum. + client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. + client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. + developer_token: Ipsam aut quis qui laudantium. + refresh_token: Omnis eveniet esse aut et rem suscipit. required: - config - credentials @@ -4909,11 +5050,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Aliquam consequuntur quo aliquid ducimus. + label: Provident quia distinctio. credentials: - client_id: Facilis facilis aut suscipit aut odio iste. - client_secret: Deleniti earum magni quibusdam. - refresh_token: Tenetur velit quaerat aut. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - config - credentials @@ -4927,13 +5068,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Commodi architecto unde rerum quisquam ut. - label: Quo sit iusto laudantium voluptates neque. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. credentials: - access_token: Amet et eaque. - access_token_secret: Consequatur iste sed illo adipisci sunt. - consumer_key: Neque ipsum nihil cumque repellendus. - consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - config - credentials @@ -4943,35 +5084,35 @@ components: account_id: type: string description: Provider account identifier - example: Explicabo repudiandae aut reiciendis recusandae molestias. + example: Hic est quia pariatur odit ullam. etag: type: string description: ETag header value (mirrors version) - example: Aut non. + example: Sed quo perferendis nemo ut quisquam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Praesentium voluptate. + example: Explicabo repudiandae aut reiciendis recusandae molestias. label: type: string description: Optional friendly name - example: Ipsam ut sed natus et unde. + example: Quod impedit accusamus incidunt minus veritatis enim. login_customer_id: type: string description: Manager account used for API access - example: Accusamus in quod. + example: Repellendus quos magnam. project_id: type: string description: Owning project - example: Qui impedit temporibus eveniet eos omnis cumque. + example: Vel inventore aliquid aut non eligendi accusamus. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -4980,18 +5121,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1246943015343350087 + example: 2175885598856983154 format: int64 example: - account_id: Ut quisquam nisi repellendus quos magnam. - etag: Nihil quaerat asperiores pariatur. + account_id: Quae qui inventore dolorem deserunt. + etag: Rerum sint. has_credentials: true - id: Accusamus incidunt minus veritatis. - label: Ex id corrupti sed quo perferendis. - login_customer_id: Vel veritatis hic rerum accusamus velit error. - project_id: Unde hic est quia pariatur odit ullam. + id: In id voluptatem nihil quaerat. + label: Hic rerum accusamus velit error. + login_customer_id: Magnam adipisci architecto deserunt. + project_id: Pariatur repellat vel. status: active - version: 4262114400172519549 + version: 1017420418363680400 required: - id - project_id @@ -5006,7 +5147,7 @@ components: account_id: type: string description: Provider account identifier - example: Aliquam eaque voluptatem omnis. + example: Autem maxime hic. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5014,23 +5155,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatem ut. + example: Harum voluptates sit est corporis. label: type: string description: Optional friendly name - example: Qui mollitia et eum veniam. + example: Necessitatibus ut necessitatibus in. login_customer_id: type: string description: Manager account used for API access - example: Culpa sed minima iure. + example: Amet hic est. project_id: type: string description: Owning project - example: Ut recusandae modi. + example: Voluptatem repellat expedita inventore. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5039,17 +5180,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2166778479612099571 + example: 7828959688196597051 format: int64 example: - account_id: Soluta dolore vitae. + account_id: Libero autem quod saepe ullam ipsum. has_credentials: false - id: Enim occaecati beatae eveniet molestiae ad voluptatum. - label: Quaerat et eius culpa magni illum consequatur. - login_customer_id: Asperiores et maiores reiciendis laudantium dolor ipsam. - project_id: Accusantium et. + id: Quaerat occaecati rerum. + label: Aspernatur quos est magnam voluptates. + login_customer_id: Dolore sed. + project_id: Quae esse mollitia et dolorum. status: error - version: 2560433690780116012 + version: 3252068377050447352 required: - id - project_id @@ -5063,7 +5204,7 @@ components: account_id: type: string description: Provider account identifier - example: Consequatur et. + example: Est ipsam sint autem repudiandae asperiores et. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5071,23 +5212,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Maxime nesciunt repellendus. + example: Sunt accusantium totam quia. label: type: string description: Optional friendly name - example: Accusantium odit rerum commodi ea. + example: Commodi qui. login_customer_id: type: string description: Manager account used for API access - example: Magnam atque ullam qui rerum numquam quo. + example: Nulla dolore quibusdam ducimus voluptas soluta. project_id: type: string description: Owning project - example: Voluptatem aut debitis vitae unde velit eos. + example: Accusantium debitis adipisci qui iste explicabo. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -5096,17 +5237,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1674128305180380972 + example: 7019802315342385433 format: int64 example: - account_id: Perferendis omnis ad voluptas esse. - has_credentials: false - id: A quia magnam culpa ipsam totam. - label: Sequi aut veniam ratione. - login_customer_id: Quidem quo et enim totam et. - project_id: Quaerat molestias. - status: inactive - version: 7506513470866505325 + account_id: Ex est modi cupiditate. + has_credentials: true + id: Qui at fugiat est omnis inventore. + label: Consequatur quisquam explicabo. + login_customer_id: Consequatur molestias et et deleniti sint. + project_id: Ab totam laboriosam quos omnis deserunt. + status: error + version: 765646658236151796 required: - id - project_id @@ -5120,7 +5261,7 @@ components: account_id: type: string description: Provider account identifier - example: In praesentium cumque. + example: Aliquam et asperiores quae voluptatem velit. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5128,23 +5269,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolorem sit. + example: Odit eos. label: type: string description: Optional friendly name - example: Voluptas necessitatibus cumque non porro qui molestias. + example: Hic quam impedit placeat consequatur. login_customer_id: type: string description: Manager account used for API access - example: Voluptatum mollitia nulla perferendis possimus. + example: Enim voluptas numquam. project_id: type: string description: Owning project - example: Tempora qui. + example: Quidem est. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -5153,17 +5294,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6176866709241070937 + example: 5408757854107547795 format: int64 example: - account_id: Fuga atque. + account_id: Officia dolorem. has_credentials: true - id: Iure et. - label: Qui omnis nesciunt qui consequuntur. - login_customer_id: Odit provident sed quo aperiam. - project_id: Ea quidem ducimus tempora ea molestias. + id: Et iusto eius dolor magnam necessitatibus. + label: Tempora voluptatem rem fugit accusantium est necessitatibus. + login_customer_id: Aut soluta quae et est et corporis. + project_id: Mollitia earum aut qui sit rerum. status: inactive - version: 5760426389627270301 + version: 758133864872776679 required: - id - project_id @@ -5198,25 +5339,25 @@ components: client_id: type: string description: OAuth client id - example: Et vel beatae molestiae fuga. + example: Sed corrupti sit. client_secret: type: string description: OAuth client secret - example: Vitae consequatur eos. + example: Labore quia esse consectetur tenetur eum. developer_token: type: string description: Google Ads developer token - example: Aut ut. + example: Aut ut sit nisi architecto. refresh_token: type: string description: OAuth refresh token - example: Dolores quidem necessitatibus voluptatem consequatur sit. + example: Natus vitae consequatur eos sit aut ut. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Labore quia esse consectetur tenetur eum. - client_secret: Aut ut sit nisi architecto. - developer_token: Rerum et recusandae possimus quis. - refresh_token: Sed corrupti sit. + client_id: Praesentium voluptate. + client_secret: Qui impedit temporibus eveniet eos omnis cumque. + developer_token: Ipsam ut sed natus et unde. + refresh_token: Rerum et recusandae possimus quis. required: - refresh_token - client_id @@ -5306,43 +5447,43 @@ components: account_id: type: string description: Provider account identifier - example: Dolor molestiae quia voluptatem deserunt libero. + example: Itaque iure soluta autem. brand_kit: type: string description: Per-project brand kit selector - example: Non illo ab in voluptatem minus est. + example: Atque qui dignissimos aut eaque eveniet. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptas tenetur esse. + example: Est eum ut ut amet et molestiae. label: type: string description: Optional friendly name - example: Quaerat ipsa voluptatem. + example: Qui quae qui optio. portal_id: type: string description: HubSpot portal/account ID - example: Aut impedit a veritatis. + example: Odit numquam quia. project_id: type: string description: Owning project - example: Assumenda sed minima nihil. + example: Nihil dolor exercitationem eum placeat dolores culpa. sender_email: type: string description: Default sender address - example: Consequuntur sed ea sunt debitis. + example: Aut dolores. sender_name: type: string description: Default sender name - example: Voluptas qui voluptas veniam sint voluptas. + example: Voluptatem beatae quis dignissimos voluptatem et labore. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -5351,20 +5492,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1552956989772584247 + example: 3577746410602694753 format: int64 example: - account_id: Ratione dicta. - brand_kit: Deleniti reprehenderit saepe quas commodi qui qui. - has_credentials: true - id: Molestiae soluta vel ad et in voluptatem. - label: Dolores qui. - portal_id: Non qui ad cumque voluptas qui facere. - project_id: Perspiciatis ea dolor. - sender_email: Voluptatem saepe eligendi eum non. - sender_name: Possimus totam occaecati enim eaque. - status: inactive - version: 8244843411375537375 + account_id: Modi vel aut rerum. + brand_kit: Dolor eum et consequatur. + has_credentials: false + id: Ut unde dolore id. + label: Ad optio magnam sequi esse. + portal_id: Assumenda cum nemo esse nobis. + project_id: Necessitatibus fuga ducimus dolorem ut aspernatur. + sender_email: Aut dolorem ea veniam. + sender_name: Quae adipisci doloribus ullam. + status: deleted + version: 9002316743787506494 required: - id - project_id @@ -5378,43 +5519,43 @@ components: account_id: type: string description: Provider account identifier - example: Facere iste. + example: At magnam saepe incidunt nisi est. brand_kit: type: string description: Per-project brand kit selector - example: Magni est officiis enim qui occaecati. + example: Deleniti non in iure dolores et quis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Architecto recusandae voluptates excepturi reiciendis numquam. + example: Optio enim nisi doloremque rerum sed consequatur. label: type: string description: Optional friendly name - example: Aspernatur delectus rem. + example: Dolores dignissimos perferendis tempore eum laboriosam iure. portal_id: type: string description: HubSpot portal/account ID - example: Ad doloremque soluta et quam totam error. + example: Possimus non aliquid qui. project_id: type: string description: Owning project - example: Amet dolorem qui eaque ut iste. + example: Quia amet vero dolorum incidunt officia nihil. sender_email: type: string description: Default sender address - example: Repudiandae voluptate est enim aut laborum. + example: Neque sed alias. sender_name: type: string description: Default sender name - example: Non consequatur est et. + example: Id ducimus excepturi est et est. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5423,20 +5564,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4558831950104085533 + example: 6047270410556243251 format: int64 example: - account_id: Ut voluptatem velit eos aut est est. - brand_kit: Autem aperiam quis. - has_credentials: false - id: Autem ullam. - label: In eveniet explicabo voluptatem et quis totam. - portal_id: Et molestiae blanditiis nihil dolor exercitationem. - project_id: Quis sed consequatur velit atque nam. - sender_email: Placeat dolores culpa sed. - sender_name: Quae qui optio magni itaque iure. - status: inactive - version: 657346491219148846 + account_id: Corrupti sint molestiae occaecati est. + brand_kit: Nesciunt sed magnam sed vero nulla. + has_credentials: true + id: Recusandae similique assumenda ut quia. + label: Nam eius nulla suscipit ullam. + portal_id: Ratione nobis ut occaecati tenetur minima veritatis. + project_id: Nesciunt minus natus non. + sender_email: Impedit laborum quaerat qui ut ut qui. + sender_name: Explicabo dolorem totam non. + status: error + version: 9169545032565251193 required: - id - project_id @@ -5450,11 +5591,11 @@ components: account_id: type: string description: Provider account identifier - example: Qui dignissimos. + example: Sunt labore voluptate. brand_kit: type: string description: Per-project brand kit selector - example: Modi vel aut rerum. + example: Beatae non et excepturi sit minus. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5462,31 +5603,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Enim odit numquam. + example: Vel et et iure tempora. label: type: string description: Optional friendly name - example: Beatae quis dignissimos voluptatem et labore sit. + example: Eum ut. portal_id: type: string description: HubSpot portal/account ID - example: Ut unde dolore id. + example: Possimus saepe quam culpa qui. project_id: type: string description: Owning project - example: Placeat aut dolores at. + example: Voluptatum perspiciatis autem. sender_email: type: string description: Default sender address - example: Necessitatibus fuga ducimus dolorem ut aspernatur. + example: Ipsa molestias. sender_name: type: string description: Default sender name - example: Ad optio magnam sequi esse. + example: Nam debitis hic qui consequatur laborum. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -5495,20 +5636,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3131513535227055982 + example: 2692133725202625638 format: int64 example: - account_id: Dolor eum et consequatur. - brand_kit: Iure odio at magnam saepe. + account_id: Aspernatur ipsam consequatur qui illo totam fuga. + brand_kit: Libero quia quam harum molestiae cupiditate. has_credentials: true - id: Ad minus vero assumenda cum nemo. - label: Quae adipisci doloribus ullam. - portal_id: Doloremque rerum sed consequatur dolor quia. - project_id: Nobis assumenda aut dolorem ea veniam. - sender_email: Vero dolorum incidunt. - sender_name: Nihil deleniti dolores dignissimos perferendis tempore eum. - status: error - version: 3519661115667163110 + id: Et quisquam dicta. + label: Aut tempora dolorem neque assumenda sed. + portal_id: Consequatur sint. + project_id: Eaque enim est libero enim quo. + sender_email: Non illum expedita commodi in dolores nemo. + sender_name: Eaque autem impedit tenetur voluptatibus. + status: inactive + version: 6362542183217834869 required: - id - project_id @@ -5587,16 +5728,17 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Dolorem fugiat et aspernatur voluptatem nobis. + example: Odit odio praesentium. platforms: type: array items: type: string - example: Odio praesentium perferendis eveniet sint voluptatibus quam. + example: Sint voluptatibus quam dicta voluptate consequuntur. description: Platforms this job will create on example: - - Consequuntur voluptatem est qui. - - Quis iste eaque. + - Qui temporibus quis iste eaque. + - Debitis nam. + - Delectus ex aut quia. status: type: string description: Initial status (always 'queued' on create) @@ -5604,11 +5746,11 @@ components: enum: - queued example: - job_id: Debitis nam. + job_id: Consequatur dolore dolor corporis consequatur voluptatem voluptates. platforms: - - Aut quia distinctio consequatur dolore dolor. - - Consequatur voluptatem. - - Sed reprehenderit provident. + - Repudiandae sit qui aut aut. + - Magnam quisquam et consequuntur ut sunt. + - Et velit fuga quos est. status: queued required: - job_id @@ -5619,18 +5761,18 @@ components: error: type: string description: Terminal error, if any - example: Fuga quos. + example: Fugiat aut dicta libero. job_id: type: string description: Job UUID - example: Sit qui aut aut. + example: Officiis beatae sed aut. result: description: Per-platform results, written once when the job reaches a terminal state - example: Quisquam et consequuntur ut sunt aliquam et. + example: Est quia qui fugiat est itaque. status: type: string description: Job status - example: running + example: succeeded enum: - queued - running @@ -5638,10 +5780,10 @@ components: - partial - failed example: - error: Dicta libero iure culpa est possimus dolores. - job_id: Minus officiis beatae sed aut quia. - result: Quia qui fugiat est itaque est fugiat. - status: queued + error: Beatae harum similique corporis id eum. + job_id: Culpa est possimus dolores dignissimos. + result: Laudantium error eum et aut. + status: partial required: - job_id - status @@ -5651,35 +5793,35 @@ components: account_id: type: string description: Provider account identifier - example: Ex ipsa nihil esse voluptate in consectetur. + example: Omnis corrupti facere eum aliquid est repellat. etag: type: string description: ETag header value (mirrors version) - example: Sed voluptatum et impedit quod rem. + example: Incidunt mollitia non sed hic. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quia magni aut nisi est. + example: Ex ipsa nihil esse voluptate in consectetur. label: type: string description: Optional friendly name - example: Voluptas dolorem necessitatibus illum. + example: Sed voluptatum et impedit quod rem. org_id: type: string description: LinkedIn organization URN id - example: Omnis corrupti facere eum aliquid est repellat. + example: Est distinctio accusamus a perferendis. project_id: type: string description: Owning project - example: Sint est sed. + example: Culpa quaerat. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5688,18 +5830,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2425775250383083650 + example: 6865823349289112261 format: int64 example: - account_id: Quo nostrum quia. - etag: Velit quis. + account_id: Velit quis. + etag: Vel architecto quae error dolor placeat. has_credentials: true - id: Esse sit id incidunt mollitia non sed. - label: Perferendis culpa voluptatem nostrum eaque deleniti. - org_id: Aliquam animi. - project_id: Minima est distinctio accusamus. - status: error - version: 8954977623991310377 + id: Voluptatem nostrum. + label: Ut nobis. + org_id: Minus et. + project_id: Deleniti voluptas quo nostrum quia. + status: inactive + version: 7197135224651925465 required: - id - project_id @@ -5714,31 +5856,31 @@ components: account_id: type: string description: Provider account identifier - example: Necessitatibus ut necessitatibus in. + example: Ex dolor. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Aspernatur nihil et incidunt dolorem dolor sed. + example: Voluptate est reprehenderit consectetur accusamus eaque inventore. label: type: string description: Optional friendly name - example: Voluptatem repellat expedita inventore. + example: Officia dolores et reprehenderit. org_id: type: string description: LinkedIn organization URN id - example: Aliquam ratione ipsum reprehenderit. + example: Vitae qui explicabo tempora accusantium aut. project_id: type: string description: Owning project - example: Delectus harum voluptates sit est corporis. + example: Aut explicabo. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5747,17 +5889,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2355245747867951235 + example: 2969272646168040903 format: int64 example: - account_id: Magnam voluptates molestiae libero autem quod. + account_id: Autem eaque eaque dicta ut magni. has_credentials: true - id: Hic est odio. - label: Esse mollitia et dolorum accusantium aspernatur quos. - org_id: Dolores dolore id dolore sed. - project_id: Occaecati rerum reiciendis. + id: In vel. + label: Et vel dolorum aut inventore consequatur. + org_id: Molestiae qui nobis culpa. + project_id: Nobis qui sunt laboriosam ipsa. status: inactive - version: 6928761352190945924 + version: 32502071618905206 required: - id - project_id @@ -5771,31 +5913,31 @@ components: account_id: type: string description: Provider account identifier - example: Est ipsam sint autem repudiandae asperiores et. + example: Dolores dolores. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Sunt accusantium totam quia. + example: Temporibus dolorem cumque quis accusantium quia enim. label: type: string description: Optional friendly name - example: Commodi qui. + example: Ipsum et et laudantium. org_id: type: string description: LinkedIn organization URN id - example: Nulla dolore quibusdam ducimus voluptas soluta. + example: Sit est atque qui quaerat qui vitae. project_id: type: string description: Owning project - example: Accusantium debitis adipisci qui iste explicabo. + example: Asperiores velit aut alias quod minima. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5804,17 +5946,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7019802315342385433 + example: 1323696837483058057 format: int64 example: - account_id: Ex est modi cupiditate. + account_id: Consequatur aut vero. has_credentials: true - id: Qui at fugiat est omnis inventore. - label: Consequatur quisquam explicabo. - org_id: Consequatur molestias et et deleniti sint. - project_id: Ab totam laboriosam quos omnis deserunt. - status: error - version: 765646658236151796 + id: Optio non. + label: Ipsam eligendi est dolore. + org_id: Est saepe doloribus unde id. + project_id: Optio in ratione accusamus quasi. + status: active + version: 4544790407326456577 required: - id - project_id @@ -5828,7 +5970,7 @@ components: account_id: type: string description: Provider account identifier - example: Aliquam et asperiores quae voluptatem velit. + example: Voluptas est consequatur rerum neque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5836,19 +5978,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Odit eos. + example: Perspiciatis perferendis adipisci. label: type: string description: Optional friendly name - example: Hic quam impedit placeat consequatur. + example: Ea nam aut aut dolores. org_id: type: string description: LinkedIn organization URN id - example: Enim voluptas numquam. + example: Optio quia similique vero est impedit quo. project_id: type: string description: Owning project - example: Quidem est. + example: Sapiente sit totam ut et ullam. status: type: string description: Connection status @@ -5861,17 +6003,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5408757854107547795 + example: 5284871868291627638 format: int64 example: - account_id: Officia dolorem. - has_credentials: true - id: Et iusto eius dolor magnam necessitatibus. - label: Tempora voluptatem rem fugit accusantium est necessitatibus. - org_id: Aut soluta quae et est et corporis. - project_id: Mollitia earum aut qui sit rerum. + account_id: Eos deserunt quia expedita sed velit distinctio. + has_credentials: false + id: Nihil at. + label: Sit soluta quia qui. + org_id: Natus veniam amet. + project_id: Libero officia et quia. status: inactive - version: 758133864872776679 + version: 1537409143960626181 required: - id - project_id @@ -5889,14 +6031,14 @@ components: label: type: string description: Optional friendly name - example: Distinctio magnam. + example: Sint est sed. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Architecto deserunt vero ducimus distinctio. + label: Voluptas dolorem necessitatibus illum. org_id: "208777" required: - account_id @@ -5907,10 +6049,10 @@ components: access_token: type: string description: OAuth access token - example: Quae qui inventore dolorem deserunt. + example: Ducimus distinctio deserunt quia magni. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: In aut nam rerum. + access_token: Nisi est. required: - access_token MetaAdsConnection: @@ -5919,39 +6061,39 @@ components: account_id: type: string description: Provider account identifier - example: Doloribus voluptas mollitia doloremque totam. + example: Quia doloremque commodi rerum. app_id: type: string description: Meta app ID - example: Quidem omnis totam eos non molestias. + example: Error sit nihil iure officiis nemo. etag: type: string description: ETag header value (mirrors version) - example: Quos amet. + example: Eos non molestias laudantium quia iusto maxime. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Non eum expedita non voluptas sit voluptatem. + example: Totam hic quibusdam eveniet. label: type: string description: Optional friendly name - example: Totam hic quibusdam eveniet. + example: Veniam et ducimus quos amet. page_id: type: string description: Facebook page ID - example: Quia doloremque commodi rerum. + example: Illum accusamus debitis explicabo praesentium sint. project_id: type: string description: Owning project - example: Ab quasi tempora dolor. + example: Doloribus voluptas mollitia doloremque totam. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -5960,19 +6102,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8632050897094076248 + example: 4075428576386055706 format: int64 example: - account_id: Molestias ducimus id. - app_id: Laborum maiores est ea ducimus ipsum dolorem. - etag: Et quia ex et alias ea. - has_credentials: true - id: Quia iusto maxime. - label: Error sit nihil iure officiis nemo. - page_id: Quas quis corporis. - project_id: Illum accusamus debitis explicabo praesentium sint. - status: deleted - version: 6628357942141561962 + account_id: Corporis dolorem laborum maiores est ea ducimus. + app_id: Tenetur ut. + etag: Quo ullam ad iusto quos. + has_credentials: false + id: Molestias ducimus id. + label: Ex et alias ea asperiores quas. + page_id: Est placeat explicabo aliquid. + project_id: Eius aut quo et. + status: inactive + version: 7062935514847310019 required: - id - project_id @@ -5987,35 +6129,35 @@ components: account_id: type: string description: Provider account identifier - example: Ex dolor. + example: Reiciendis excepturi. app_id: type: string description: Meta app ID - example: In vel. + example: Iure aut tenetur ipsum ea ad ducimus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptate est reprehenderit consectetur accusamus eaque inventore. + example: Quisquam voluptatem fuga quia qui. label: type: string description: Optional friendly name - example: Officia dolores et reprehenderit. + example: Rerum vel molestiae id quae vero aut. page_id: type: string description: Facebook page ID - example: Vitae qui explicabo tempora accusantium aut. + example: Et et. project_id: type: string description: Owning project - example: Aut explicabo. + example: Aut provident suscipit incidunt. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -6024,18 +6166,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2969272646168040903 + example: 8554261525276101559 format: int64 example: - account_id: Error deleniti vitae molestiae qui nobis. - app_id: Enim non asperiores velit aut. - has_credentials: false - id: Nobis qui sunt laboriosam ipsa. - label: Autem eaque eaque dicta ut magni. - page_id: Cumque quis accusantium. - project_id: Et vel dolorum aut inventore consequatur. - status: inactive - version: 8399692053212789191 + account_id: Necessitatibus non eum ipsum eveniet quam. + app_id: Accusamus eos neque velit. + has_credentials: true + id: Aut temporibus. + label: Eligendi non. + page_id: Voluptatum magnam. + project_id: Laborum ipsum accusantium voluptatem libero. + status: error + version: 8043832967599792035 required: - id - project_id @@ -6049,11 +6191,11 @@ components: account_id: type: string description: Provider account identifier - example: Sit nihil enim sit. + example: Odit illo ut ut. app_id: type: string description: Meta app ID - example: Non ipsam optio in ratione accusamus quasi. + example: Perspiciatis debitis atque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6061,19 +6203,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quod minima. + example: In iure molestiae quisquam. label: type: string description: Optional friendly name - example: Dolores dolores. + example: Numquam voluptatem maiores ipsam dicta cum odit. page_id: type: string description: Facebook page ID - example: Qui vitae iste. + example: Assumenda alias. project_id: type: string description: Owning project - example: Ipsum et et laudantium. + example: Ipsam aperiam et totam in. status: type: string description: Connection status @@ -6086,18 +6228,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6379674624138849400 + example: 8618836083038100083 format: int64 example: - account_id: Aut perspiciatis. - app_id: Quibusdam ea nam aut. + account_id: Aliquam est autem vel eos minima. + app_id: Ea voluptatum pariatur non. has_credentials: true - id: Ipsam eligendi est dolore. - label: Excepturi natus est est saepe doloribus unde. - page_id: Sit totam ut et. - project_id: Consequatur aut vero. - status: active - version: 6192957101395237768 + id: Unde facilis. + label: Voluptatem optio. + page_id: Maiores consequatur. + project_id: Ut quas officiis mollitia ducimus sunt repellendus. + status: inactive + version: 2884566362507518761 required: - id - project_id @@ -6111,35 +6253,35 @@ components: account_id: type: string description: Provider account identifier - example: Nihil at. + example: Quisquam recusandae nesciunt et. app_id: type: string description: Meta app ID - example: Maxime eos deserunt quia. + example: Perferendis et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolores earum. + example: Quo ullam. label: type: string description: Optional friendly name - example: Optio quia similique vero est impedit quo. + example: Facilis dolor consectetur sed. page_id: type: string description: Facebook page ID - example: Quia tempore sit soluta quia. + example: Ut ea sequi quos qui quo et. project_id: type: string description: Owning project - example: Est consequatur rerum neque velit nulla modi. + example: Occaecati hic ut magnam facilis. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6148,18 +6290,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6683913012343616485 + example: 8315950268383046552 format: int64 example: - account_id: Qui quas aut provident suscipit. - app_id: Excepturi qui. + account_id: Non consequuntur qui qui impedit assumenda voluptas. + app_id: Et nemo dicta illum omnis. has_credentials: true - id: Sed velit distinctio. - label: Veniam amet et quisquam voluptatem fuga. - page_id: Molestiae id quae vero aut repellendus. - project_id: Necessitatibus eos rerum. - status: inactive - version: 747656330949987636 + id: Beatae facilis dolor quod nihil quia. + label: Recusandae consequatur nulla. + page_id: Vel ut. + project_id: Sed voluptas fuga officia nulla. + status: error + version: 8342264622249142271 required: - id - project_id @@ -6177,20 +6319,20 @@ components: app_id: type: string description: Meta app ID - example: Consequatur hic voluptatem. + example: Occaecati id ea sunt dolorem necessitatibus neque. label: type: string description: Optional friendly name - example: Iusto fugit non asperiores quidem natus. + example: Consequatur hic voluptatem. page_id: type: string description: Facebook page ID - example: Nostrum atque illum nesciunt adipisci odit corrupti. + example: Omnis quidem dolor ipsum voluptas. example: account_id: act_193556282970417 - app_id: Occaecati earum unde ut. - label: Omnis quidem dolor ipsum voluptas. - page_id: Occaecati id ea sunt dolorem necessitatibus neque. + app_id: Ab quasi tempora dolor. + label: Occaecati earum unde ut. + page_id: Non eum expedita non voluptas sit voluptatem. required: - account_id MetaAdsCredentials: @@ -6199,15 +6341,15 @@ components: access_token: type: string description: Meta access token - example: Vel architecto quae error dolor placeat. + example: Fugiat aliquid aspernatur voluptatem in cupiditate. app_secret: type: string description: Meta app secret - example: Minus et. + example: Et dolorem quod. description: Meta Ads credential. Write-only; never returned. example: - access_token: Fugiat aliquid aspernatur voluptatem in cupiditate. - app_secret: Et dolorem quod. + access_token: Iusto fugit non asperiores quidem natus. + app_secret: Nostrum atque illum nesciunt adipisci odit corrupti. required: - access_token - app_secret @@ -6280,11 +6422,11 @@ components: account_id: type: string description: Provider account identifier - example: Eos ex laborum et doloremque. + example: Quo veritatis nisi velit distinctio animi. customer_id: type: string description: Microsoft Advertising customer ID - example: Ab non sunt dolores quo est ratione. + example: Voluptas tenetur esse. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6292,19 +6434,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Repudiandae eum. + example: Architecto molestiae cum. label: type: string description: Optional friendly name - example: Quod amet itaque aut. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. project_id: type: string description: Owning project - example: Ut itaque voluptatem unde adipisci aut. + example: Perspiciatis consequatur beatae sunt officiis sequi qui. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -6313,17 +6455,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6109053107717412647 + example: 8298836967576578537 format: int64 example: - account_id: Soluta beatae error enim velit voluptates officiis. - customer_id: Molestiae veniam exercitationem blanditiis ratione non. - has_credentials: true - id: Totam dolorum quas quia quam voluptate. - label: Aut numquam est accusantium ut vitae. - project_id: Iste architecto voluptatem velit odio. + account_id: Eveniet aliquid quia aut impedit a veritatis. + customer_id: Sunt debitis enim voluptas qui voluptas veniam. + has_credentials: false + id: Assumenda sed minima nihil. + label: Dolor molestiae quia voluptatem deserunt libero. + project_id: Quaerat ipsa voluptatem. status: error - version: 7566507239259662295 + version: 5039507493953656552 required: - id - project_id @@ -6337,27 +6479,27 @@ components: account_id: type: string description: Provider account identifier - example: Quos provident. + example: Dolor cumque dolores. customer_id: type: string description: Microsoft Advertising customer ID - example: Officiis modi quae consequatur voluptatem et. + example: Neque aspernatur culpa sed non. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Sed dolorum cupiditate quia qui dicta. + example: Voluptas maxime non illo ab in voluptatem. label: type: string description: Optional friendly name - example: Totam et voluptates atque consequatur consequuntur voluptates. + example: Ad et in voluptatem et perspiciatis. project_id: type: string description: Owning project - example: Commodi facere vel. + example: Est magnam molestiae soluta. status: type: string description: Connection status @@ -6370,17 +6512,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 413153877019026133 + example: 889781010736384145 format: int64 example: - account_id: Dolorem ea et quidem quibusdam officiis. - customer_id: Sed sint dolor eaque culpa quae. - has_credentials: true - id: Culpa veritatis ut adipisci minus. - label: Incidunt deleniti. - project_id: Vero eum ea perspiciatis rerum. + account_id: Deleniti reprehenderit saepe quas commodi qui qui. + customer_id: Excepturi reiciendis numquam consequatur amet dolorem. + has_credentials: false + id: Ad cumque voluptas. + label: Non minima possimus totam occaecati enim eaque. + project_id: Facere rerum voluptatem saepe eligendi. status: deleted - version: 1470629891228199804 + version: 2150669320812381725 required: - id - project_id @@ -6394,31 +6536,31 @@ components: account_id: type: string description: Provider account identifier - example: Eveniet amet accusantium qui pariatur odio. + example: Soluta et quam. customer_id: type: string description: Microsoft Advertising customer ID - example: Et id sint suscipit quia ipsa voluptas. + example: Voluptate est enim aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Omnis id. + example: Eaque ut. label: type: string description: Optional friendly name - example: Placeat dolores iure dolore voluptatem. + example: Iste et alias quis magni ad. project_id: type: string description: Owning project - example: Omnis aut mollitia pariatur. + example: Et aspernatur delectus rem sit. status: type: string description: Connection status - example: deleted + example: active enum: - active - inactive @@ -6427,17 +6569,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1077022898145795137 + example: 2822393091615672408 format: int64 example: - account_id: Sapiente perspiciatis dolores dignissimos soluta non vel. - customer_id: Velit distinctio animi fugit provident rerum. + account_id: Velit atque nam voluptatem in eveniet. + customer_id: Totam ea ut voluptatem velit eos aut. has_credentials: true - id: Non neque optio. - label: Perspiciatis consequatur beatae sunt officiis sequi qui. - project_id: Architecto molestiae cum. - status: inactive - version: 8699718175951963580 + id: Sequi non consequatur est. + label: Occaecati repellendus autem ullam odio quis sed. + project_id: Beatae magni est officiis enim. + status: active + version: 7510768710450776293 required: - id - project_id @@ -6472,19 +6614,19 @@ components: client_id: type: string description: OAuth client id - example: Hic voluptatem ad similique sunt ratione. + example: Doloremque dicta. client_secret: type: string description: OAuth client secret - example: Dicta et ratione impedit recusandae dolor. + example: Ratione impedit recusandae dolor consequatur. developer_token: type: string description: Microsoft Advertising developer token - example: Sunt voluptatem beatae repellat veritatis perferendis veritatis. + example: Voluptatem beatae repellat veritatis perferendis veritatis. refresh_token: type: string description: OAuth refresh token - example: Mollitia vel temporibus sunt nulla esse. + example: Vel temporibus sunt nulla esse sed. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: client_id: Facere sed ea qui pariatur adipisci. @@ -6553,11 +6695,11 @@ components: account_id: type: string description: Provider account identifier - example: Necessitatibus voluptatem incidunt et totam esse rerum. + example: Occaecati quaerat eum quia a excepturi. etag: type: string description: ETag header value (mirrors version) - example: Voluptatem incidunt cum. + example: Eos culpa quaerat culpa inventore aut molestiae. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6565,19 +6707,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Vero ut et neque soluta distinctio voluptas. + example: Necessitatibus voluptatem incidunt et totam esse rerum. label: type: string description: Optional friendly name - example: Fugit eum. + example: Voluptatem incidunt cum. project_id: type: string description: Owning project - example: Libero sapiente. + example: Dolorem delectus. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -6586,17 +6728,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3465638753396319382 + example: 4898302691270586418 format: int64 example: - account_id: Inventore ratione id vel iusto optio repellendus. - etag: Quos rerum. + account_id: Rerum eveniet nam sunt. + etag: Voluptatem quia ab recusandae praesentium nisi. has_credentials: true - id: Occaecati quaerat eum quia a excepturi. - label: Inventore aut molestiae voluptas hic. - project_id: Ut possimus quidem eos culpa quaerat. - status: active - version: 2911200286629229215 + id: Hic quos inventore. + label: Ad dolorem et. + project_id: Id vel iusto optio repellendus. + status: deleted + version: 4971099885577230620 required: - id - project_id @@ -6611,7 +6753,7 @@ components: account_id: type: string description: Provider account identifier - example: Cumque laborum ipsum accusantium voluptatem libero. + example: Laudantium eligendi ut et. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6619,19 +6761,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Tenetur atque et et quia. + example: Dolor et aliquam deleniti. label: type: string description: Optional friendly name - example: Consequatur aut. + example: Est dolor velit et voluptatem mollitia placeat. project_id: type: string description: Owning project - example: Aut tenetur ipsum ea ad. + example: Nemo cum delectus laudantium. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -6640,16 +6782,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6681602602405949516 + example: 7301828793581898625 format: int64 example: - account_id: In iure molestiae quisquam. - has_credentials: false - id: Necessitatibus non eum ipsum eveniet quam. - label: Accusamus eos neque velit. - project_id: Aut amet aut voluptatum magnam. + account_id: Necessitatibus quia facere vitae aperiam velit corrupti. + has_credentials: true + id: Iste iusto reiciendis ipsa ut saepe beatae. + label: Voluptas doloremque nobis consectetur voluptas voluptas. + project_id: Temporibus in qui provident corrupti ut similique. status: deleted - version: 3936961167651696720 + version: 8091372322961997197 required: - id - project_id @@ -6663,7 +6805,7 @@ components: account_id: type: string description: Provider account identifier - example: Modi nostrum. + example: Repellendus dolore expedita commodi sit omnis et. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6671,15 +6813,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Totam in et. + example: Deserunt minima quis impedit. label: type: string description: Optional friendly name - example: Illo ut ut ut. + example: Aut et ut dolorem tempore. project_id: type: string description: Owning project - example: Voluptatem maiores ipsam dicta cum odit repellat. + example: In voluptate debitis earum voluptates repellat. status: type: string description: Connection status @@ -6692,16 +6834,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1189484283141975528 + example: 4154692188906674111 format: int64 example: - account_id: Aliquam est autem vel eos minima. - has_credentials: true - id: Debitis atque laboriosam unde facilis. - label: Voluptatem optio. - project_id: Ut quas officiis mollitia ducimus sunt repellendus. - status: inactive - version: 2884566362507518761 + account_id: Pariatur esse. + has_credentials: false + id: Quo porro. + label: Molestias reprehenderit. + project_id: Accusantium est. + status: error + version: 1321629448594002998 required: - id - project_id @@ -6715,27 +6857,27 @@ components: account_id: type: string description: Provider account identifier - example: Occaecati hic ut magnam facilis. + example: Facere ut voluptatem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Maiores consequatur. + example: Ab ea pariatur deserunt. label: type: string description: Optional friendly name - example: Quo ullam. + example: Repellat sequi sed qui dolor. project_id: type: string description: Owning project - example: Ea voluptatum pariatur non. + example: Rem molestiae assumenda ea incidunt. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6744,16 +6886,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4047597311733105158 + example: 8862716294143227386 format: int64 example: - account_id: Perferendis et. + account_id: Assumenda quam possimus aut ipsa. has_credentials: false - id: Sed error quisquam recusandae nesciunt et itaque. - label: Quos qui quo et. - project_id: A debitis ut ea. - status: deleted - version: 4664403850667403290 + id: Rerum maiores in alias est laboriosam saepe. + label: Eaque magni omnis dolorem. + project_id: Perferendis placeat earum occaecati et. + status: inactive + version: 7088601354925466349 required: - id - project_id @@ -6771,10 +6913,10 @@ components: label: type: string description: Optional friendly name - example: Voluptatem fugiat et. + example: Et neque soluta. example: account_id: t2_gv9wtbfa - label: Facere quas qui aut rerum. + label: Voluptas aliquid libero sapiente aspernatur fugit eum. required: - account_id RedditAdsCredentials: @@ -6783,20 +6925,20 @@ components: client_id: type: string description: OAuth client id - example: Ab quo ullam ad. + example: Quo vel iste aut cum voluptatem. client_secret: type: string description: OAuth client secret - example: Quos et est placeat explicabo. + example: Et et aperiam. refresh_token: type: string description: OAuth refresh token - example: Rerum tenetur ut voluptatem quo. + example: Voluptas quis nihil tempora rem asperiores. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Iste aut cum voluptatem qui et. - client_secret: Aperiam facere voluptas quis nihil. - refresh_token: Rem asperiores eligendi vero. + client_id: Vero natus voluptatem. + client_secret: Et minima. + refresh_token: Quas qui aut rerum illum vero. required: - client_id - client_secret @@ -6825,10 +6967,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Ex ea ullam corrupti. - client_secret: Et omnis accusantium. - developer_token: Iure modi asperiores ut. - refresh_token: Consectetur sint nesciunt. + client_id: Ut voluptatum consequatur quos atque voluptates. + client_secret: Sit nostrum dolor. + developer_token: Ipsa dolorum est aut blanditiis. + refresh_token: Unde omnis facere quam sed rem quia. required: - credentials SetCredentialHubspotRequestBody: @@ -6838,7 +6980,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Non sint praesentium quia. + private_app_token: Distinctio aut. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -6848,7 +6990,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Fugit enim et sint consectetur ea minus. + access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. required: - credentials SetCredentialMetaAdsRequestBody: @@ -6858,8 +7000,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Debitis labore aut. - app_secret: Porro ab id necessitatibus consequatur natus tempora. + access_token: Quo sint dolorum vel. + app_secret: Consequatur omnis quidem est non tenetur. required: - credentials SetCredentialRedditAdsRequestBody: @@ -6869,9 +7011,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Facilis facilis aut suscipit aut odio iste. - client_secret: Deleniti earum magni quibusdam. - refresh_token: Tenetur velit quaerat aut. + client_id: Totam rem harum. + client_secret: Provident quia laboriosam magnam unde. + refresh_token: Et sed nobis blanditiis. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -6881,10 +7023,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Amet et eaque. - access_token_secret: Consequatur iste sed illo adipisci sunt. - consumer_key: Neque ipsum nihil cumque repellendus. - consumer_secret: Soluta aut sed quibusdam reiciendis qui vel. + access_token: Aperiam et ipsam vitae. + access_token_secret: Velit est quis aliquid aliquam. + consumer_key: Consequatur iste sed illo adipisci sunt. + consumer_secret: Soluta consectetur porro quo quia incidunt. required: - credentials TwitterAdsConnection: @@ -6893,15 +7035,15 @@ components: account_id: type: string description: Provider account identifier - example: Minima vitae illo cumque optio impedit. + example: Dicta qui. etag: type: string description: ETag header value (mirrors version) - example: Odit autem repellendus dicta qui vel. + example: Consequatur voluptate dolorum id ut. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Earum id consequatur. + example: Id adipisci. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6909,15 +7051,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Possimus ipsam perspiciatis enim id. + example: Vel necessitatibus vel voluptates tenetur veniam repellat. label: type: string description: Optional friendly name - example: Vel necessitatibus vel voluptates tenetur veniam repellat. + example: Aut repudiandae voluptatibus odit autem. project_id: type: string description: Owning project - example: Eveniet quia voluptatem impedit cumque doloribus. + example: Minima vitae illo cumque optio impedit. status: type: string description: Connection status @@ -6930,18 +7072,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 234140326367801793 + example: 6671950557225375758 format: int64 example: - account_id: Molestiae itaque autem aliquam voluptatibus assumenda mollitia. - etag: Nemo sint et consequatur vel quisquam libero. - funding_instrument_id: Eum et sint possimus omnis dolorem. - has_credentials: false - id: Dolorum id ut molestias. - label: Rerum non assumenda molestiae modi impedit. - project_id: Adipisci ipsa. - status: deleted - version: 1754395146238114720 + account_id: Vitae nemo sint et consequatur vel quisquam. + etag: Sint possimus. + funding_instrument_id: Dolorem neque hic voluptatem ad similique sunt. + has_credentials: true + id: Aut rerum non assumenda molestiae modi. + label: Voluptatibus assumenda mollitia molestias eos. + project_id: Vitae molestiae itaque autem. + status: error + version: 3850958169697422368 required: - id - project_id @@ -6956,27 +7098,27 @@ components: account_id: type: string description: Provider account identifier - example: Provident nostrum vel ut nulla et. + example: Ut itaque voluptatem unde adipisci aut. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Magnam dolor et aliquam. + example: Aut praesentium eos ex laborum et doloremque. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quod nihil quia id sed voluptas fuga. + example: Numquam numquam et natus possimus. label: type: string description: Optional friendly name - example: Qui qui impedit assumenda voluptas cumque. + example: Repudiandae eum. project_id: type: string description: Owning project - example: Nulla temporibus recusandae consequatur nulla quam non. + example: Provident molestiae quia neque atque delectus. status: type: string description: Connection status @@ -6989,17 +7131,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7352010610499081653 + example: 9192676630235860462 format: int64 example: - account_id: Ut et laborum. - funding_instrument_id: Iusto reiciendis. - has_credentials: false - id: Magnam nemo cum delectus. - label: Et voluptatem mollitia placeat aut laudantium. - project_id: Minus est dolor. - status: inactive - version: 760324478171279387 + account_id: Quas quia quam voluptate nam iste. + funding_instrument_id: Temporibus aut numquam. + has_credentials: true + id: Non laudantium quis ab non sunt. + label: Beatae totam. + project_id: Quo est. + status: active + version: 1807846651493588341 required: - id - project_id @@ -7013,11 +7155,11 @@ components: account_id: type: string description: Provider account identifier - example: Necessitatibus quia facere vitae aperiam velit corrupti. + example: Sed dolorum cupiditate quia qui dicta. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Deserunt minima quis impedit. + example: Quae totam et voluptates atque consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7025,19 +7167,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut saepe beatae quasi temporibus in. + example: Accusantium ut vitae dolor soluta beatae. label: type: string description: Optional friendly name - example: Voluptas doloremque nobis consectetur voluptas voluptas. + example: Molestiae veniam exercitationem blanditiis ratione non. project_id: type: string description: Owning project - example: Provident corrupti ut similique. + example: Enim velit voluptates officiis tempora possimus rerum. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -7046,17 +7188,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8091372322961997197 + example: 2489572558350094249 format: int64 example: - account_id: Saepe eius earum. - funding_instrument_id: Est est molestias reprehenderit placeat. + account_id: Adipisci minus et vero. + funding_instrument_id: Occaecati incidunt deleniti sunt dolorem ea. has_credentials: false - id: In voluptate debitis earum voluptates repellat. - label: Repellendus dolore expedita commodi sit omnis et. - project_id: Aut et ut dolorem tempore. + id: Voluptates ab quos provident magni et. + label: Et culpa culpa veritatis. + project_id: Reprehenderit officiis modi quae consequatur. status: inactive - version: 2286015844327380649 + version: 8208341011850859357 required: - id - project_id @@ -7070,31 +7212,31 @@ components: account_id: type: string description: Provider account identifier - example: Sed qui dolor illo facere ut voluptatem. + example: Eius omnis id itaque. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Rerum maiores in alias est laboriosam saepe. + example: Perferendis placeat dolores. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Esse odio dolorem similique sapiente ab. + example: Quidem quibusdam officiis dolor. label: type: string description: Optional friendly name - example: Incidunt nam repellat. + example: Sint dolor eaque culpa. project_id: type: string description: Owning project - example: Pariatur deserunt aut rem molestiae assumenda. + example: Nisi sunt. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -7103,17 +7245,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8862716294143227386 + example: 1134950045517095139 format: int64 example: - account_id: Quae et perspiciatis numquam. - funding_instrument_id: Cupiditate provident molestiae quia neque atque delectus. - has_credentials: true - id: Perferendis placeat earum occaecati et. - label: Assumenda quam possimus aut ipsa. - project_id: Eaque magni omnis dolorem. - status: error - version: 413964225916483826 + account_id: Sint suscipit. + funding_instrument_id: Non neque optio. + has_credentials: false + id: Dolore voluptatem qui eveniet amet. + label: Voluptate et. + project_id: Qui pariatur odio reprehenderit nam. + status: deleted + version: 6078188127403523196 required: - id - project_id @@ -7131,15 +7273,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Accusantium voluptas ratione dignissimos esse et labore. + example: Cumque perspiciatis quam. label: type: string description: Optional friendly name - example: Necessitatibus tempore rem quo. + example: Iste numquam optio possimus velit. example: account_id: 8r7gb - funding_instrument_id: Cumque perspiciatis quam. - label: Iste numquam optio possimus velit. + funding_instrument_id: Eveniet quia voluptatem impedit cumque doloribus. + label: Possimus ipsam perspiciatis enim id. required: - account_id TwitterAdsCredentials: @@ -7148,25 +7290,25 @@ components: access_token: type: string description: OAuth 1.0a access token - example: Est magni odio aut omnis vel. + example: Ullam consequatur ut eveniet tempore est. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Iure ducimus voluptatem. + example: Iusto fugiat ad et. consumer_key: type: string description: OAuth 1.0a consumer key - example: Nam sunt aut inventore impedit unde. + example: Magni odio aut omnis vel. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Quia ab recusandae praesentium. + example: Iure ducimus voluptatem. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Magnam cum veritatis mollitia vel velit. - access_token_secret: Eum perferendis qui qui soluta repudiandae quae. - consumer_key: Ullam consequatur ut eveniet tempore est. - consumer_secret: Iusto fugiat ad et. + access_token: Necessitatibus tempore rem quo. + access_token_secret: Accusantium voluptas ratione dignissimos esse et labore. + consumer_key: Magnam cum veritatis mollitia vel velit. + consumer_secret: Eum perferendis qui qui soluta repudiandae quae. required: - consumer_key - consumer_secret @@ -7179,9 +7321,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Hic voluptas debitis error. - config: Ut consectetur. - status: Veniam eum ut libero quibusdam debitis. + campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. + config: Error similique. + status: Maxime fugiat illo. required: - campaign UpdateGoogleAdsRequestBody: @@ -7203,12 +7345,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Sed omnis. - brand_kit: Sed maiores qui sed exercitationem quam. - label: Ut amet nostrum laborum minima ipsum. - portal_id: Aut id in. - sender_email: Et magnam cumque quasi magni ducimus. - sender_name: Suscipit sed minus soluta quasi. + account_id: Et et veritatis voluptas nobis. + brand_kit: Consequuntur omnis a dignissimos voluptate. + label: Non sint praesentium quia. + portal_id: Doloremque architecto ea et. + sender_email: Asperiores facere et exercitationem soluta possimus. + sender_name: Aliquid et in. required: - config UpdateLinkedinAdsRequestBody: @@ -7219,7 +7361,7 @@ components: example: config: account_id: "538170226" - label: Ratione sunt nostrum tenetur repellendus dolorem cum. + label: Tempora error rerum quae nihil. org_id: "208777" required: - config @@ -7231,9 +7373,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Harum et minus voluptas. - label: Alias non sequi consequatur dolorum. - page_id: Voluptatem voluptas omnis est tempora ipsum aut. + app_id: Vel blanditiis sunt ut facere. + label: Vero et voluptas accusamus sunt. + page_id: Rerum cupiditate. required: - config UpdateMicrosoftAdsRequestBody: @@ -7243,9 +7385,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Error laudantium. - customer_id: Similique odio adipisci dolore iste. - label: Non nostrum dolorum iure eaque animi. + account_id: Fugiat maxime labore illo. + customer_id: Provident quas repudiandae voluptatem vitae iste maxime. + label: Necessitatibus et autem doloribus. required: - config UpdateRedditAdsRequestBody: @@ -7256,7 +7398,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Aliquam consequuntur quo aliquid ducimus. + label: Provident quia distinctio. required: - config UpdateTwitterAdsRequestBody: @@ -7267,8 +7409,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Commodi architecto unde rerum quisquam ut. - label: Quo sit iusto laudantium voluptates neque. + funding_instrument_id: Amet et eaque. + label: Aut sed quibusdam reiciendis qui vel. required: - config securitySchemes: diff --git a/gen/lfx_v2_campaign_service_briefs/client.go b/gen/lfx_v2_campaign_service_briefs/client.go index 433c0531..83650f44 100644 --- a/gen/lfx_v2_campaign_service_briefs/client.go +++ b/gen/lfx_v2_campaign_service_briefs/client.go @@ -63,6 +63,7 @@ func (c *Client) CreateBrief(ctx context.Context, p *CreateBriefPayload) (res *B // GetBrief calls the "get-brief" endpoint of the // "lfx-v2-campaign-service-briefs" service. // GetBrief may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request // - "NotFound" (type *NotFoundError): Resource not found // - "Conflict" (type *ConflictError): Conflict // - "InternalServerError" (type *InternalServerError): Internal server error @@ -100,6 +101,7 @@ func (c *Client) UpdateBrief(ctx context.Context, p *UpdateBriefPayload) (res *B // ApproveBrief calls the "approve-brief" endpoint of the // "lfx-v2-campaign-service-briefs" service. // ApproveBrief may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request // - "NotFound" (type *NotFoundError): Resource not found // - "Conflict" (type *ConflictError): Conflict // - "InternalServerError" (type *InternalServerError): Internal server error @@ -117,6 +119,7 @@ func (c *Client) ApproveBrief(ctx context.Context, p *ApproveBriefPayload) (res // DeleteBrief calls the "delete-brief" endpoint of the // "lfx-v2-campaign-service-briefs" service. // DeleteBrief may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request // - "NotFound" (type *NotFoundError): Resource not found // - "Conflict" (type *ConflictError): Conflict // - "InternalServerError" (type *InternalServerError): Internal server error @@ -148,6 +151,7 @@ func (c *Client) CreateCampaigns(ctx context.Context, p *CreateCampaignsPayload) // GetCampaign calls the "get-campaign" endpoint of the // "lfx-v2-campaign-service-briefs" service. // GetCampaign may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request // - "NotFound" (type *NotFoundError): Resource not found // - "Conflict" (type *ConflictError): Conflict // - "InternalServerError" (type *InternalServerError): Internal server error @@ -185,6 +189,7 @@ func (c *Client) UpdateCampaign(ctx context.Context, p *UpdateCampaignPayload) ( // GetJob calls the "get-job" endpoint of the "lfx-v2-campaign-service-briefs" // service. // GetJob may return the following errors: +// - "BadRequest" (type *BadRequestError): Bad request // - "NotFound" (type *NotFoundError): Resource not found // - "Conflict" (type *ConflictError): Conflict // - "InternalServerError" (type *InternalServerError): Internal server error diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index 6b452bf8..122aa12b 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -84,6 +84,14 @@ type Brief struct { URL *string // Suggested default platforms Platforms []string + // Extracted event/course details + EventDetails any + // Ad copy + Copy any + // Keyword list + Keywords any + // Targeting recommendation + Targeting any // Lifecycle status Status string // Optimistic-concurrency version diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index 21db2404..245c6048 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -38,6 +38,10 @@ type BriefRepository interface { type CampaignReader interface { // GetCampaign returns a single campaign under a brief, or ErrNotFound. GetCampaign(ctx context.Context, projectID, briefID, id string) (*model.Campaign, error) + // GetCampaignByPlatform returns the campaign for a (brief, platform) pair, or + // ErrNotFound. Used to make dispatch idempotent: a brief already dispatched to + // a platform must not create a second upstream (paid) campaign on retry. + GetCampaignByPlatform(ctx context.Context, briefID string, platform model.Provider) (*model.Campaign, error) } // CampaignWriter mutates campaigns. diff --git a/internal/infrastructure/postgres/brief_repo.go b/internal/infrastructure/postgres/brief_repo.go index 97679835..f717b077 100644 --- a/internal/infrastructure/postgres/brief_repo.go +++ b/internal/infrastructure/postgres/brief_repo.go @@ -67,16 +67,28 @@ func (r *BriefRepo) CreateBrief(ctx context.Context, b *model.CampaignBrief) (*m // ReplaceBrief replaces mutable fields, gating on expectedVersion. func (r *BriefRepo) ReplaceBrief(ctx context.Context, b *model.CampaignBrief, expectedVersion int64) (*model.CampaignBrief, error) { + // Replacing brief content invalidates any prior approval: reset the brief to + // 'draft' and clear the approver so a modified brief cannot silently retain + // status='approved' (which would let changed ad inputs be treated as approved + // and dispatched without re-review). event_slug is included so a slug change + // is actually persisted (it is subject to the partial-unique index, which + // surfaces a conflict if the new slug collides with a live brief). q := `UPDATE campaign_briefs SET - program_type=$1, url=$2, platforms=$3, event_details=$4, copy=$5, keywords=$6, targeting=$7, + program_type=$1, event_slug=$2, url=$3, platforms=$4, event_details=$5, copy=$6, keywords=$7, targeting=$8, + status='draft', approved_by=NULL, approved_at=NULL, version=version+1, updated_at=now() - WHERE id=$8 AND project_id=$9 AND version=$10 AND status <> 'archived'` + WHERE id=$9 AND project_id=$10 AND version=$11 AND status <> 'archived'` tag, err := r.db.Exec(ctx, q, - string(b.ProgramType), nullStr(b.URL), nullJSON(b.Platforms), nullJSON(b.EventDetails), + string(b.ProgramType), b.EventSlug, nullStr(b.URL), nullJSON(b.Platforms), nullJSON(b.EventDetails), nullJSON(b.Copy), nullJSON(b.Keywords), nullJSON(b.Targeting), b.ID, b.ProjectID, expectedVersion, ) if err != nil { + // A slug change that collides with another live brief trips the partial + // unique index; surface it as a conflict (409) rather than a 500. + if isUniqueViolation(err) { + return nil, domain.ErrConflict + } return nil, fmt.Errorf("replace brief: %w", err) } if tag.RowsAffected() == 0 { diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index 87f2ac8b..76787a3f 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -41,6 +41,20 @@ func (r *CampaignRepo) GetCampaign(ctx context.Context, projectID, briefID, id s return c, nil } +// GetCampaignByPlatform returns the campaign for a (brief, platform) pair. The +// (brief_id, platform) pair is unique, so at most one row matches. +func (r *CampaignRepo) GetCampaignByPlatform(ctx context.Context, briefID string, platform model.Provider) (*model.Campaign, error) { + q := `SELECT ` + campaignCols + ` FROM campaigns WHERE brief_id=$1 AND platform=$2` + c, err := scanCampaign(r.db.QueryRow(ctx, q, briefID, string(platform))) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, domain.ErrNotFound + } + return nil, fmt.Errorf("get campaign by platform: %w", err) + } + return c, nil +} + // UpsertCampaign inserts or updates the (brief, platform) campaign row. On // conflict it updates in place (a brief change after campaigns exist). func (r *CampaignRepo) UpsertCampaign(ctx context.Context, c *model.Campaign) (*model.Campaign, error) { diff --git a/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql b/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql index 6c32bb7e..cb393205 100644 --- a/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql +++ b/internal/infrastructure/postgres/migrations/000002_create_brief_campaign_tables.up.sql @@ -23,16 +23,11 @@ CREATE TABLE IF NOT EXISTS campaign_briefs ( approved_by JSONB, approved_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT now() + updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), + UNIQUE (project_id, event_slug) ); --- Singleton per (project, event) but only among live briefs: a partial unique --- index that excludes archived rows, so archiving a brief frees its --- (project_id, event_slug) slot and a new brief for the same event can be --- created (a full UNIQUE constraint would permanently reserve the slot). Mirrors --- the connection tables' partial-unique pattern. This index also covers --- project_id-only lookups as its leftmost column, so no standalone index needed. -CREATE UNIQUE INDEX IF NOT EXISTS uq_campaign_briefs_project_event - ON campaign_briefs (project_id, event_slug) WHERE status <> 'archived'; +-- No standalone project_id index: UNIQUE (project_id, event_slug) already +-- indexes project_id as its leftmost column, covering project_id-only lookups. CREATE TABLE IF NOT EXISTS campaign_jobs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), diff --git a/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql new file mode 100644 index 00000000..26447ed4 --- /dev/null +++ b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql @@ -0,0 +1,15 @@ +-- Revert to the 000002 schema: full uniqueness constraint and UUID project_id. +-- The UUID casts assume every stored project_id is a valid UUID; a slug-valued +-- row would fail the cast, which is the intended signal that the down migration +-- is unsafe once slug-addressed projects exist. +DROP INDEX IF EXISTS uq_campaign_briefs_project_event; + +ALTER TABLE campaigns + ALTER COLUMN project_id TYPE UUID USING project_id::uuid; + +ALTER TABLE campaign_briefs + ALTER COLUMN project_id TYPE UUID USING project_id::uuid; + +ALTER TABLE campaign_briefs + ADD CONSTRAINT campaign_briefs_project_id_event_slug_key + UNIQUE (project_id, event_slug); diff --git a/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql new file mode 100644 index 00000000..426228a3 --- /dev/null +++ b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql @@ -0,0 +1,31 @@ +-- Reconcile the campaign_briefs / campaigns schema with the rest of the service. +-- This is a SEPARATE migration rather than an edit to 000002: golang-migrate +-- records applied versions and never re-runs them, so any change to an +-- already-applied migration would silently skip databases that already ran +-- 000002. A new version reconciles both fresh and previously-migrated DBs. +-- +-- Two changes: +-- +-- 1. project_id UUID -> TEXT. The connection tables (000001) store project_id as +-- TEXT because a project is addressed by UUID *or* slug (e.g. "cncf"), and the +-- API contract advertises the same. 000002 diverged by typing it UUID, which +-- would reject slug-addressed projects. Align briefs/campaigns with TEXT. +-- +-- 2. Convert the (project_id, event_slug) uniqueness from a full table +-- constraint to a partial unique index that excludes archived rows, so +-- archiving a brief frees its (project_id, event_slug) slot for a new brief +-- (the full constraint reserved the slot permanently). Mirrors the connection +-- tables' partial-unique pattern; the index's leftmost column also covers +-- project_id-only lookups. + +ALTER TABLE campaign_briefs + DROP CONSTRAINT IF EXISTS campaign_briefs_project_id_event_slug_key; + +ALTER TABLE campaign_briefs + ALTER COLUMN project_id TYPE TEXT; + +ALTER TABLE campaigns + ALTER COLUMN project_id TYPE TEXT; + +CREATE UNIQUE INDEX IF NOT EXISTS uq_campaign_briefs_project_event + ON campaign_briefs (project_id, event_slug) WHERE status <> 'archived'; diff --git a/internal/service/brief.go b/internal/service/brief.go index 2641463b..2bfacbc4 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -159,11 +159,19 @@ func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCamp return nil, &briefs.BadRequestError{Code: "400", Message: "at least one platform is required"} } platforms := make([]model.Provider, 0, len(p.Input.Platforms)) + seen := make(map[model.Provider]struct{}, len(p.Input.Platforms)) for _, pl := range p.Input.Platforms { prov := model.Provider(pl) if !prov.Valid() { return nil, &briefs.BadRequestError{Code: "400", Message: "unknown platform: " + pl} } + if _, dup := seen[prov]; dup { + // Reject duplicates outright: dispatching the same platform twice would + // create two paid upstream campaigns concurrently, only one of which the + // (brief_id, platform)-unique persistence can record. + return nil, &briefs.BadRequestError{Code: "400", Message: "duplicate platform: " + pl} + } + seen[prov] = struct{}{} platforms = append(platforms, prov) } jobID, err := s.orch.Start(ctx, brief, platforms, marshalAny(p.Input.Config)) @@ -237,15 +245,19 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br func briefResult(b *model.CampaignBrief) *briefs.Brief { return &briefs.Brief{ - ID: b.ID, - ProjectID: b.ProjectID, - ProgramType: string(b.ProgramType), - EventSlug: b.EventSlug, - URL: optStr(b.URL), - Platforms: unmarshalStrings(b.Platforms), - Status: string(b.Status), - Version: b.Version, - Etag: optStr(etag(b.Version)), + ID: b.ID, + ProjectID: b.ProjectID, + ProgramType: string(b.ProgramType), + EventSlug: b.EventSlug, + URL: optStr(b.URL), + Platforms: unmarshalStrings(b.Platforms), + EventDetails: unmarshalAny(b.EventDetails), + Copy: unmarshalAny(b.Copy), + Keywords: unmarshalAny(b.Keywords), + Targeting: unmarshalAny(b.Targeting), + Status: string(b.Status), + Version: b.Version, + Etag: optStr(etag(b.Version)), } } @@ -318,3 +330,17 @@ func marshalAny(v any) json.RawMessage { } return b } + +// unmarshalAny decodes a stored JSONB column back into an arbitrary value for +// the response. Returns nil for empty/undecodable input so the response omits +// the field rather than surfacing malformed data. +func unmarshalAny(j json.RawMessage) any { + if len(j) == 0 { + return nil + } + var v any + if err := json.Unmarshal(j, &v); err != nil { + return nil + } + return v +} diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 72a9f4b3..ef7014ef 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -155,3 +155,54 @@ func TestBriefService_CreateCampaigns_RejectsEmptyPlatforms(t *testing.T) { t.Fatalf("expected *briefs.BadRequestError for empty platforms, got %T (%v)", err, err) } } + +// CreateCampaigns must reject a duplicate platform (400) rather than dispatching +// the same platform twice, which would create two paid upstream campaigns. +func TestBriefService_CreateCampaigns_RejectsDuplicatePlatforms(t *testing.T) { + repo := newFakeBriefRepo() + repo.briefs[briefKey("cncf", "b1")] = &model.CampaignBrief{ + ID: "b1", ProjectID: "cncf", Status: model.BriefApproved, + } + s := newTestBriefService(repo) + _, err := s.CreateCampaigns(context.Background(), &briefs.CreateCampaignsPayload{ + ProjectID: "cncf", BriefID: "b1", + Input: &briefs.CampaignCreateInput{Platforms: []string{"google-ads", "google-ads"}}, + }) + if _, ok := err.(*briefs.BadRequestError); !ok { + t.Fatalf("expected *briefs.BadRequestError for duplicate platforms, got %T (%v)", err, err) + } +} + +// Create/Get must round-trip the full brief content (event_details, copy, +// keywords, targeting), not drop it from the response. +func TestBriefService_ResponseIncludesBriefContent(t *testing.T) { + repo := newFakeBriefRepo() + s := newTestBriefService(repo) + details := map[string]any{"venue": "Salt Lake City"} + kw := []any{"kubernetes", "cloud native"} + created, err := s.CreateBrief(context.Background(), &briefs.CreateBriefPayload{ + ProjectID: "cncf", + Brief: &briefs.BriefInput{ + ProgramType: "events", + EventSlug: "kubecon-2025", + EventDetails: details, + Keywords: kw, + }, + }) + if err != nil { + t.Fatalf("CreateBrief: %v", err) + } + if created.EventDetails == nil { + t.Error("create response dropped event_details") + } + got, err := s.GetBrief(context.Background(), &briefs.GetBriefPayload{ProjectID: "cncf", BriefID: created.ID}) + if err != nil { + t.Fatalf("GetBrief: %v", err) + } + if got.EventDetails == nil { + t.Error("get response dropped event_details") + } + if got.Keywords == nil { + t.Error("get response dropped keywords") + } +} diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 90dab5e2..cf772664 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -6,6 +6,7 @@ package service import ( "context" "encoding/json" + "errors" "log/slog" "golang.org/x/sync/errgroup" @@ -92,6 +93,24 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa results[i] = res return nil } + // Idempotency guard: if this brief already has a campaign for this + // platform with an upstream id, a prior run (or a re-POST of + // create-campaigns) already created the paid campaign. Reuse it instead + // of calling the platform's create API again, which would spend money on + // a duplicate. A not-found is the normal first-time path; a transient + // lookup error is recorded as a failure rather than risking a duplicate. + if existing, lerr := o.campaigns.GetCampaignByPlatform(gctx, brief.ID, p); lerr == nil { + if existing.PlatformCampaignID != "" { + res.OK = true + res.CampaignID = existing.ID + results[i] = res + return nil + } + } else if !errors.Is(lerr, domain.ErrNotFound) { + res.Error = "check existing campaign: " + lerr.Error() + results[i] = res + return nil + } campaign, err := d.Dispatch(gctx, brief, p, config) if err != nil { res.Error = err.Error() diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 724de996..19287e84 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -11,6 +11,7 @@ import ( "testing" "time" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" ) @@ -59,11 +60,29 @@ func (r *fakeJobRepo) UpdateJobStatus(_ context.Context, id string, status model type fakeCampaignRepo struct { mu sync.Mutex upserted []*model.Campaign + // existing maps briefID+"|"+platform to a pre-existing campaign, letting a + // test simulate a brief already dispatched to a platform (idempotency guard). + existing map[string]*model.Campaign + // byPlatformErr, when set, is returned by GetCampaignByPlatform to simulate a + // transient lookup failure. + byPlatformErr error } func (r *fakeCampaignRepo) GetCampaign(context.Context, string, string, string) (*model.Campaign, error) { return nil, errors.New("unused") } + +func (r *fakeCampaignRepo) GetCampaignByPlatform(_ context.Context, briefID string, platform model.Provider) (*model.Campaign, error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.byPlatformErr != nil { + return nil, r.byPlatformErr + } + if c, ok := r.existing[briefID+"|"+string(platform)]; ok { + return c, nil + } + return nil, domain.ErrNotFound +} func (r *fakeCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { r.mu.Lock() defer r.mu.Unlock() @@ -175,6 +194,76 @@ func TestOrchestrator_NilCampaignFailsWithoutPanic(t *testing.T) { } } +// countingDispatcher records how many times Dispatch is called, to prove the +// idempotency guard skips the upstream create. +type countingDispatcher struct { + mu sync.Mutex + calls int +} + +func (d *countingDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + d.mu.Lock() + d.calls++ + d.mu.Unlock() + return &model.Campaign{PlatformCampaignID: "pc-" + string(p), Status: "active", CampaignName: "n"}, nil +} + +// TestOrchestrator_SkipsAlreadyDispatchedPlatform verifies that a brief already +// carrying a campaign with an upstream id for a platform does NOT re-invoke the +// platform's create API (which would spend money on a duplicate). +func TestOrchestrator_SkipsAlreadyDispatchedPlatform(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{existing: map[string]*model.Campaign{ + "b1|" + string(model.ProviderGoogleAds): {ID: "existing-c1", PlatformCampaignID: "pc-google-ads"}, + }} + disp := &countingDispatcher{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: disp, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, err := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + if err != nil { + t.Fatalf("Start: %v", err) + } + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobSucceeded { + t.Errorf("status = %s, want succeeded", j.Status) + } + disp.mu.Lock() + calls := disp.calls + disp.mu.Unlock() + if calls != 0 { + t.Errorf("Dispatch called %d times, want 0 (existing campaign must be reused)", calls) + } + if len(camps.upserted) != 0 { + t.Errorf("upserted %d campaigns, want 0 (no re-create)", len(camps.upserted)) + } +} + +// TestOrchestrator_TransientLookupErrorIsFailure verifies that a transient error +// from the existing-campaign lookup is recorded as a platform failure rather +// than proceeding to a create that could duplicate. +func TestOrchestrator_TransientLookupErrorIsFailure(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{byPlatformErr: errors.New("db down")} + disp := &countingDispatcher{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: disp, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + disp.mu.Lock() + calls := disp.calls + disp.mu.Unlock() + if calls != 0 { + t.Errorf("Dispatch called %d times, want 0 (must not create when lookup is uncertain)", calls) + } +} + func TestAggregateStatus(t *testing.T) { cases := []struct { name string From acacb37b5a1a73bd816104344d76147e23a46625 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 16:55:48 -0700 Subject: [PATCH 09/46] fix(review): address third-round Copilot findings on orchestrator (PR #11) - Return the upstream platform campaign id (not the DB row id) on the idempotency-reuse path, so job result campaign_id means the same thing on the reuse and create paths. - Type the job-poll result: replace the opaque Any with a PlatformResult array in the design (platform/ok/campaign_id/error, exactly what the orchestrator emits), so the OpenAPI describes the shape; GetJob decodes into the typed slice; api-catalog documents PlatformResult. - Document that the read-before-dispatch idempotency check narrows but does not fully close the concurrent-duplicate window (the upstream create is not transactional with the (brief_id, platform) unique index); fully closing it needs provider-side idempotency keys + single-flight job ownership, tracked with the job-recovery follow-up. Test asserts the reuse path reports the upstream id and never leaks the DB row id. gen/ regenerated; go build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 803 +++--- .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 2565 +++++++++-------- design/brief.go | 13 +- docs/api-catalog.md | 11 +- gen/http/cli/lfx_v2_campaign_service/cli.go | 62 +- .../client/cli.go | 8 +- .../client/encode_decode.go | 17 + .../client/types.go | 44 +- .../server/encode_decode.go | 17 + .../server/types.go | 25 +- .../client/cli.go | 40 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 803 +++--- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 2565 +++++++++-------- gen/lfx_v2_campaign_service_briefs/service.go | 13 +- internal/service/brief.go | 25 +- internal/service/orchestrator.go | 12 +- internal/service/orchestrator_test.go | 9 + 21 files changed, 3730 insertions(+), 3310 deletions(-) diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index f63347da..5daf0890 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Iusto velit quo voluptatibus modi reiciendis aliquam."},"event_details":{"description":"Extracted event/course details","example":"Odit necessitatibus veritatis amet ut rerum quidem."},"event_slug":{"type":"string","description":"Event/course slug","example":"Eos voluptatibus."},"id":{"type":"string","description":"Brief UUID","example":"Vero quisquam."},"keywords":{"description":"Keyword list","example":"Quidem explicabo expedita sunt."},"platforms":{"type":"array","items":{"type":"string","example":"Ex delectus."},"description":"Suggested default platforms","example":["Ullam dolores rem.","Officia quidem non qui voluptates natus cum.","Autem recusandae totam.","Rerum nisi."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis reiciendis dignissimos consequatur iste qui minima."},"project_id":{"type":"string","description":"Owning project","example":"Labore laudantium."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Similique deserunt iusto."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptatem sed quia excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8240116664126121650,"format":"int64"}},"example":{"copy":"Placeat ea odio ea eos.","event_details":"Non adipisci rerum.","event_slug":"Adipisci quaerat est nobis.","id":"Possimus exercitationem repellendus quo quidem.","keywords":"Ipsum et delectus dolorum eveniet.","platforms":["Veritatis quisquam sed ratione et.","Cumque molestiae eos rem aut.","Quos impedit."],"program_type":"Illum rerum error incidunt.","project_id":"Cumque totam nulla aut reprehenderit.","status":"approved","targeting":"Alias ea quibusdam.","url":"Fugit non fuga rem adipisci.","version":8901460428935487189},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et eveniet."},"event_details":{"description":"Extracted event/course details","example":"Est eaque ipsam harum nisi nobis."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Enim dolorum nobis itaque est enim."},"keywords":{"description":"Keyword list","example":"Corporis ut non."},"platforms":{"type":"array","items":{"type":"string","example":"Praesentium ipsam officiis cum ipsum recusandae."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Ullam pariatur ex voluptas aspernatur.","Voluptates aliquam vero ducimus.","Recusandae aut perferendis."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eius sed qui deserunt perspiciatis nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Pariatur explicabo est totam."}},"example":{"copy":"Provident provident.","event_details":"Odit rerum quidem accusamus.","event_slug":"Tempora minima voluptas quod facere aut.","keywords":"Odit iusto ad animi eos doloribus autem.","platforms":["Hic quis facere exercitationem.","Exercitationem aut eaque."],"program_type":"membership","targeting":"Sed voluptatum laborum.","url":"Porro dolor ipsa."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut rerum ut blanditiis dolor."},"id":{"type":"string","description":"Campaign UUID","example":"Voluptatibus quos accusantium fugit."},"platform":{"type":"string","description":"Channel","example":"Molestiae minus dolor accusantium."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Cum molestias fuga voluptatibus quis."},"project_id":{"type":"string","description":"Owning project","example":"Excepturi saepe sit vel perspiciatis neque."},"status":{"type":"string","description":"Campaign status","example":"Nobis aliquid rerum consequatur officiis velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8006615023617839427,"format":"int64"}},"example":{"brief_id":"Omnis voluptates quaerat.","campaign_name":"Beatae placeat cumque iure veritatis cumque.","id":"Assumenda accusantium.","platform":"Quos cum porro architecto.","platform_campaign_id":"Aperiam doloribus aut.","project_id":"Fugiat dolore similique.","status":"Ex distinctio ipsum ab assumenda natus.","version":5157498100002718362},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Velit dolores eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"reddit-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["google-ads","linkedin-ads","hubspot","hubspot"]}},"example":{"config":"Est et expedita itaque.","platforms":["reddit-ads","microsoft-ads","microsoft-ads","reddit-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Est in deserunt."},"config":{"description":"Campaign configuration snapshot","example":"Odio sunt totam."},"status":{"type":"string","description":"Campaign status","example":"Omnis explicabo doloremque et sed."}},"example":{"campaign_name":"Sunt id ipsa perspiciatis sunt.","config":"Impedit at perspiciatis quisquam perferendis.","status":"Velit voluptatibus aut mollitia aut molestiae exercitationem."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Suscipit ut mollitia accusantium dignissimos numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Ratione nesciunt."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Qui molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6319115309163667798,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Suscipit quas sunt eos nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Qui maiores aut reiciendis ullam."},"description":"Platforms this job will create on","example":["Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur non cumque laudantium quod modi voluptas.","platforms":["Et ad.","Quia dolores voluptatibus tempora possimus consequatur.","Unde nihil et.","Quod est voluptas sequi voluptatem numquam."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Nihil ea quod et aut."},"job_id":{"type":"string","description":"Job UUID","example":"Ut alias quis nihil dolore suscipit reprehenderit."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Animi laudantium ullam omnis autem et id."},"status":{"type":"string","description":"Job status","example":"failed","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Molestiae ratione officia fugit provident officia.","job_id":"Inventore enim reiciendis.","result":"Ut rerum facilis.","status":"failed"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui alias ea."},"event_details":{"description":"Extracted event/course details","example":"Eos nesciunt ipsum et delectus dolorum."},"event_slug":{"type":"string","description":"Event/course slug","example":"Adipisci quaerat est nobis."},"id":{"type":"string","description":"Brief UUID","example":"Repellendus quo quidem."},"keywords":{"description":"Keyword list","example":"Tempore maxime."},"platforms":{"type":"array","items":{"type":"string","example":"Et veritatis quisquam sed ratione et."},"description":"Suggested default platforms","example":["Molestiae eos.","Aut iusto quos impedit eos.","Adipisci rerum consequatur placeat ea odio."]},"program_type":{"type":"string","description":"Funnel context","example":"Illum rerum error incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Cumque totam nulla aut reprehenderit."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Porro enim dolorum nobis."},"url":{"type":"string","description":"Event/course page URL","example":"Fugit non fuga rem adipisci."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6324133014862191516,"format":"int64"}},"example":{"copy":"Aut facilis porro dolor ipsa velit.","event_details":"Ut mollitia tempora minima voluptas quod.","event_slug":"Aperiam voluptates.","id":"Magnam pariatur explicabo est.","keywords":"Hic quis facere exercitationem.","platforms":["Aut perferendis natus.","Eaque ipsam harum nisi nobis et et.","Excepturi corporis ut.","Odio eius sed qui deserunt perspiciatis."],"program_type":"Adipisci ullam pariatur ex voluptas.","project_id":"Qui praesentium ipsam officiis cum ipsum recusandae.","status":"archived","targeting":"Exercitationem aut eaque.","url":"Vero ducimus.","version":5743767113243123162},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Commodi dicta."},"event_details":{"description":"Extracted event/course details","example":"Consequatur non cumque laudantium quod modi voluptas."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Accusamus et provident provident."},"keywords":{"description":"Keyword list","example":"Ad non."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Dolores voluptatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Odit iusto ad animi eos doloribus autem."}},"example":{"copy":"Quos accusantium fugit.","event_details":"Et expedita itaque quos.","event_slug":"Consequatur est unde nihil.","keywords":"Excepturi saepe sit vel perspiciatis neque.","platforms":["Qui eveniet laboriosam possimus.","Facere velit dolores eligendi.","Ad voluptatem.","Tempore impedit."],"program_type":"education","targeting":"Qui molestias.","url":"Laudantium quod est voluptas sequi voluptatem."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Nihil dolore suscipit reprehenderit et aut animi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Et aut consequatur inventore enim reiciendis."},"id":{"type":"string","description":"Campaign UUID","example":"Aut molestiae exercitationem et impedit at."},"platform":{"type":"string","description":"Channel","example":"Ullam omnis autem."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Id laboriosam nihil ea."},"project_id":{"type":"string","description":"Owning project","example":"Quisquam perferendis autem ut alias."},"status":{"type":"string","description":"Campaign status","example":"Neque ut rerum facilis quia molestiae ratione."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3905678301175813319,"format":"int64"}},"example":{"brief_id":"Consequatur qui molestiae velit ratione nesciunt et.","campaign_name":"Enim qui officia id necessitatibus mollitia soluta.","id":"Provident officia officiis.","platform":"Rerum ut necessitatibus illum ratione.","platform_campaign_id":"Mollitia atque atque dolores accusantium non dolor.","project_id":"Ut mollitia accusantium dignissimos.","status":"Nobis labore dicta.","version":6819175354933615501},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Sunt totam incidunt sunt id ipsa."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["linkedin-ads","hubspot","meta-ads","meta-ads"]}},"example":{"config":"Voluptatibus aut.","platforms":["hubspot","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Incidunt qui aut tempora dolor sequi quia."},"config":{"description":"Campaign configuration snapshot","example":"Culpa iste."},"status":{"type":"string","description":"Campaign status","example":"Consequatur velit odio."}},"example":{"campaign_name":"Sit incidunt.","config":"Qui quisquam voluptatibus sint quia.","status":"Officiis est."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Sunt assumenda."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Officia eligendi tempore provident dicta temporibus debitis.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est officia et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit in recusandae maiores et voluptatem voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ex quo praesentium voluptas."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Eos et architecto voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Mollitia omnis doloribus qui consequatur et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5274458285620360301,"format":"int64"}},"example":{"account_id":"Nihil nihil quae porro qui rem autem.","has_credentials":true,"id":"Vel natus provident.","label":"Ut non error aut et fuga.","login_customer_id":"Vitae perspiciatis eveniet quibusdam nobis ut asperiores.","project_id":"Perspiciatis id.","status":"deleted","version":4918506778223386612},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quis dicta voluptate aut in corporis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Nobis soluta."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Vitae accusantium excepturi deleniti voluptas."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut enim et."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Laboriosam non id temporibus et provident.","client_secret":"Neque quis illo minima.","developer_token":"Earum eligendi.","refresh_token":"Vel quae laudantium amet veritatis rerum itaque."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt repellendus corrupti itaque quo sit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Perspiciatis porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Omnis nobis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Eum et ipsum expedita reprehenderit eos."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum tempore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolorum ut architecto deleniti nostrum."},"sender_name":{"type":"string","description":"Default sender name","example":"Aperiam et nihil."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6605548766358472787,"format":"int64"}},"example":{"account_id":"Aperiam quos perferendis nisi blanditiis eveniet.","brand_kit":"Optio labore omnis.","has_credentials":true,"id":"Distinctio amet enim.","label":"Deserunt quod.","portal_id":"Corporis dolorum consequatur eius perferendis.","project_id":"Rem error.","sender_email":"Omnis vel voluptate necessitatibus enim et et.","sender_name":"Sunt omnis mollitia aut rerum quis et.","status":"active","version":7462268971443661923},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Rem ab corporis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Eaque dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil aut rerum est vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Non dolorem."},"sender_email":{"type":"string","description":"Default sender address","example":"Porro et."},"sender_name":{"type":"string","description":"Default sender name","example":"Dolor aut assumenda fugiat."}},"example":{"account_id":"Aut quas suscipit eos.","brand_kit":"Dolor et corrupti voluptas neque vitae.","label":"Inventore alias error aut maxime dicta.","portal_id":"Ipsa rerum velit et impedit.","sender_email":"Quaerat labore dolor.","sender_name":"Velit quam omnis."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Omnis autem accusamus."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Est assumenda aut."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Molestiae minus dolor accusantium."},"platforms":{"type":"array","items":{"type":"string","example":"Molestias fuga voluptatibus quis adipisci."},"description":"Platforms this job will create on","example":["Ut blanditiis dolor modi nobis aliquid.","Consequatur officiis velit quasi dolores assumenda.","Mollitia fugiat dolore similique et.","Voluptates quaerat molestiae."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Cum porro architecto doloremque aperiam doloribus aut.","platforms":["Cumque iure veritatis cumque nisi.","Distinctio ipsum ab.","Natus placeat esse est in deserunt aliquid."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Distinctio voluptas ut ut nisi."},"job_id":{"type":"string","description":"Job UUID","example":"Tempore nemo illum ut maiores."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}]},"status":{"type":"string","description":"Job status","example":"partial","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Et atque dolor odio labore pariatur.","job_id":"Nostrum velit hic excepturi omnis reprehenderit distinctio.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"queued"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"At odio incidunt distinctio sint qui."},"label":{"type":"string","description":"Optional friendly name","example":"Cumque saepe sint quidem odio ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Esse praesentium voluptatibus deserunt aliquam."},"project_id":{"type":"string","description":"Owning project","example":"Quis quis reprehenderit non quae omnis qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1342488242351916696,"format":"int64"}},"example":{"account_id":"Necessitatibus magni et molestiae.","has_credentials":true,"id":"Eos ut et eligendi.","label":"Est et eum est.","org_id":"Dolorum quas.","project_id":"Numquam dolorum consequatur.","status":"active","version":6946177746341876830},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nulla fuga fugit repellendus et accusamus sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Sequi error.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quam deleniti et et."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Quia aperiam sunt est labore."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus voluptatem iste nisi in."},"app_id":{"type":"string","description":"Meta app ID","example":"Iste qui rerum est sed sed similique."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut est rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"page_id":{"type":"string","description":"Facebook page ID","example":"Dolor occaecati earum iusto rerum sit cupiditate."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3681253484013323435,"format":"int64"}},"example":{"account_id":"Qui quidem exercitationem.","app_id":"Necessitatibus laudantium est ut.","has_credentials":false,"id":"Ea maiores quidem molestiae deleniti omnis.","label":"Nostrum corporis quasi magnam.","page_id":"Architecto quas eligendi impedit qui sed.","project_id":"Expedita voluptatum commodi fuga ipsa.","status":"active","version":8272760528024179326},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Exercitationem illum et quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Neque facilis est qui possimus eligendi."},"page_id":{"type":"string","description":"Facebook page ID","example":"Possimus et corrupti et nobis voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Quia quisquam corrupti distinctio voluptas eius.","label":"Est facilis qui.","page_id":"Modi ut culpa excepturi blanditiis."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Autem est est distinctio sunt aliquid harum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Nam rerum eaque eius."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Rerum illo mollitia odio et dolor.","app_secret":"Consectetur sint error ipsam maiores."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et rerum in expedita."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Consequatur dolore unde illum."},"label":{"type":"string","description":"Optional friendly name","example":"Quo veritatis quis delectus est."},"project_id":{"type":"string","description":"Owning project","example":"Dolores tenetur ut illum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4673192311933251173,"format":"int64"}},"example":{"account_id":"Aperiam cum possimus.","customer_id":"Omnis sed dolore dolorem voluptatibus quod.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Ullam ab suscipit et labore harum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Deleniti doloribus debitis assumenda dignissimos."},"label":{"type":"string","description":"Optional friendly name","example":"Non iste ad rem quidem sunt qui."}},"example":{"account_id":"Quisquam quam officiis aut.","customer_id":"Architecto ut unde.","label":"Vitae aut ea."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sapiente possimus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Voluptates atque."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Eaque voluptate reprehenderit sed voluptatem sed illo."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Cum nisi numquam.","client_secret":"Id unde veritatis officiis aut fugiat.","developer_token":"Quo corporis recusandae dicta quibusdam.","refresh_token":"Ut commodi et voluptas tenetur nobis facere."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Sed sit repudiandae aut aut."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolores vel dolorum minus voluptatem."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"Enim temporibus."}},"example":{"campaign_id":"Qui culpa deleniti.","error":"Et atque enim quis sed.","ok":true,"platform":"Architecto itaque doloribus voluptatem consequatur quis fugiat."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facilis suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Non sint inventore iste iure ut."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis deleniti."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4582993025544492856,"format":"int64"}},"example":{"account_id":"Expedita dignissimos non sed omnis officiis et.","has_credentials":false,"id":"Ad inventore voluptatum eligendi quasi.","label":"Velit dolores omnis placeat unde distinctio ducimus.","project_id":"Ipsa et dolore.","status":"active","version":4526728339972318921},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Enim repellendus magni repudiandae inventore."}},"example":{"account_id":"t2_gv9wtbfa","label":"Corrupti repellat eius ut qui nobis."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Delectus quam et eos."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Rem aut fuga."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Est dolor ut corporis."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Cupiditate ut illo dolor quaerat totam.","client_secret":"Illo vitae occaecati omnis.","refresh_token":"Pariatur debitis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eum et sint corrupti eos."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Qui unde dicta autem dolorem qui explicabo."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo possimus consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque autem ex eos."},"project_id":{"type":"string","description":"Owning project","example":"Quos hic doloribus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4374149818121411294,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","funding_instrument_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Repellat non suscipit veritatis sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim accusantium labore esse numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Dolorum deserunt.","label":"Non laudantium sunt minima repudiandae illo harum."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Saepe voluptatem reiciendis pariatur."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Et ut quis ut."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Sit dolor sunt eos nihil ipsam."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Odio totam cum deleniti placeat fuga."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Aut autem sint minus voluptatum.","access_token_secret":"Tempore quae.","consumer_key":"Iusto omnis.","consumer_secret":"Quia cum non."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index 8e0d6c4a..35626754 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -3428,76 +3428,76 @@ definitions: properties: copy: description: Ad copy - example: Iusto velit quo voluptatibus modi reiciendis aliquam. + example: Qui alias ea. event_details: description: Extracted event/course details - example: Odit necessitatibus veritatis amet ut rerum quidem. + example: Eos nesciunt ipsum et delectus dolorum. event_slug: type: string description: Event/course slug - example: Eos voluptatibus. + example: Adipisci quaerat est nobis. id: type: string description: Brief UUID - example: Vero quisquam. + example: Repellendus quo quidem. keywords: description: Keyword list - example: Quidem explicabo expedita sunt. + example: Tempore maxime. platforms: type: array items: type: string - example: Ex delectus. + example: Et veritatis quisquam sed ratione et. description: Suggested default platforms example: - - Ullam dolores rem. - - Officia quidem non qui voluptates natus cum. - - Autem recusandae totam. - - Rerum nisi. + - Molestiae eos. + - Aut iusto quos impedit eos. + - Adipisci rerum consequatur placeat ea odio. program_type: type: string description: Funnel context - example: Facilis reiciendis dignissimos consequatur iste qui minima. + example: Illum rerum error incidunt. project_id: type: string description: Owning project - example: Labore laudantium. + example: Cumque totam nulla aut reprehenderit. status: type: string description: Lifecycle status - example: archived + example: draft enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Similique deserunt iusto. + example: Porro enim dolorum nobis. url: type: string description: Event/course page URL - example: Voluptatem sed quia excepturi. + example: Fugit non fuga rem adipisci. version: type: integer description: Optimistic-concurrency version - example: 8240116664126121650 + example: 6324133014862191516 format: int64 example: - copy: Placeat ea odio ea eos. - event_details: Non adipisci rerum. - event_slug: Adipisci quaerat est nobis. - id: Possimus exercitationem repellendus quo quidem. - keywords: Ipsum et delectus dolorum eveniet. + copy: Aut facilis porro dolor ipsa velit. + event_details: Ut mollitia tempora minima voluptas quod. + event_slug: Aperiam voluptates. + id: Magnam pariatur explicabo est. + keywords: Hic quis facere exercitationem. platforms: - - Veritatis quisquam sed ratione et. - - Cumque molestiae eos rem aut. - - Quos impedit. - program_type: Illum rerum error incidunt. - project_id: Cumque totam nulla aut reprehenderit. - status: approved - targeting: Alias ea quibusdam. - url: Fugit non fuga rem adipisci. - version: 8901460428935487189 + - Aut perferendis natus. + - Eaque ipsam harum nisi nobis et et. + - Excepturi corporis ut. + - Odio eius sed qui deserunt perspiciatis. + program_type: Adipisci ullam pariatur ex voluptas. + project_id: Qui praesentium ipsam officiis cum ipsum recusandae. + status: archived + targeting: Exercitationem aut eaque. + url: Vero ducimus. + version: 5743767113243123162 required: - id - project_id @@ -3511,27 +3511,28 @@ definitions: properties: copy: description: Ad copy - example: Et eveniet. + example: Commodi dicta. event_details: description: Extracted event/course details - example: Est eaque ipsam harum nisi nobis. + example: Consequatur non cumque laudantium quod modi voluptas. event_slug: type: string description: Event/course slug (unique within the project) - example: Enim dolorum nobis itaque est enim. + example: Accusamus et provident provident. keywords: description: Keyword list - example: Corporis ut non. + example: Ad non. platforms: type: array items: type: string - example: Praesentium ipsam officiis cum ipsum recusandae. + example: Sed voluptatum laborum. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Ullam pariatur ex voluptas aspernatur. - - Voluptates aliquam vero ducimus. - - Recusandae aut perferendis. + - Quas sunt eos nulla et perferendis qui. + - Aut reiciendis ullam laborum. + - Et quidem nisi quasi. + - Ab deserunt quia magnam temporibus minus et. program_type: type: string description: Funnel context @@ -3542,22 +3543,24 @@ definitions: - membership targeting: description: Targeting recommendation - example: Eius sed qui deserunt perspiciatis nihil. + example: Dolores voluptatibus. url: type: string description: Event/course page URL - example: Pariatur explicabo est totam. + example: Odit iusto ad animi eos doloribus autem. example: - copy: Provident provident. - event_details: Odit rerum quidem accusamus. - event_slug: Tempora minima voluptas quod facere aut. - keywords: Odit iusto ad animi eos doloribus autem. + copy: Quos accusantium fugit. + event_details: Et expedita itaque quos. + event_slug: Consequatur est unde nihil. + keywords: Excepturi saepe sit vel perspiciatis neque. platforms: - - Hic quis facere exercitationem. - - Exercitationem aut eaque. - program_type: membership - targeting: Sed voluptatum laborum. - url: Porro dolor ipsa. + - Qui eveniet laboriosam possimus. + - Facere velit dolores eligendi. + - Ad voluptatem. + - Tempore impedit. + program_type: education + targeting: Qui molestias. + url: Laudantium quod est voluptas sequi voluptatem. required: - program_type - event_slug @@ -3568,45 +3571,45 @@ definitions: brief_id: type: string description: Parent brief - example: Qui molestias. + example: Nihil dolore suscipit reprehenderit et aut animi. campaign_name: type: string description: Campaign name - example: Aut rerum ut blanditiis dolor. + example: Et aut consequatur inventore enim reiciendis. id: type: string description: Campaign UUID - example: Voluptatibus quos accusantium fugit. + example: Aut molestiae exercitationem et impedit at. platform: type: string description: Channel - example: Molestiae minus dolor accusantium. + example: Ullam omnis autem. platform_campaign_id: type: string description: ID returned by the ad platform - example: Cum molestias fuga voluptatibus quis. + example: Id laboriosam nihil ea. project_id: type: string description: Owning project - example: Excepturi saepe sit vel perspiciatis neque. + example: Quisquam perferendis autem ut alias. status: type: string description: Campaign status - example: Nobis aliquid rerum consequatur officiis velit. + example: Neque ut rerum facilis quia molestiae ratione. version: type: integer description: Optimistic-concurrency version - example: 8006615023617839427 + example: 3905678301175813319 format: int64 example: - brief_id: Omnis voluptates quaerat. - campaign_name: Beatae placeat cumque iure veritatis cumque. - id: Assumenda accusantium. - platform: Quos cum porro architecto. - platform_campaign_id: Aperiam doloribus aut. - project_id: Fugiat dolore similique. - status: Ex distinctio ipsum ab assumenda natus. - version: 5157498100002718362 + brief_id: Consequatur qui molestiae velit ratione nesciunt et. + campaign_name: Enim qui officia id necessitatibus mollitia soluta. + id: Provident officia officiis. + platform: Rerum ut necessitatibus illum ratione. + platform_campaign_id: Mollitia atque atque dolores accusantium non dolor. + project_id: Ut mollitia accusantium dignissimos. + status: Nobis labore dicta. + version: 6819175354933615501 required: - id - project_id @@ -3621,12 +3624,12 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Velit dolores eligendi. + example: Sunt totam incidunt sunt id ipsa. platforms: type: array items: type: string - example: reddit-ads + example: google-ads enum: - google-ads - linkedin-ads @@ -3637,17 +3640,15 @@ definitions: - hubspot description: Platforms to create campaigns on (binding selection) example: - - google-ads - linkedin-ads - hubspot - - hubspot + - meta-ads + - meta-ads example: - config: Est et expedita itaque. + config: Voluptatibus aut. platforms: - - reddit-ads - - microsoft-ads + - hubspot - microsoft-ads - - reddit-ads required: - platforms CampaignUpdateInput: @@ -3657,18 +3658,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Est in deserunt. + example: Incidunt qui aut tempora dolor sequi quia. config: description: Campaign configuration snapshot - example: Odio sunt totam. + example: Culpa iste. status: type: string description: Campaign status - example: Omnis explicabo doloremque et sed. + example: Consequatur velit odio. example: - campaign_name: Sunt id ipsa perspiciatis sunt. - config: Impedit at perspiciatis quisquam perferendis. - status: Velit voluptatibus aut mollitia aut molestiae exercitationem. + campaign_name: Sit incidunt. + config: Qui quisquam voluptatibus sint quia. + status: Officiis est. required: - campaign_name - status @@ -3717,13 +3718,13 @@ definitions: message: type: string description: Human-readable detail - example: Accusamus et atque enim. + example: Sunt assumenda. ok: type: boolean description: Whether the credential authenticated against the provider example: true example: - message: Rerum dicta distinctio. + message: Officia eligendi tempore provident dicta temporibus debitis. ok: false required: - ok @@ -3734,31 +3735,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Reiciendis rerum. + example: Est officia et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Suscipit ut mollitia accusantium dignissimos numquam. + example: Velit in recusandae maiores et voluptatem voluptatem. label: type: string description: Optional friendly name - example: Ratione nesciunt. + example: Ex quo praesentium voluptas. login_customer_id: type: string description: Manager account used for API access - example: Voluptate mollitia. + example: Eos et architecto voluptas. project_id: type: string description: Owning project - example: Qui molestiae. + example: Mollitia omnis doloribus qui consequatur et. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -3767,17 +3768,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6319115309163667798 + example: 5274458285620360301 format: int64 example: - account_id: Quisquam incidunt qui. + account_id: Nihil nihil quae porro qui rem autem. has_credentials: true - id: Atque dolores accusantium non dolor. - label: Nobis labore dicta. - login_customer_id: Quia exercitationem consequatur velit. - project_id: Enim qui officia id necessitatibus mollitia soluta. - status: inactive - version: 2620236536617279883 + id: Vel natus provident. + label: Ut non error aut et fuga. + login_customer_id: Vitae perspiciatis eveniet quibusdam nobis ut asperiores. + project_id: Perspiciatis id. + status: deleted + version: 4918506778223386612 required: - id - project_id @@ -3814,25 +3815,25 @@ definitions: client_id: type: string description: OAuth client id - example: Officiis est. + example: Quis dicta voluptate aut in corporis. client_secret: type: string description: OAuth client secret - example: Qui quisquam voluptatibus sint quia. + example: Nobis soluta. developer_token: type: string description: Google Ads developer token - example: Tempore nemo illum ut maiores. + example: Vitae accusantium excepturi deleniti voluptas. refresh_token: type: string description: OAuth refresh token - example: Quia culpa iste id sit incidunt. + example: Aut enim et. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Sit repudiandae aut aut ducimus dolores vel. - client_secret: Minus voluptatem sed architecto itaque doloribus. - developer_token: Consequatur quis fugiat expedita recusandae qui. - refresh_token: Accusantium enim temporibus dolor ipsam. + client_id: Laboriosam non id temporibus et provident. + client_secret: Neque quis illo minima. + developer_token: Earum eligendi. + refresh_token: Vel quae laudantium amet veritatis rerum itaque. required: - refresh_token - client_id @@ -3845,11 +3846,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Repellat assumenda nesciunt distinctio eaque aliquam. + example: Deserunt repellendus corrupti itaque quo sit. brand_kit: type: string description: Per-project brand kit selector - example: Et voluptatem deserunt consequuntur omnis sed dolore. + example: Perspiciatis porro. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3857,31 +3858,31 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quo veritatis quis delectus est. + example: Blanditiis mollitia dolores illo nostrum magnam. label: type: string description: Optional friendly name - example: Vel voluptate. + example: Omnis nobis. portal_id: type: string description: HubSpot portal/account ID - example: In hic. + example: Eum et ipsum expedita reprehenderit eos. project_id: type: string description: Owning project - example: Et rerum in expedita. + example: Nostrum tempore. sender_email: type: string description: Default sender address - example: Facere ipsa et reprehenderit dignissimos voluptas. + example: Dolorum ut architecto deleniti nostrum. sender_name: type: string description: Default sender name - example: Consequatur dignissimos itaque quia ut aperiam cum. + example: Aperiam et nihil. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -3890,20 +3891,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4147907586526409625 + example: 6605548766358472787 format: int64 example: - account_id: Assumenda dignissimos beatae vitae aut ea dolor. - brand_kit: Eaque voluptate reprehenderit sed voluptatem sed illo. + account_id: Aperiam quos perferendis nisi blanditiis eveniet. + brand_kit: Optio labore omnis. has_credentials: true - id: Voluptatibus quod necessitatibus non iste ad rem. - label: Harum corporis deleniti doloribus. - portal_id: Sit architecto ut unde. - project_id: Sunt qui cupiditate ullam ab suscipit et. - sender_email: Sapiente possimus. - sender_name: Voluptates atque. - status: error - version: 6055913800302101668 + id: Distinctio amet enim. + label: Deserunt quod. + portal_id: Corporis dolorum consequatur eius perferendis. + project_id: Rem error. + sender_email: Omnis vel voluptate necessitatibus enim et et. + sender_name: Sunt omnis mollitia aut rerum quis et. + status: active + version: 7462268971443661923 required: - id - project_id @@ -3918,34 +3919,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Cum nisi numquam. + example: Rem ab corporis. brand_kit: type: string description: Per-project brand kit selector - example: Blanditiis mollitia dolores illo nostrum magnam. + example: Eaque dolor. label: type: string description: Optional friendly name - example: Praesentium tenetur quas at ut necessitatibus dolor. + example: Nihil aut rerum est vel. portal_id: type: string description: HubSpot portal/account ID - example: Id unde veritatis officiis aut fugiat. + example: Non dolorem. sender_email: type: string description: Default sender address - example: Ut commodi et voluptas tenetur nobis facere. + example: Porro et. sender_name: type: string description: Default sender name - example: Quo corporis recusandae dicta quibusdam. + example: Dolor aut assumenda fugiat. example: - account_id: Omnis nobis. - brand_kit: Dolorum ut architecto deleniti nostrum. - label: Nostrum tempore. - portal_id: Deserunt repellendus corrupti itaque quo sit. - sender_email: Rerum explicabo. - sender_name: Eum et ipsum expedita reprehenderit eos. + account_id: Aut quas suscipit eos. + brand_kit: Dolor et corrupti voluptas neque vitae. + label: Inventore alias error aut maxime dicta. + portal_id: Ipsa rerum velit et impedit. + sender_email: Quaerat labore dolor. + sender_name: Velit quam omnis. required: - account_id HubspotCredentials: @@ -3955,10 +3956,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Aperiam et nihil. + example: Omnis autem accusamus. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Perspiciatis porro. + private_app_token: Est assumenda aut. required: - private_app_token InternalServerError: @@ -3987,16 +3988,18 @@ definitions: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Suscipit quas sunt eos nulla. + example: Molestiae minus dolor accusantium. platforms: type: array items: type: string - example: Qui maiores aut reiciendis ullam. + example: Molestias fuga voluptatibus quis adipisci. description: Platforms this job will create on example: - - Et quidem nisi quasi. - - Ab deserunt quia magnam temporibus minus et. + - Ut blanditiis dolor modi nobis aliquid. + - Consequatur officiis velit quasi dolores assumenda. + - Mollitia fugiat dolore similique et. + - Voluptates quaerat molestiae. status: type: string description: Initial status (always 'queued' on create) @@ -4004,12 +4007,11 @@ definitions: enum: - queued example: - job_id: Consequatur non cumque laudantium quod modi voluptas. + job_id: Cum porro architecto doloremque aperiam doloribus aut. platforms: - - Et ad. - - Quia dolores voluptatibus tempora possimus consequatur. - - Unde nihil et. - - Quod est voluptas sequi voluptatem numquam. + - Cumque iure veritatis cumque nisi. + - Distinctio ipsum ab. + - Natus placeat esse est in deserunt aliquid. status: queued required: - job_id @@ -4021,18 +4023,29 @@ definitions: error: type: string description: Terminal error, if any - example: Nihil ea quod et aut. + example: Distinctio voluptas ut ut nisi. job_id: type: string description: Job UUID - example: Ut alias quis nihil dolore suscipit reprehenderit. + example: Tempore nemo illum ut maiores. result: + type: array + items: + $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state - example: Animi laudantium ullam omnis autem et id. + example: + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. status: type: string description: Job status - example: failed + example: partial enum: - queued - running @@ -4040,10 +4053,26 @@ definitions: - partial - failed example: - error: Molestiae ratione officia fugit provident officia. - job_id: Inventore enim reiciendis. - result: Ut rerum facilis. - status: failed + error: Et atque dolor odio labore pariatur. + job_id: Nostrum velit hic excepturi omnis reprehenderit distinctio. + result: + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + status: queued required: - job_id - status @@ -4055,16 +4084,17 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. required: - brief LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: @@ -4075,12 +4105,10 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Est voluptatum enim earum et doloribus. + config: Vitae reiciendis voluptatem. platforms: - - hubspot - - meta-ads - reddit-ads - - twitter-ads + - microsoft-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4091,16 +4119,17 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. required: - brief LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: @@ -4111,9 +4140,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. - config: Error similique. - status: Maxime fugiat illo. + campaign_name: Alias ullam fugiat deserunt sint nihil iusto. + config: Necessitatibus expedita. + status: Voluptas inventore sit. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4130,10 +4159,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - config - credentials @@ -4147,14 +4176,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - config - credentials @@ -4169,10 +4198,10 @@ definitions: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - config - credentials @@ -4187,12 +4216,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - config - credentials @@ -4206,14 +4235,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. required: - config - credentials @@ -4228,11 +4257,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - config - credentials @@ -4247,13 +4276,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - config - credentials @@ -4265,10 +4294,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4279,7 +4308,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4290,7 +4319,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4301,8 +4330,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4313,10 +4342,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4327,9 +4356,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4340,10 +4369,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4367,12 +4396,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4384,7 +4413,7 @@ definitions: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" required: - config @@ -4397,9 +4426,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4410,9 +4439,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4424,7 +4453,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4436,8 +4465,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. required: - config LinkedinAdsConnection: @@ -4447,7 +4476,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Velit in recusandae maiores et voluptatem voluptatem. + example: Aut est. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4455,23 +4484,23 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut ut nisi fuga nostrum velit hic. + example: At odio incidunt distinctio sint qui. label: type: string description: Optional friendly name - example: Atque dolor odio labore pariatur. + example: Cumque saepe sint quidem odio ab. org_id: type: string description: LinkedIn organization URN id - example: Qui consequatur et dignissimos ex. + example: Esse praesentium voluptatibus deserunt aliquam. project_id: type: string description: Owning project - example: Omnis reprehenderit distinctio quos ut unde. + example: Quis quis reprehenderit non quae omnis qui. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -4480,17 +4509,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 342612035894089324 + example: 1342488242351916696 format: int64 example: - account_id: Vel natus provident. + account_id: Necessitatibus magni et molestiae. has_credentials: true - id: Praesentium voluptas beatae. - label: Eos et architecto voluptas. - org_id: Ut non error aut et fuga. - project_id: Officia et sint numquam accusamus. - status: inactive - version: 4235609230431250467 + id: Eos ut et eligendi. + label: Est et eum est. + org_id: Dolorum quas. + project_id: Numquam dolorum consequatur. + status: active + version: 6946177746341876830 required: - id - project_id @@ -4509,14 +4538,14 @@ definitions: label: type: string description: Optional friendly name - example: Nihil nihil quae porro qui rem autem. + example: Nulla fuga fugit repellendus et accusamus sed. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Et nulla officia vitae. + label: Sequi error. org_id: "208777" required: - account_id @@ -4528,10 +4557,10 @@ definitions: access_token: type: string description: OAuth access token - example: Eveniet quibusdam. + example: Quam deleniti et et. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Ut asperiores quo aut. + access_token: Quia aperiam sunt est labore. required: - access_token MetaAdsConnection: @@ -4541,35 +4570,35 @@ definitions: account_id: type: string description: Provider account identifier - example: Laudantium amet veritatis rerum itaque consequatur laboriosam. + example: Delectus voluptatem iste nisi in. app_id: type: string description: Meta app ID - example: Quis illo minima. + example: Iste qui rerum est sed sed similique. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Et sunt quis dicta voluptate aut in. + example: Ut est rerum. label: type: string description: Optional friendly name - example: Excepturi deleniti voluptas aperiam vel. + example: Natus expedita aspernatur consequuntur quod ducimus molestias. page_id: type: string description: Facebook page ID - example: Provident maiores. + example: Dolor occaecati earum iusto rerum sit cupiditate. project_id: type: string description: Owning project - example: Provident nobis soluta culpa vitae. + example: Occaecati et. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -4578,18 +4607,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 206759142589582139 + example: 3681253484013323435 format: int64 example: - account_id: At odio incidunt distinctio sint qui. - app_id: Enim cumque saepe sint quidem odio. + account_id: Qui quidem exercitationem. + app_id: Necessitatibus laudantium est ut. has_credentials: false - id: Earum eligendi. - label: Provident dicta temporibus debitis. - page_id: Non quae omnis. - project_id: Ipsum sunt assumenda ipsa dolor officia eligendi. - status: inactive - version: 1065443246813246267 + id: Ea maiores quidem molestiae deleniti omnis. + label: Nostrum corporis quasi magnam. + page_id: Architecto quas eligendi impedit qui sed. + project_id: Expedita voluptatum commodi fuga ipsa. + status: active + version: 8272760528024179326 required: - id - project_id @@ -4608,20 +4637,20 @@ definitions: app_id: type: string description: Meta app ID - example: Voluptatibus deserunt. + example: Exercitationem illum et quisquam. label: type: string description: Optional friendly name - example: Accusantium aut. + example: Neque facilis est qui possimus eligendi. page_id: type: string description: Facebook page ID - example: Deleniti error pariatur consequatur esse. + example: Possimus et corrupti et nobis voluptas. example: account_id: act_193556282970417 - app_id: Et eum est molestiae necessitatibus magni. - label: Necessitatibus eos. - page_id: Et eligendi et numquam dolorum consequatur in. + app_id: Quia quisquam corrupti distinctio voluptas eius. + label: Est facilis qui. + page_id: Modi ut culpa excepturi blanditiis. required: - account_id MetaAdsCredentials: @@ -4631,15 +4660,15 @@ definitions: access_token: type: string description: Meta access token - example: Molestiae praesentium perferendis deserunt ipsum dolorum. + example: Autem est est distinctio sunt aliquid harum. app_secret: type: string description: Meta app secret - example: Error nulla fuga fugit repellendus et accusamus. + example: Nam rerum eaque eius. description: Meta Ads credential. Write-only; never returned. example: - access_token: Non sequi error assumenda quam deleniti et. - app_secret: Nam quia aperiam sunt est. + access_token: Rerum illo mollitia odio et dolor. + app_secret: Consectetur sint error ipsam maiores. required: - access_token - app_secret @@ -4650,31 +4679,31 @@ definitions: account_id: type: string description: Provider account identifier - example: A necessitatibus molestiae. + example: Et rerum in expedita. customer_id: type: string description: Microsoft Advertising customer ID - example: Dolorem qui explicabo consequuntur repellat non suscipit. + example: Repellat assumenda nesciunt distinctio eaque aliquam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quos hic doloribus. + example: Consequatur dolore unde illum. label: type: string description: Optional friendly name - example: Eum et sint corrupti eos. + example: Quo veritatis quis delectus est. project_id: type: string description: Owning project - example: Neque autem ex eos. + example: Dolores tenetur ut illum. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4683,17 +4712,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 7747776820204091337 + example: 4673192311933251173 format: int64 example: - account_id: Sit est dolores est et. - customer_id: Velit atque laudantium ullam rerum. + account_id: Aperiam cum possimus. + customer_id: Omnis sed dolore dolorem voluptatibus quod. has_credentials: false - id: Sit tempore. - label: Ut quo iure. - project_id: Magnam ut similique ea minima magnam. - status: deleted - version: 7309957715046801903 + id: Veniam consectetur deserunt in hic dolorum facere. + label: Magni consequatur dignissimos itaque quia. + project_id: Et reprehenderit dignissimos. + status: error + version: 3475949958922975875 required: - id - project_id @@ -4708,19 +4737,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Enim accusantium labore esse numquam. + example: Ullam ab suscipit et labore harum. customer_id: type: string description: Microsoft Advertising customer ID - example: Non laudantium sunt minima repudiandae illo harum. + example: Deleniti doloribus debitis assumenda dignissimos. label: type: string description: Optional friendly name - example: Rerum adipisci. + example: Non iste ad rem quidem sunt qui. example: - account_id: Sit dolor sunt eos nihil ipsam. - customer_id: Odio totam cum deleniti placeat fuga. - label: Dolorum deserunt. + account_id: Quisquam quam officiis aut. + customer_id: Architecto ut unde. + label: Vitae aut ea. required: - account_id MicrosoftAdsCredentials: @@ -4730,25 +4759,25 @@ definitions: client_id: type: string description: OAuth client id - example: Saepe voluptatem reiciendis pariatur. + example: Sapiente possimus. client_secret: type: string description: OAuth client secret - example: Et ut quis ut. + example: Voluptates atque. developer_token: type: string description: Microsoft Advertising developer token - example: Quia cum non. + example: Praesentium tenetur quas at ut necessitatibus dolor. refresh_token: type: string description: OAuth refresh token - example: Iusto omnis. + example: Eaque voluptate reprehenderit sed voluptatem sed illo. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Aut autem sint minus voluptatum. - client_secret: Tempore quae. - developer_token: Dolores tenetur ut illum. - refresh_token: Consequatur dolore unde illum. + client_id: Cum nisi numquam. + client_secret: Id unde veritatis officiis aut fugiat. + developer_token: Quo corporis recusandae dicta quibusdam. + refresh_token: Ut commodi et voluptas tenetur nobis facere. required: - client_id - client_secret @@ -4773,6 +4802,34 @@ definitions: required: - code - message + PlatformResult: + title: PlatformResult + type: object + properties: + campaign_id: + type: string + description: Upstream platform campaign id (present when ok) + example: Sed sit repudiandae aut aut. + error: + type: string + description: Failure reason (present when not ok) + example: Dolores vel dolorum minus voluptatem. + ok: + type: boolean + description: Whether the campaign was created (or reused) successfully + example: false + platform: + type: string + description: Platform this result is for + example: Enim temporibus. + example: + campaign_id: Qui culpa deleniti. + error: Et atque enim quis sed. + ok: true + platform: Architecto itaque doloribus voluptatem consequatur quis fugiat. + required: + - platform + - ok PreconditionFailedError: title: PreconditionFailedError type: object @@ -4818,27 +4875,27 @@ definitions: account_id: type: string description: Provider account identifier - example: Quam quis quam dolor occaecati earum iusto. + example: Facilis suscipit. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Libero ut est rerum est occaecati et. + example: Maiores laudantium. label: type: string description: Optional friendly name - example: Delectus voluptatem iste nisi in. + example: Non sint inventore iste iure ut. project_id: type: string description: Owning project - example: Natus expedita aspernatur consequuntur quod ducimus molestias. + example: Perspiciatis deleniti. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -4847,16 +4904,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6933590282461306362 + example: 4582993025544492856 format: int64 example: - account_id: Nostrum corporis quasi magnam. + account_id: Expedita dignissimos non sed omnis officiis et. has_credentials: false - id: Iste qui rerum est sed sed similique. - label: Expedita voluptatum commodi fuga ipsa. - project_id: Ea maiores quidem molestiae deleniti omnis. - status: inactive - version: 6739884703025890394 + id: Ad inventore voluptatum eligendi quasi. + label: Velit dolores omnis placeat unde distinctio ducimus. + project_id: Ipsa et dolore. + status: active + version: 4526728339972318921 required: - id - project_id @@ -4875,10 +4932,10 @@ definitions: label: type: string description: Optional friendly name - example: Sint ipsa quo. + example: Enim repellendus magni repudiandae inventore. example: account_id: t2_gv9wtbfa - label: Architecto quas eligendi impedit qui sed. + label: Corrupti repellat eius ut qui nobis. required: - account_id RedditAdsCredentials: @@ -4888,20 +4945,20 @@ definitions: client_id: type: string description: OAuth client id - example: Necessitatibus laudantium est ut. + example: Delectus quam et eos. client_secret: type: string description: OAuth client secret - example: Neque facilis est qui possimus eligendi. + example: Rem aut fuga. refresh_token: type: string description: OAuth refresh token - example: Possimus et corrupti et nobis voluptas. + example: Est dolor ut corporis. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Exercitationem illum et quisquam. - client_secret: Est facilis qui. - refresh_token: Modi ut culpa excepturi blanditiis. + client_id: Cupiditate ut illo dolor quaerat totam. + client_secret: Illo vitae occaecati omnis. + refresh_token: Pariatur debitis. required: - client_id - client_secret @@ -4913,31 +4970,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Rerum illo mollitia odio et dolor. + example: Eum et sint corrupti eos. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Ipsam maiores et maiores laudantium aut perspiciatis. + example: Qui unde dicta autem dolorem qui explicabo. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quia quisquam corrupti distinctio voluptas eius. + example: Explicabo possimus consequatur. label: type: string description: Optional friendly name - example: Nam rerum eaque eius. + example: Neque autem ex eos. project_id: type: string description: Owning project - example: Autem est est distinctio sunt aliquid harum. + example: Quos hic doloribus. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -4946,17 +5003,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 9024066918837864439 + example: 4374149818121411294 format: int64 example: - account_id: Ad inventore voluptatum eligendi quasi. - funding_instrument_id: Aperiam velit dolores. - has_credentials: true - id: Voluptates non sint inventore iste iure ut. - label: Porro voluptate. - project_id: Facilis suscipit. - status: inactive - version: 358292288538552244 + account_id: Sit est dolores est et. + funding_instrument_id: Velit atque laudantium ullam rerum. + has_credentials: false + id: Repellat non suscipit veritatis sit tempore. + label: Ut quo iure. + project_id: Magnam ut similique ea minima magnam. + status: deleted + version: 7309957715046801903 required: - id - project_id @@ -4975,15 +5032,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Dignissimos non sed omnis officiis et. + example: Enim accusantium labore esse numquam. label: type: string description: Optional friendly name - example: Placeat unde distinctio ducimus qui. + example: Rerum adipisci. example: account_id: 8r7gb - funding_instrument_id: Magni repudiandae. - label: Laboriosam qui id enim. + funding_instrument_id: Dolorum deserunt. + label: Non laudantium sunt minima repudiandae illo harum. required: - account_id TwitterAdsCredentials: @@ -4993,25 +5050,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Eos quaerat rem aut fuga. + example: Saepe voluptatem reiciendis pariatur. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Est dolor ut corporis. + example: Et ut quis ut. consumer_key: type: string description: OAuth 1.0a consumer key - example: Nihil corrupti repellat eius. + example: Sit dolor sunt eos nihil ipsam. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Qui nobis et delectus quam. + example: Odio totam cum deleniti placeat fuga. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Pariatur debitis. - access_token_secret: Explicabo possimus consequatur. - consumer_key: Cupiditate ut illo dolor quaerat totam. - consumer_secret: Illo vitae occaecati omnis. + access_token: Aut autem sint minus voluptatum. + access_token_secret: Tempore quae. + consumer_key: Iusto omnis. + consumer_secret: Quia cum non. required: - consumer_key - consumer_secret diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index 70d86339..819d47c6 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et eum ex doloremque quia."},"example":"Eum itaque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Architecto voluptas ratione delectus ut adipisci.","event_details":"Quas qui mollitia perferendis eveniet voluptas est.","event_slug":"Ullam tenetur quia totam magni sunt repellat.","id":"A quos a sed exercitationem ut.","keywords":"Temporibus aliquam animi unde.","platforms":["Quo eum dignissimos iure.","Ea quis."],"program_type":"Doloremque itaque eius magni autem.","project_id":"Ut minus in nemo perspiciatis et qui.","status":"draft","targeting":"Ut est nobis aspernatur.","url":"Ex tempore.","version":1756394405346388080}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aperiam et ab."},"example":"Tempore vel quia cum."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Recusandae recusandae est et fuga veniam natus."},"example":"Et iusto doloremque odio."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsum expedita animi."},"example":"Ratione est omnis voluptas praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolorum excepturi quibusdam.","event_details":"Enim magnam eius voluptas voluptatibus deleniti.","event_slug":"Hic vero et.","id":"Voluptas et accusamus quia et officiis ipsum.","keywords":"Amet iusto provident sequi est.","platforms":["Aspernatur qui quidem est eligendi.","Non accusantium quis architecto."],"program_type":"Incidunt ipsum est perspiciatis soluta voluptas est.","project_id":"Explicabo cupiditate rerum.","status":"draft","targeting":"Quaerat ea accusantium.","url":"Ut ea alias.","version":4496268214732198365}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aspernatur voluptatum facilis."},"example":"Laboriosam et."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Veniam maiores dolorum sit et.","event_details":"Dolor ut.","event_slug":"Et assumenda recusandae.","id":"Saepe pariatur.","keywords":"Porro sed minus illo rerum ut.","platforms":["Id incidunt qui et ratione sit quaerat.","Ipsum quia ad a.","Veritatis omnis excepturi.","Et pariatur molestias autem."],"program_type":"Soluta alias natus aut eligendi ea.","project_id":"Est quaerat id qui repudiandae.","status":"draft","targeting":"Totam sequi.","url":"Sint eveniet dicta numquam doloremque ab cumque.","version":4401871562627166296}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Earum debitis."},"example":"Perspiciatis dolor pariatur quae amet."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Occaecati quam nostrum quis."},"example":"Maxime temporibus earum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Blanditiis et qui est dolorem eos.","event_details":"Modi sed.","event_slug":"Eligendi earum qui est et id laudantium.","id":"Sed ea.","keywords":"Dolorem sed atque.","platforms":["Veritatis harum ab nobis.","Atque inventore fugiat aut laboriosam maxime facere."],"program_type":"Et tempore.","project_id":"Ut nihil quo tenetur doloribus fugiat natus.","status":"archived","targeting":"Provident id quia porro rerum.","url":"Ratione incidunt est saepe.","version":2165165569618896837}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Qui minus sit necessitatibus."},"example":"Aut est et."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Id ducimus eius et laboriosam omnis vitae.","platforms":["Non voluptas ut enim.","Rerum sint optio."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Debitis ea molestiae eum voluptatum."},"example":"Illo eveniet."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur nemo molestiae modi ut non atque."},"example":"Sed commodi voluptatibus."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ut consectetur.","campaign_name":"Est qui molestiae rerum adipisci minima quibusdam.","id":"Hic voluptas debitis error.","platform":"Commodi quam voluptates.","platform_campaign_id":"Optio dolorem omnis.","project_id":"Veniam eum ut libero quibusdam debitis.","status":"Accusantium sunt culpa libero quisquam.","version":6082718548704928320}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Aut molestias aut excepturi cumque."},"example":"Esse voluptate non autem."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut hic distinctio non recusandae et qui."},"example":"Totam unde."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Enim ea.","campaign_name":"Totam sapiente vitae numquam ut nesciunt voluptas.","id":"Necessitatibus expedita.","platform":"Asperiores et.","platform_campaign_id":"Laboriosam quis facere.","project_id":"Beatae autem autem.","status":"Exercitationem consectetur.","version":6868385032394830606}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ut nostrum officiis et accusamus provident."},"example":"Rerum reiciendis similique."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit ut repellat voluptas."},"example":"Repudiandae odit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ut laborum nostrum veniam qui rerum.","has_credentials":true,"id":"Aut ratione sunt nostrum tenetur.","label":"Fugit enim et sint consectetur ea minus.","login_customer_id":"Magnam ut et ab.","project_id":"Dolorem cum.","status":"active","version":5799897036572741099}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sapiente ut sit quod.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quo omnis et et molestiae dolorum."},"example":"Consequatur iste eum amet vel impedit et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Deleniti itaque voluptas magnam.","brand_kit":"Dolor id.","has_credentials":false,"id":"Dolorem sapiente.","label":"Sint autem.","portal_id":"Vitae optio ut et consequuntur.","project_id":"Aut natus.","sender_email":"Libero autem ut.","sender_name":"Debitis soluta sed quod dicta aperiam eveniet.","status":"error","version":7443019901611180865}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Architecto ab et libero ea aut."},"example":"Corrupti aut earum rerum ducimus dicta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Qui et.","brand_kit":"Porro ea cum et magni adipisci.","has_credentials":false,"id":"Ad esse neque earum modi.","label":"Ab voluptatem esse.","portal_id":"Aut culpa impedit sit quibusdam nulla adipisci.","project_id":"Quis possimus placeat.","sender_email":"Dolorem molestias natus velit.","sender_name":"Non dolorum odit est.","status":"active","version":8186374755967651666}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et rerum repudiandae et at iusto."},"example":"Voluptas esse qui quisquam quae est magni."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Ut aut.","brand_kit":"Ut voluptas et accusamus natus.","has_credentials":false,"id":"Saepe rerum sunt eum et qui aut.","label":"Voluptas expedita omnis ex.","portal_id":"Minima ut quasi voluptatum officia quod error.","project_id":"Ut quia harum.","sender_email":"Quia inventore est quia enim illo.","sender_name":"Eligendi aperiam.","status":"error","version":9020823344753101103}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et officia sequi et quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur sint et vel molestiae."},"example":"Natus pariatur et et sed debitis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate est illo repellat et cum repellat."},"example":"Facilis repellat eveniet reiciendis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Nobis ipsam.","label":"Velit sapiente qui iusto quis magni et.","org_id":"Officiis deleniti ipsam nam.","project_id":"Aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quaerat iure ipsam."},"example":"Minima adipisci aut quia quisquam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Minus voluptas asperiores debitis labore aut.","has_credentials":true,"id":"Enim consequatur id voluptatem adipisci alias.","label":"Tempora ipsum aut enim harum.","org_id":"Necessitatibus consequatur natus tempora ut.","project_id":"Sequi consequatur dolorum sint voluptatem voluptas omnis.","status":"error","version":7443611122231905788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Nihil ad hic repellendus nobis voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Asperiores ipsum quam.","app_id":"Cum rem architecto vel quibusdam vel autem.","has_credentials":false,"id":"Non praesentium voluptas saepe sit.","label":"Reiciendis qui id tenetur exercitationem aperiam incidunt.","page_id":"Qui suscipit rerum quo eligendi tempora.","project_id":"Sed qui.","status":"active","version":5968285761891001183}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia facilis sit."},"example":"Possimus accusantium expedita alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ratione quis.","app_id":"Aut assumenda unde occaecati eum tenetur nam.","has_credentials":true,"id":"Voluptatibus qui cupiditate voluptatem.","label":"Ut in possimus quia nulla.","page_id":"Vel consequatur ea deserunt.","project_id":"Et corporis officia sint.","status":"error","version":935673982343451083}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit harum ipsa et."},"example":"Commodi et nihil et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Aliquid ducimus quia.","app_id":"Quas tenetur velit quaerat aut.","has_credentials":true,"id":"Hic delectus.","label":"Quibusdam aliquam consequuntur.","page_id":"Aut odio iste assumenda deleniti earum magni.","project_id":"Maxime ut possimus expedita.","status":"inactive","version":7469982570284737303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et quo.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Amet qui provident."},"example":"Ut ea."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","customer_id":"Est aut labore sint natus.","has_credentials":false,"id":"Vero quis consequuntur.","label":"Ut fugiat magnam quia.","project_id":"Quis quo illum cum quod.","status":"active","version":343208040254291221}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum laboriosam dignissimos reiciendis et quisquam."},"example":"Deserunt reiciendis dolorem totam voluptatem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Autem aspernatur ea voluptatem.","customer_id":"Accusantium aspernatur facere tempora voluptatem dicta rerum.","has_credentials":true,"id":"Eos explicabo non quidem.","label":"Nam voluptas sed et doloremque reiciendis pariatur.","project_id":"Debitis itaque itaque dolores nihil.","status":"deleted","version":8497111294039610948}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laudantium doloremque aut eligendi perferendis aut."},"example":"Consectetur delectus libero id."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"In expedita.","customer_id":"Magni ducimus nulla suscipit sed minus soluta.","has_credentials":false,"id":"Iste voluptatem et voluptatem ut ut.","label":"Quia sed omnis quaerat aut.","project_id":"Nostrum laborum minima.","status":"error","version":7283482467977491974}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed maiores qui sed exercitationem quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed ipsam enim esse iure est."},"example":"Aut sunt ex et autem delectus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Ipsam temporibus sint et necessitatibus dolorem ut.","has_credentials":true,"id":"Quidem illo numquam doloremque et.","label":"Fugiat adipisci eos rerum.","project_id":"Perferendis ut quia aut.","status":"active","version":1442766184420227830}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem omnis aspernatur veritatis adipisci."},"example":"Voluptas ipsam iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Asperiores velit enim tempore expedita ut.","has_credentials":false,"id":"Sapiente et et itaque dolores in.","label":"Consequatur nihil explicabo vero commodi est.","project_id":"Rem dolores eligendi ea.","status":"deleted","version":2256150830368172012}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Adipisci omnis veritatis omnis praesentium omnis."},"example":"Natus aliquam aut quas aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Architecto unde rerum quisquam ut.","has_credentials":true,"id":"Veniam debitis aut similique ullam temporibus qui.","label":"Voluptates neque expedita.","project_id":"Sit iusto.","status":"deleted","version":2250019048790832853}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Repellendus sint.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam voluptatibus nihil."},"example":"Voluptas consequatur iusto nostrum pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Numquam quia.","funding_instrument_id":"Autem provident est.","has_credentials":true,"id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Sit ex commodi sapiente a illum.","project_id":"Pariatur voluptas odit fuga illo.","status":"active","version":4562568070495708080}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Saepe non tempore."},"example":"Tempore qui est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","funding_instrument_id":"Accusamus ratione consequuntur aut et corrupti.","has_credentials":false,"id":"Beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laborum ut magnam aut illum commodi placeat."},"example":"Voluptas libero pariatur ut qui sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Odio adipisci dolore iste ipsa.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsa sint optio nobis quae corporis."},"example":"Et iste."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Veniam et.","job_id":"Iure modi asperiores ut.","result":"Autem voluptates iste.","status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Eaque ut laudantium nostrum ratione."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non iusto odit consequatur in vero soluta."},"event_details":{"description":"Extracted event/course details","example":"Laboriosam nostrum quos expedita voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"keywords":{"description":"Keyword list","example":"Eius laborum."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Voluptate itaque fugit rerum cumque."},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7582961521318439491,"format":"int64"}},"example":{"copy":"Ut ut odio odio sed minus quia.","etag":"Itaque omnis ut.","event_details":"Nihil sunt doloremque.","event_slug":"Porro ut et cupiditate.","id":"Eius dicta.","keywords":"Ea architecto autem iste.","platforms":["Necessitatibus dolorem enim beatae.","Minus vero at ut quis.","Molestiae aut fugit alias.","Qui maiores quia non unde deserunt."],"program_type":"Non assumenda perspiciatis.","project_id":"Ullam distinctio dolore velit.","status":"draft","targeting":"In ipsa tempore incidunt velit provident perspiciatis.","url":"Ea ullam minima voluptatem vel deleniti.","version":1281384136826250351},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quod enim pariatur et occaecati veritatis voluptatem."},"event_details":{"description":"Extracted event/course details","example":"Iure enim dolore est."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"keywords":{"description":"Keyword list","example":"Architecto aliquam mollitia labore sapiente dolores tenetur."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Accusamus qui."},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1931126915939314041,"format":"int64"}},"example":{"copy":"Necessitatibus sit.","event_details":"Sit dignissimos incidunt voluptas.","event_slug":"Reiciendis enim.","id":"Mollitia ea.","keywords":"Quis aperiam deserunt nostrum consectetur et sed.","platforms":["Nemo nihil dolorum consequatur sed tempora qui.","Hic vel aspernatur at quam est ea."],"program_type":"Ad quae nisi.","project_id":"Et amet sunt.","status":"approved","targeting":"Libero blanditiis.","url":"Cum et ab ipsum.","version":1441686313140477581},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Praesentium et."},"event_details":{"description":"Extracted event/course details","example":"Dolor consectetur eos iste."},"event_slug":{"type":"string","description":"Event/course slug","example":"Dolores laborum sed."},"id":{"type":"string","description":"Brief UUID","example":"Nulla sunt autem eos rerum provident dicta."},"keywords":{"description":"Keyword list","example":"Veniam iusto consequatur quia sed officia eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"Est quis impedit."},"description":"Suggested default platforms","example":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."]},"program_type":{"type":"string","description":"Funnel context","example":"Commodi odio sunt esse mollitia incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem voluptate dolor dolores provident."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Qui impedit."},"url":{"type":"string","description":"Event/course page URL","example":"Veritatis itaque."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1624749011573187666,"format":"int64"}},"example":{"copy":"Amet quaerat modi.","event_details":"Velit quis harum recusandae est ipsum.","event_slug":"Quo necessitatibus necessitatibus.","id":"Minus reprehenderit dignissimos aut velit.","keywords":"Eum totam voluptatem eos.","platforms":["Voluptatem rerum praesentium voluptatem blanditiis non.","Temporibus in repudiandae tenetur.","Saepe vel aut animi sit esse ratione.","Blanditiis laborum est quasi dignissimos."],"program_type":"Repellendus omnis doloribus amet cum.","project_id":"At sint laborum veniam.","status":"approved","targeting":"Sint exercitationem.","url":"Sint dicta.","version":6296331077615132388},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Placeat dolores numquam molestias quibusdam aliquid."},"event_details":{"description":"Extracted event/course details","example":"Et itaque ut dolores in voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Autem quo tempora voluptate fuga."},"id":{"type":"string","description":"Brief UUID","example":"Sit in quia molestiae perspiciatis alias et."},"keywords":{"description":"Keyword list","example":"Fuga est aliquam debitis."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum cum eaque nesciunt est totam inventore."},"description":"Suggested default platforms","example":["Ipsam aut vel.","Eos reiciendis.","Minima non."]},"program_type":{"type":"string","description":"Funnel context","example":"Libero et consequuntur suscipit distinctio pariatur mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Ex molestiae praesentium."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Deleniti est natus sequi beatae consectetur."},"url":{"type":"string","description":"Event/course page URL","example":"Distinctio maiores mollitia aut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7075859053648216976,"format":"int64"}},"example":{"copy":"Distinctio tempore qui velit omnis dolorem est.","event_details":"Voluptatibus nihil nisi.","event_slug":"Est molestiae voluptates ipsum neque sapiente aliquid.","id":"Et quis consequatur dolores repellat nostrum similique.","keywords":"Quia recusandae dignissimos dolore harum totam.","platforms":["Nobis hic eos magni eos voluptatem.","Hic ut sapiente harum aliquam sunt eum.","Eaque occaecati."],"program_type":"Minima aut fugit eos et iure laudantium.","project_id":"Iste aliquid.","status":"draft","targeting":"Vitae illo consequuntur esse.","url":"Velit sunt molestiae eius.","version":7533657070215672415},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Et provident illo non quisquam iure doloremque."},"event_details":{"description":"Extracted event/course details","example":"Est et magni."},"event_slug":{"type":"string","description":"Event/course slug","example":"Voluptatem ipsa."},"id":{"type":"string","description":"Brief UUID","example":"Ut ullam aliquam dolore iure consequatur."},"keywords":{"description":"Keyword list","example":"Ut aliquid."},"platforms":{"type":"array","items":{"type":"string","example":"Tempora est eveniet sequi ea."},"description":"Suggested default platforms","example":["Consequatur possimus.","Assumenda sit delectus veniam."]},"program_type":{"type":"string","description":"Funnel context","example":"Quia labore non ut dolores et."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum iste nemo fugiat sunt deleniti officia."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Repellendus eveniet veritatis impedit aut iste earum."},"url":{"type":"string","description":"Event/course page URL","example":"Assumenda excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2088061558739708952,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Quis odio enim nam id voluptatem.","id":"Accusamus pariatur saepe.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Eaque suscipit harum sint neque quia fuga.","Veniam itaque optio consequatur nulla sint."],"program_type":"Laboriosam sunt quis omnis animi.","project_id":"Qui et.","status":"approved","targeting":"Cupiditate aut.","url":"Vero alias temporibus illum.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Facere qui omnis."},"campaign_name":{"type":"string","description":"Campaign name","example":"Dolores natus a sint quod sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa non."},"id":{"type":"string","description":"Campaign UUID","example":"Et itaque rem eos et deleniti dolores."},"platform":{"type":"string","description":"Channel","example":"Enim vitae officia dolorem odio."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Beatae quia qui excepturi minima."},"project_id":{"type":"string","description":"Owning project","example":"Facilis qui libero."},"status":{"type":"string","description":"Campaign status","example":"Et nesciunt iure quis in ut mollitia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9203456138223090094,"format":"int64"}},"example":{"brief_id":"Dolores sit.","campaign_name":"Amet omnis.","etag":"Sit cupiditate non.","id":"Necessitatibus quibusdam.","platform":"Exercitationem accusantium nihil.","platform_campaign_id":"Quod alias ipsum voluptates pariatur magni.","project_id":"Est accusantium laudantium nostrum.","status":"At fugit dolor.","version":6873369027351486557},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quaerat et eius culpa magni illum consequatur."},"campaign_name":{"type":"string","description":"Campaign name","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"id":{"type":"string","description":"Campaign UUID","example":"Minima iure quos enim occaecati beatae."},"platform":{"type":"string","description":"Channel","example":"Soluta dolore vitae."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"In commodi et asperiores et."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Campaign status","example":"Assumenda voluptatem aut debitis vitae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":529135087014785401,"format":"int64"}},"example":{"brief_id":"Et et itaque qui repudiandae magnam.","campaign_name":"Quaerat molestias.","id":"Eos eius.","platform":"Ullam qui rerum numquam quo.","platform_campaign_id":"A quia magnam culpa ipsam totam.","project_id":"Odit rerum commodi ea et.","status":"Sequi aut veniam ratione.","version":4528974556497386277},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quo et enim totam et minima dolorem."},"campaign_name":{"type":"string","description":"Campaign name","example":"In praesentium cumque."},"id":{"type":"string","description":"Campaign UUID","example":"Omnis ad voluptas esse voluptates."},"platform":{"type":"string","description":"Channel","example":"Est tempora qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Voluptas necessitatibus cumque non porro qui molestias."},"project_id":{"type":"string","description":"Owning project","example":"Cumque mollitia."},"status":{"type":"string","description":"Campaign status","example":"Pariatur odio molestias voluptatum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7642665711405677689,"format":"int64"}},"example":{"brief_id":"Qui omnis nesciunt qui consequuntur.","campaign_name":"Odit provident sed quo aperiam.","id":"Perferendis possimus deserunt iure et.","platform":"Fuga atque.","platform_campaign_id":"Sequi culpa.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"Aspernatur nihil et incidunt dolorem dolor sed.","version":7197986407230546835},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Voluptatum veniam molestiae."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","twitter-ads"]}},"example":{"config":"Aspernatur voluptatem nobis.","platforms":["google-ads","meta-ads","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Modi possimus consequatur."},"config":{"description":"Campaign configuration snapshot","example":"Voluptatibus aspernatur."},"status":{"type":"string","description":"Campaign status","example":"Eveniet esse officia explicabo dolor deserunt."}},"example":{"campaign_name":"Accusamus nam cupiditate.","config":"Earum minus autem omnis qui debitis eum.","status":"Hic vel ut."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Veniam dolores quidem necessitatibus."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Sit reiciendis et vel beatae molestiae.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic est quia pariatur odit ullam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed quo perferendis nemo ut quisquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Quod impedit accusamus incidunt minus veritatis enim."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Repellendus quos magnam."},"project_id":{"type":"string","description":"Owning project","example":"Vel inventore aliquid aut non eligendi accusamus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2175885598856983154,"format":"int64"}},"example":{"account_id":"Quae qui inventore dolorem deserunt.","etag":"Rerum sint.","has_credentials":true,"id":"In id voluptatem nihil quaerat.","label":"Hic rerum accusamus velit error.","login_customer_id":"Magnam adipisci architecto deserunt.","project_id":"Pariatur repellat vel.","status":"active","version":1017420418363680400},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem maxime hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Harum voluptates sit est corporis."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus ut necessitatibus in."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Amet hic est."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem repellat expedita inventore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7828959688196597051,"format":"int64"}},"example":{"account_id":"Libero autem quod saepe ullam ipsum.","has_credentials":false,"id":"Quaerat occaecati rerum.","label":"Aspernatur quos est magnam voluptates.","login_customer_id":"Dolore sed.","project_id":"Quae esse mollitia et dolorum.","status":"error","version":3252068377050447352},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","login_customer_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","login_customer_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sed corrupti sit."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Labore quia esse consectetur tenetur eum."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut sit nisi architecto."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Natus vitae consequatur eos sit aut ut."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Praesentium voluptate.","client_secret":"Qui impedit temporibus eveniet eos omnis cumque.","developer_token":"Ipsam ut sed natus et unde.","refresh_token":"Rerum et recusandae possimus quis."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Atque qui dignissimos aut eaque eveniet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Odit numquam quia."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Aut dolores."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptatem beatae quis dignissimos voluptatem et labore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Modi vel aut rerum.","brand_kit":"Dolor eum et consequatur.","has_credentials":false,"id":"Ut unde dolore id.","label":"Ad optio magnam sequi esse.","portal_id":"Assumenda cum nemo esse nobis.","project_id":"Necessitatibus fuga ducimus dolorem ut aspernatur.","sender_email":"Aut dolorem ea veniam.","sender_name":"Quae adipisci doloribus ullam.","status":"deleted","version":9002316743787506494},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"At magnam saepe incidunt nisi est."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Deleniti non in iure dolores et quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio enim nisi doloremque rerum sed consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus non aliquid qui."},"project_id":{"type":"string","description":"Owning project","example":"Quia amet vero dolorum incidunt officia nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Neque sed alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Id ducimus excepturi est et est."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6047270410556243251,"format":"int64"}},"example":{"account_id":"Corrupti sint molestiae occaecati est.","brand_kit":"Nesciunt sed magnam sed vero nulla.","has_credentials":true,"id":"Recusandae similique assumenda ut quia.","label":"Nam eius nulla suscipit ullam.","portal_id":"Ratione nobis ut occaecati tenetur minima veritatis.","project_id":"Nesciunt minus natus non.","sender_email":"Impedit laborum quaerat qui ut ut qui.","sender_name":"Explicabo dolorem totam non.","status":"error","version":9169545032565251193},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sunt labore voluptate."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Beatae non et excepturi sit minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel et et iure tempora."},"label":{"type":"string","description":"Optional friendly name","example":"Eum ut."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus saepe quam culpa qui."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatum perspiciatis autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Ipsa molestias."},"sender_name":{"type":"string","description":"Default sender name","example":"Nam debitis hic qui consequatur laborum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2692133725202625638,"format":"int64"}},"example":{"account_id":"Aspernatur ipsam consequatur qui illo totam fuga.","brand_kit":"Libero quia quam harum molestiae cupiditate.","has_credentials":true,"id":"Et quisquam dicta.","label":"Aut tempora dolorem neque assumenda sed.","portal_id":"Consequatur sint.","project_id":"Eaque enim est libero enim quo.","sender_email":"Non illum expedita commodi in dolores nemo.","sender_name":"Eaque autem impedit tenetur voluptatibus.","status":"inactive","version":6362542183217834869},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Odit odio praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"Sint voluptatibus quam dicta voluptate consequuntur."},"description":"Platforms this job will create on","example":["Qui temporibus quis iste eaque.","Debitis nam.","Delectus ex aut quia."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur dolore dolor corporis consequatur voluptatem voluptates.","platforms":["Repudiandae sit qui aut aut.","Magnam quisquam et consequuntur ut sunt.","Et velit fuga quos est."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fugiat aut dicta libero."},"job_id":{"type":"string","description":"Job UUID","example":"Officiis beatae sed aut."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Est quia qui fugiat est itaque."},"status":{"type":"string","description":"Job status","example":"succeeded","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Beatae harum similique corporis id eum.","job_id":"Culpa est possimus dolores dignissimos.","result":"Laudantium error eum et aut.","status":"partial"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Omnis corrupti facere eum aliquid est repellat."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt mollitia non sed hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ex ipsa nihil esse voluptate in consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Sed voluptatum et impedit quod rem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Est distinctio accusamus a perferendis."},"project_id":{"type":"string","description":"Owning project","example":"Culpa quaerat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6865823349289112261,"format":"int64"}},"example":{"account_id":"Velit quis.","etag":"Vel architecto quae error dolor placeat.","has_credentials":true,"id":"Voluptatem nostrum.","label":"Ut nobis.","org_id":"Minus et.","project_id":"Deleniti voluptas quo nostrum quia.","status":"inactive","version":7197135224651925465},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Autem eaque eaque dicta ut magni.","has_credentials":true,"id":"In vel.","label":"Et vel dolorum aut inventore consequatur.","org_id":"Molestiae qui nobis culpa.","project_id":"Nobis qui sunt laboriosam ipsa.","status":"inactive","version":32502071618905206},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolores dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Temporibus dolorem cumque quis accusantium quia enim."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsum et et laudantium."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Sit est atque qui quaerat qui vitae."},"project_id":{"type":"string","description":"Owning project","example":"Asperiores velit aut alias quod minima."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1323696837483058057,"format":"int64"}},"example":{"account_id":"Consequatur aut vero.","has_credentials":true,"id":"Optio non.","label":"Ipsam eligendi est dolore.","org_id":"Est saepe doloribus unde id.","project_id":"Optio in ratione accusamus quasi.","status":"active","version":4544790407326456577},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptas est consequatur rerum neque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Perspiciatis perferendis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Ea nam aut aut dolores."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Optio quia similique vero est impedit quo."},"project_id":{"type":"string","description":"Owning project","example":"Sapiente sit totam ut et ullam."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5284871868291627638,"format":"int64"}},"example":{"account_id":"Eos deserunt quia expedita sed velit distinctio.","has_credentials":false,"id":"Nihil at.","label":"Sit soluta quia qui.","org_id":"Natus veniam amet.","project_id":"Libero officia et quia.","status":"inactive","version":1537409143960626181},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sint est sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Voluptas dolorem necessitatibus illum.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Ducimus distinctio deserunt quia magni."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Nisi est."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia doloremque commodi rerum."},"app_id":{"type":"string","description":"Meta app ID","example":"Error sit nihil iure officiis nemo."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos non molestias laudantium quia iusto maxime."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam hic quibusdam eveniet."},"label":{"type":"string","description":"Optional friendly name","example":"Veniam et ducimus quos amet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Illum accusamus debitis explicabo praesentium sint."},"project_id":{"type":"string","description":"Owning project","example":"Doloribus voluptas mollitia doloremque totam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4075428576386055706,"format":"int64"}},"example":{"account_id":"Corporis dolorem laborum maiores est ea ducimus.","app_id":"Tenetur ut.","etag":"Quo ullam ad iusto quos.","has_credentials":false,"id":"Molestias ducimus id.","label":"Ex et alias ea asperiores quas.","page_id":"Est placeat explicabo aliquid.","project_id":"Eius aut quo et.","status":"inactive","version":7062935514847310019},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Iure aut tenetur ipsum ea ad ducimus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam voluptatem fuga quia qui."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum vel molestiae id quae vero aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et et."},"project_id":{"type":"string","description":"Owning project","example":"Aut provident suscipit incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8554261525276101559,"format":"int64"}},"example":{"account_id":"Necessitatibus non eum ipsum eveniet quam.","app_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Aut temporibus.","label":"Eligendi non.","page_id":"Voluptatum magnam.","project_id":"Laborum ipsum accusantium voluptatem libero.","status":"error","version":8043832967599792035},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Odit illo ut ut."},"app_id":{"type":"string","description":"Meta app ID","example":"Perspiciatis debitis atque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"In iure molestiae quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Assumenda alias."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam aperiam et totam in."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8618836083038100083,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","app_id":"Ea voluptatum pariatur non.","has_credentials":true,"id":"Unde facilis.","label":"Voluptatem optio.","page_id":"Maiores consequatur.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam recusandae nesciunt et."},"app_id":{"type":"string","description":"Meta app ID","example":"Perferendis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo ullam."},"label":{"type":"string","description":"Optional friendly name","example":"Facilis dolor consectetur sed."},"page_id":{"type":"string","description":"Facebook page ID","example":"Ut ea sequi quos qui quo et."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati hic ut magnam facilis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8315950268383046552,"format":"int64"}},"example":{"account_id":"Non consequuntur qui qui impedit assumenda voluptas.","app_id":"Et nemo dicta illum omnis.","has_credentials":true,"id":"Beatae facilis dolor quod nihil quia.","label":"Recusandae consequatur nulla.","page_id":"Vel ut.","project_id":"Sed voluptas fuga officia nulla.","status":"error","version":8342264622249142271},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Occaecati id ea sunt dolorem necessitatibus neque."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur hic voluptatem."},"page_id":{"type":"string","description":"Facebook page ID","example":"Omnis quidem dolor ipsum voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Ab quasi tempora dolor.","label":"Occaecati earum unde ut.","page_id":"Non eum expedita non voluptas sit voluptatem."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"app_secret":{"type":"string","description":"Meta app secret","example":"Et dolorem quod."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Iusto fugit non asperiores quidem natus.","app_secret":"Nostrum atque illum nesciunt adipisci odit corrupti."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","customer_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","customer_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Doloremque dicta."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ratione impedit recusandae dolor consequatur."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Vel temporibus sunt nulla esse sed."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Rerum eveniet nam sunt.","etag":"Voluptatem quia ab recusandae praesentium nisi.","has_credentials":true,"id":"Hic quos inventore.","label":"Ad dolorem et.","project_id":"Id vel iusto optio repellendus.","status":"deleted","version":4971099885577230620},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium eligendi ut et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Est dolor velit et voluptatem mollitia placeat."},"project_id":{"type":"string","description":"Owning project","example":"Nemo cum delectus laudantium."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7301828793581898625,"format":"int64"}},"example":{"account_id":"Necessitatibus quia facere vitae aperiam velit corrupti.","has_credentials":true,"id":"Iste iusto reiciendis ipsa ut saepe beatae.","label":"Voluptas doloremque nobis consectetur voluptas voluptas.","project_id":"Temporibus in qui provident corrupti ut similique.","status":"deleted","version":8091372322961997197},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus dolore expedita commodi sit omnis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Deserunt minima quis impedit."},"label":{"type":"string","description":"Optional friendly name","example":"Aut et ut dolorem tempore."},"project_id":{"type":"string","description":"Owning project","example":"In voluptate debitis earum voluptates repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4154692188906674111,"format":"int64"}},"example":{"account_id":"Pariatur esse.","has_credentials":false,"id":"Quo porro.","label":"Molestias reprehenderit.","project_id":"Accusantium est.","status":"error","version":1321629448594002998},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere ut voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ab ea pariatur deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Repellat sequi sed qui dolor."},"project_id":{"type":"string","description":"Owning project","example":"Rem molestiae assumenda ea incidunt."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","has_credentials":false,"id":"Rerum maiores in alias est laboriosam saepe.","label":"Eaque magni omnis dolorem.","project_id":"Perferendis placeat earum occaecati et.","status":"inactive","version":7088601354925466349},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Et neque soluta."}},"example":{"account_id":"t2_gv9wtbfa","label":"Voluptas aliquid libero sapiente aspernatur fugit eum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quo vel iste aut cum voluptatem."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et et aperiam."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas quis nihil tempora rem asperiores."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Vero natus voluptatem.","client_secret":"Et minima.","refresh_token":"Quas qui aut rerum illum vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dicta qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur voluptate dolorum id ut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Id adipisci."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"project_id":{"type":"string","description":"Owning project","example":"Minima vitae illo cumque optio impedit."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6671950557225375758,"format":"int64"}},"example":{"account_id":"Vitae nemo sint et consequatur vel quisquam.","etag":"Sint possimus.","funding_instrument_id":"Dolorem neque hic voluptatem ad similique sunt.","has_credentials":true,"id":"Aut rerum non assumenda molestiae modi.","label":"Voluptatibus assumenda mollitia molestias eos.","project_id":"Vitae molestiae itaque autem.","status":"error","version":3850958169697422368},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam numquam et natus possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Provident molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Quas quia quam voluptate nam iste.","funding_instrument_id":"Temporibus aut numquam.","has_credentials":true,"id":"Non laudantium quis ab non sunt.","label":"Beatae totam.","project_id":"Quo est.","status":"active","version":1807846651493588341},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed dolorum cupiditate quia qui dicta."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quae totam et voluptates atque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Accusantium ut vitae dolor soluta beatae."},"label":{"type":"string","description":"Optional friendly name","example":"Molestiae veniam exercitationem blanditiis ratione non."},"project_id":{"type":"string","description":"Owning project","example":"Enim velit voluptates officiis tempora possimus rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2489572558350094249,"format":"int64"}},"example":{"account_id":"Adipisci minus et vero.","funding_instrument_id":"Occaecati incidunt deleniti sunt dolorem ea.","has_credentials":false,"id":"Voluptates ab quos provident magni et.","label":"Et culpa culpa veritatis.","project_id":"Reprehenderit officiis modi quae consequatur.","status":"inactive","version":8208341011850859357},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Cumque perspiciatis quam."},"label":{"type":"string","description":"Optional friendly name","example":"Iste numquam optio possimus velit."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Eveniet quia voluptatem impedit cumque doloribus.","label":"Possimus ipsam perspiciatis enim id."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Ullam consequatur ut eveniet tempore est."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iusto fugiat ad et."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Magni odio aut omnis vel."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Iure ducimus voluptatem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Necessitatibus tempore rem quo.","access_token_secret":"Accusantium voluptas ratione dignissimos esse et labore.","consumer_key":"Magnam cum veritatis mollitia vel velit.","consumer_secret":"Eum perferendis qui qui soluta repudiandae quae."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Ut temporibus aliquam animi unde.","event_details":"Et architecto voluptas ratione delectus ut.","event_slug":"Magni autem.","id":"Laboriosam tempore vero voluptatum a quos.","keywords":"Ut est nobis aspernatur.","platforms":["Tempore nihil quos.","Eum dignissimos iure praesentium ea.","Quis quas qui mollitia perferendis eveniet voluptas."],"program_type":"Nemo perspiciatis et qui aliquam doloremque itaque.","project_id":"Sed exercitationem ut totam ut minus.","status":"draft","targeting":"Fugit qui tempora commodi reiciendis sit alias.","url":"Ullam tenetur quia totam magni sunt repellat.","version":958049424855577225}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sit ut repellat voluptas."},"example":"Eligendi consequatur officia labore eos."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Quaerat ea accusantium.","event_details":"Amet iusto provident sequi est.","event_slug":"Ut ea alias.","id":"Explicabo cupiditate rerum.","keywords":"Voluptatem iure vero.","platforms":["Accusantium quis architecto.","Enim magnam eius voluptas voluptatibus deleniti.","Dolorum excepturi quibusdam."],"program_type":"Hic vero et.","project_id":"Incidunt ipsum est perspiciatis soluta voluptas est.","status":"draft","targeting":"Consequatur neque tempore voluptatibus quo quod nesciunt.","url":"Nam aspernatur qui quidem est eligendi.","version":7881322722259816896}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Exercitationem officia corrupti tempora ea."},"example":"Totam unde."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa sint optio nobis quae corporis."},"example":"Voluptas ut nostrum officiis et accusamus provident."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Rerum ut culpa totam sequi sit.","event_details":"Sit et quod porro sed minus.","event_slug":"Et ratione sit.","id":"Et assumenda recusandae.","keywords":"Excepturi dolor labore.","platforms":["Omnis veritatis omnis.","Officia et pariatur molestias autem ratione.","Ut et veniam maiores."],"program_type":"Totam id incidunt.","project_id":"Sint eveniet dicta numquam doloremque ab cumque.","status":"draft","targeting":"Iusto dolores.","url":"Sed ipsum quia.","version":7723389563281978281}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Odio eos earum fuga non est."},"example":"Rerum reiciendis similique."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Sint qui praesentium ea praesentium magni.","event_details":"Consequuntur neque mollitia quia.","event_slug":"Tempora veritatis harum ab nobis fuga atque.","id":"Et tempore.","keywords":"Iure dolore et et aut nam.","platforms":["Blanditiis et qui est dolorem eos.","Dolorem sed atque.","Provident id quia porro rerum.","Quo aliquid nobis."],"program_type":"Ratione incidunt est saepe.","project_id":"Eligendi earum qui est et id laudantium.","status":"archived","targeting":"Voluptates odit consequatur quis.","url":"Fugiat aut laboriosam maxime facere culpa modi.","version":317664992246136086}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Repudiandae odit."},"example":"Cupiditate est illo repellat et cum repellat."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Rerum sint optio.","platforms":["Quos tempora dolorem dolor fugiat quia.","Exercitationem rerum iste ducimus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Temporibus ipsum necessitatibus ratione possimus."},"example":"Facilis repellat eveniet reiciendis."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur sint et vel molestiae."},"example":"Non placeat."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Est qui molestiae rerum adipisci minima quibusdam.","campaign_name":"Harum distinctio reiciendis architecto atque maxime soluta.","id":"Commodi quam voluptates.","platform":"Accusantium sunt culpa libero quisquam.","platform_campaign_id":"Rerum amet aut tempora recusandae aspernatur.","project_id":"Optio dolorem omnis.","status":"Ducimus porro maxime.","version":5829797402937558935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Minima adipisci aut quia quisquam."},"example":"Quia facilis sit."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Magnam nihil qui doloremque nam magnam aliquid."},"example":"Possimus accusantium expedita alias."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Exercitationem consectetur.","campaign_name":"Modi asperiores ut libero vel.","id":"Laboriosam quis facere.","platform":"Nesciunt necessitatibus ex ea ullam corrupti sunt.","platform_campaign_id":"Omnis accusantium ad.","project_id":"Totam sapiente vitae numquam ut nesciunt voluptas.","status":"Voluptates iste autem veniam et enim unde.","version":1765361339666375563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis sapiente ut sit quod.","has_credentials":true,"id":"Ea minus enim ut.","label":"Magnam ut et ab.","login_customer_id":"Quae nihil magni.","project_id":"Nostrum veniam qui rerum ipsum eum fugit.","status":"error","version":7243034772713915274}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Magni et rerum sed voluptatum.","has_credentials":false,"id":"Veniam velit sequi sit impedit dolorum voluptas.","label":"Enim est occaecati sed non dolorem distinctio.","login_customer_id":"Nostrum tenetur repellendus.","project_id":"Ipsum quaerat delectus cupiditate sit et.","status":"deleted","version":5181448788196437025}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut sunt ex et autem delectus."},"example":"Occaecati placeat et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Laudantium expedita ut ipsum id commodi nobis.","label":"Velit sapiente qui iusto quis magni et.","login_customer_id":"Officiis deleniti ipsam nam.","project_id":"Vitae aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aut id molestiae sit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem quia."},"example":"Adipisci consectetur ut modi quo et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non ut voluptas et accusamus natus id.","brand_kit":"Eos voluptatibus.","has_credentials":true,"id":"Sit similique ut minima ut.","label":"Quia enim illo et eligendi.","portal_id":"Et quam architecto vero.","project_id":"Voluptatum officia quod error amet quia inventore.","sender_email":"Vero labore laudantium maiores.","sender_name":"Reiciendis dignissimos consequatur iste qui minima.","status":"deleted","version":4350724330275405551}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure ut."},"example":"Minus id deleniti."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Debitis soluta sed quod dicta aperiam eveniet.","brand_kit":"Voluptas expedita omnis ex.","has_credentials":true,"id":"Deleniti itaque voluptas magnam.","label":"Consequuntur sit libero autem ut.","portal_id":"Accusantium sequi modi corrupti esse mollitia.","project_id":"Voluptatem modi velit vitae optio ut.","sender_email":"Saepe rerum sunt eum et qui aut.","sender_name":"Ut quia harum.","status":"error","version":6360555217771164808}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum autem quia quis soluta nostrum cumque."},"example":"Quia velit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Autem recusandae totam.","brand_kit":"Similique deserunt iusto.","has_credentials":true,"id":"Ex delectus.","label":"Officia quidem non qui voluptates natus cum.","portal_id":"Odit necessitatibus veritatis amet ut rerum quidem.","project_id":"Voluptas ullam dolores rem.","sender_email":"Iusto velit quo voluptatibus modi reiciendis aliquam.","sender_name":"Quidem explicabo expedita sunt.","status":"active","version":3951189417473657674}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aspernatur possimus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore qui est."},"example":"Provident saepe aliquam architecto non vero."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Accusamus vero et voluptas accusamus sunt.","has_credentials":true,"id":"Minus voluptas asperiores debitis labore aut.","label":"Distinctio ipsa nihil ad hic repellendus nobis.","org_id":"Vel blanditiis sunt ut facere.","project_id":"Porro ab id necessitatibus consequatur natus tempora.","status":"error","version":4876542408988375571}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus aliquam aut quas aliquid."},"example":"Praesentium beatae quis ut eius."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Facere harum enim consequatur id voluptatem.","has_credentials":true,"id":"Ducimus sequi.","label":"Quia tenetur ducimus.","org_id":"Consequatur dolorum sint voluptatem voluptas omnis est.","project_id":"Autem ab voluptas culpa.","status":"active","version":4064850428710517856}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas consequatur iusto nostrum pariatur."},"example":"Quidem minus pariatur praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Et corporis officia sint.","has_credentials":false,"id":"Consequatur omnis quidem est non tenetur.","label":"Voluptatibus qui cupiditate voluptatem.","org_id":"Quia nulla autem ratione.","project_id":"Deleniti dolores commodi.","status":"error","version":874315130556833044}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Qui esse."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Mollitia a magni vel consequatur ea deserunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Deserunt reiciendis dolorem totam voluptatem."},"example":"Repudiandae molestias est consectetur porro quo pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Aut et.","app_id":"Quia laboriosam magnam unde hic.","has_credentials":false,"id":"Facilis facilis aut suscipit aut odio iste.","label":"Tenetur velit quaerat aut.","page_id":"Distinctio ea totam rem harum provident.","project_id":"Deleniti earum magni quibusdam.","status":"deleted","version":5896744453366252956}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas libero pariatur ut qui sint."},"example":"Quasi esse corporis molestiae excepturi suscipit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quibusdam vel autem modi id facere.","app_id":"Possimus expedita qui.","has_credentials":true,"id":"Eius voluptatem molestiae qui suscipit rerum.","label":"Rem architecto.","page_id":"Et maxime.","project_id":"Eligendi tempora quos.","status":"deleted","version":8688592599556109682}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut ea."},"example":"Aliquam eum molestiae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Vero commodi est qui asperiores velit enim.","app_id":"Architecto dicta.","has_credentials":true,"id":"Atque rerum et officiis sapiente et et.","label":"Eligendi ea vel consequatur nihil.","page_id":"Ut est recusandae aspernatur eum fugit voluptas.","project_id":"Dolores in hic rem.","status":"deleted","version":2446786767075191046}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Numquam doloremque et qui perferendis ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis iusto molestias itaque."},"example":"Fugit et soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Doloremque architecto ea et.","customer_id":"Exercitationem soluta possimus a.","has_credentials":false,"id":"Sed maiores qui sed exercitationem quam.","label":"Et et veritatis voluptas nobis.","project_id":"Non sint praesentium quia.","status":"active","version":2312965176389631300}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem labore laboriosam repellat harum."},"example":"Aut eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Quia sed omnis quaerat aut.","customer_id":"Magnam cumque quasi magni ducimus.","has_credentials":true,"id":"Ducimus debitis nesciunt quas quibusdam occaecati cum.","label":"Nostrum laborum minima.","project_id":"Iste voluptatem et voluptatem ut ut.","status":"error","version":3654633208585641813}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et qui officiis repudiandae qui iste accusantium."},"example":"Consequatur provident ea sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Quis possimus placeat.","customer_id":"Et qui et.","has_credentials":true,"id":"Dignissimos voluptate iste.","label":"Ad esse neque earum modi.","project_id":"Aut qui est iste.","status":"active","version":280885210133145304}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quo quae aut culpa.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Corrupti aut earum rerum ducimus dicta."},"example":"Perspiciatis a aut quas delectus a."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Incidunt aut aperiam et ipsam.","has_credentials":true,"id":"Pariatur consequatur iste sed illo.","label":"Consectetur porro quo.","project_id":"Sunt ipsa.","status":"error","version":6549464945762782488}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur delectus libero id."},"example":"Aut sit iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Neque ipsum nihil cumque repellendus.","has_credentials":true,"id":"Sit iusto.","label":"Architecto unde rerum quisquam ut.","project_id":"Voluptates neque expedita.","status":"inactive","version":3464454785938965677}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur iste eum amet vel impedit et."},"example":"Adipisci et laboriosam veritatis saepe numquam rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","has_credentials":false,"id":"Recusandae beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ratione consequuntur aut et corrupti.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam sunt rem non doloribus."},"example":"Corrupti ipsum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Dignissimos necessitatibus consequuntur.","funding_instrument_id":"Ipsum voluptatem et quam beatae laborum omnis.","has_credentials":true,"id":"Error necessitatibus et autem doloribus est.","label":"Repudiandae voluptatem vitae iste maxime modi laborum.","project_id":"Maxime labore illo maxime provident.","status":"error","version":1380295609570133746}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas esse qui quisquam quae est magni."},"example":"Quibusdam accusamus possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequuntur quia et saepe aperiam."},"example":"Accusamus ipsa qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Nobis nam.","funding_instrument_id":"Reiciendis pariatur quisquam.","has_credentials":true,"id":"Aut quis qui laudantium dolore.","label":"Non quidem doloribus debitis itaque itaque dolores.","project_id":"Possimus nihil qui enim ratione voluptatem eos.","status":"error","version":7616558197057713508}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ea voluptatem eum voluptas eveniet.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Sit harum ipsa et."},"example":"Dignissimos fugiat voluptatibus natus."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Reiciendis et perspiciatis saepe consequatur doloribus.","job_id":"Velit minus.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Odit odio praesentium."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eaque ratione debitis nam blanditiis."},"event_details":{"description":"Extracted event/course details","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil sunt doloremque."},"id":{"type":"string","description":"Brief UUID","example":"Vero at ut quis."},"keywords":{"description":"Keyword list","example":"Eveniet sint voluptatibus quam dicta."},"platforms":{"type":"array","items":{"type":"string","example":"Ea architecto autem iste."},"description":"Suggested default platforms","example":["Ipsa tempore incidunt velit provident.","Magni tempore sunt itaque omnis.","Ex sunt sit beatae.","Modi voluptatum veniam molestiae quibusdam."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui maiores quia non unde deserunt."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae aut fugit alias."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Consequuntur voluptatem est qui."},"url":{"type":"string","description":"Event/course page URL","example":"Ut ut odio odio sed minus quia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6644792324746576285,"format":"int64"}},"example":{"copy":"Iure culpa est possimus dolores dignissimos.","etag":"Id eum aut et itaque.","event_details":"Itaque est fugiat aut dicta.","event_slug":"Magnam quisquam et consequuntur ut sunt.","id":"Ex aut quia distinctio consequatur.","keywords":"Velit laudantium error.","platforms":["Beatae sed aut quia nihil est.","Qui fugiat."],"program_type":"Provident repudiandae sit qui aut aut.","project_id":"Dolor corporis consequatur voluptatem voluptates sed.","status":"draft","targeting":"Et aut quia beatae.","url":"Et velit fuga quos est.","version":9139670973455309725},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut aperiam voluptate voluptates."},"event_details":{"description":"Extracted event/course details","example":"Eum necessitatibus alias."},"event_slug":{"type":"string","description":"Event/course slug","example":"Provident dicta tenetur voluptatem voluptate dolor."},"id":{"type":"string","description":"Brief UUID","example":"Ad quis aperiam deserunt nostrum."},"keywords":{"description":"Keyword list","example":"Sapiente molestiae dolorum repellat expedita ut."},"platforms":{"type":"array","items":{"type":"string","example":"Odio sunt esse mollitia incidunt."},"description":"Suggested default platforms","example":["Laborum sed molestias veritatis itaque.","Est quis impedit.","Illo harum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui minima in nulla sunt autem eos."},"project_id":{"type":"string","description":"Owning project","example":"Et sed praesentium libero."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Dolor quam dolor consectetur eos iste."},"url":{"type":"string","description":"Event/course page URL","example":"Provident porro."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":709937816203366628,"format":"int64"}},"example":{"copy":"Animi sit esse ratione aliquid.","event_details":"Repudiandae tenetur aperiam saepe vel.","event_slug":"Alias minus reprehenderit dignissimos aut velit.","id":"Quis veniam iusto consequatur quia.","keywords":"Laborum est quasi dignissimos.","platforms":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."],"program_type":"Impedit dolores.","project_id":"Officia eligendi alias.","status":"draft","targeting":"Velit quis harum recusandae est ipsum.","url":"At sint laborum veniam.","version":285293330655778463},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Reiciendis sit minima."},"event_details":{"description":"Extracted event/course details","example":"Eligendi ipsam aut vel atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Perspiciatis alias et amet ex molestiae."},"id":{"type":"string","description":"Brief UUID","example":"Modi repellat eum."},"keywords":{"description":"Keyword list","example":"Unde et."},"platforms":{"type":"array","items":{"type":"string","example":"Pariatur mollitia incidunt autem."},"description":"Suggested default platforms","example":["Voluptate fuga ea distinctio maiores mollitia aut.","Rerum cum eaque nesciunt est totam inventore."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi magni quidem sit in quia."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem eos doloribus sint."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut dolores in voluptas."},"url":{"type":"string","description":"Event/course page URL","example":"Minus libero et consequuntur suscipit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"copy":"Sapiente harum aliquam sunt eum rerum eaque.","event_details":"Voluptatem sint hic.","event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","keywords":"Facere voluptatibus.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","targeting":"Nisi repudiandae.","url":"Nostrum similique omnis iste.","version":7605661861379582739},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Delectus veniam vel est et magni."},"event_details":{"description":"Extracted event/course details","example":"Vero consequatur possimus aut assumenda."},"event_slug":{"type":"string","description":"Event/course slug","example":"Recusandae ut ullam aliquam dolore iure."},"id":{"type":"string","description":"Brief UUID","example":"Velit omnis dolorem est aut."},"keywords":{"description":"Keyword list","example":"Et provident illo non quisquam iure doloremque."},"platforms":{"type":"array","items":{"type":"string","example":"Officia natus quia labore."},"description":"Suggested default platforms","example":["Dolores et incidunt voluptatem ipsa.","Assumenda excepturi.","Tempora est eveniet sequi ea."]},"program_type":{"type":"string","description":"Funnel context","example":"Consequuntur esse culpa."},"project_id":{"type":"string","description":"Owning project","example":"Recusandae dignissimos dolore harum totam tempora vitae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut aliquid."},"url":{"type":"string","description":"Event/course page URL","example":"Minus nostrum iste nemo fugiat sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1796419171074064120,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Ab laboriosam sunt quis omnis.","id":"Veritatis impedit aut.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Alias temporibus illum impedit ullam.","Suscipit harum.","Neque quia.","Et veniam itaque optio consequatur nulla sint."],"program_type":"Exercitationem accusamus pariatur saepe ab qui.","project_id":"Earum doloribus.","status":"approved","targeting":"Cupiditate aut.","url":"Sunt quis odio enim nam id voluptatem.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui rerum numquam quo omnis a quia."},"event_details":{"description":"Extracted event/course details","example":"Itaque qui repudiandae magnam atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Soluta dolore vitae."},"id":{"type":"string","description":"Brief UUID","example":"Minima iure quos enim occaecati beatae."},"keywords":{"description":"Keyword list","example":"Culpa ipsam totam nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"description":"Suggested default platforms","example":["Voluptatem aut debitis vitae unde velit eos.","Accusantium odit rerum commodi ea.","Consequatur et."]},"program_type":{"type":"string","description":"Funnel context","example":"Quaerat et eius culpa magni illum consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestias sint sequi."},"url":{"type":"string","description":"Event/course page URL","example":"In commodi et asperiores et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":122602759626083426,"format":"int64"}},"example":{"copy":"Fuga atque.","event_details":"Qui omnis nesciunt qui consequuntur.","event_slug":"Minima dolorem sit est tempora qui.","id":"Placeat perferendis omnis ad voluptas.","keywords":"Sequi culpa.","platforms":["Praesentium cumque illum pariatur odio molestias voluptatum.","Nulla perferendis possimus deserunt iure et.","Ea quidem ducimus tempora ea molestias."],"program_type":"Enim totam.","project_id":"Voluptates laboriosam cumque mollitia quidem quo.","status":"draft","targeting":"Odit provident sed quo aperiam.","url":"Voluptas necessitatibus cumque non porro qui molestias.","version":4353559979947303924},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Voluptas aperiam."},"event_details":{"description":"Extracted event/course details","example":"Dolores enim."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Rerum numquam amet deserunt rem quia."},"keywords":{"description":"Keyword list","example":"Assumenda harum eos eveniet ut et laboriosam."},"platforms":{"type":"array","items":{"type":"string","example":"Numquam omnis ullam facilis ab sapiente."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Esse voluptate eum laboriosam distinctio non.","Deserunt labore et id aut et adipisci.","Ut molestiae.","Voluptates ut culpa saepe necessitatibus."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Quos expedita voluptas qui eaque."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsam dolores et et qui ut."}},"example":{"copy":"Porro ut et cupiditate.","event_details":"Non assumenda perspiciatis.","event_slug":"Nostrum ratione id.","keywords":"Ea ullam minima voluptatem vel deleniti.","platforms":["Quae molestiae suscipit non iusto.","Consequatur in vero soluta.","Eius dicta.","Ullam distinctio dolore velit."],"program_type":"education","targeting":"Repudiandae necessitatibus dolorem enim beatae quia.","url":"Laborum aspernatur voluptate itaque fugit."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Aut ut."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut ut sit nisi architecto."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptate enim qui impedit temporibus."},"id":{"type":"string","description":"Campaign UUID","example":"Et vel beatae molestiae fuga."},"platform":{"type":"string","description":"Channel","example":"Sed corrupti sit."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Labore quia esse consectetur tenetur eum."},"project_id":{"type":"string","description":"Owning project","example":"Vitae consequatur eos."},"status":{"type":"string","description":"Campaign status","example":"Rerum et recusandae possimus quis."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9161333083936888105,"format":"int64"}},"example":{"brief_id":"Explicabo repudiandae aut reiciendis recusandae molestias.","campaign_name":"Hic est quia pariatur odit ullam.","etag":"Quisquam nisi repellendus quos magnam aut.","id":"Eos omnis cumque nemo ipsam ut.","platform":"Vel inventore aliquid aut non eligendi accusamus.","platform_campaign_id":"Quod impedit accusamus incidunt minus veritatis enim.","project_id":"Natus et unde.","status":"Ex id corrupti sed quo perferendis.","version":7863921121752869750},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptates sit est corporis molestiae voluptatem."},"campaign_name":{"type":"string","description":"Campaign name","example":"Ratione ipsum."},"id":{"type":"string","description":"Campaign UUID","example":"Et incidunt."},"platform":{"type":"string","description":"Channel","example":"Expedita inventore qui necessitatibus ut necessitatibus in."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Autem maxime hic."},"project_id":{"type":"string","description":"Owning project","example":"Dolor sed excepturi delectus."},"status":{"type":"string","description":"Campaign status","example":"Amet hic est."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":906675377577277444,"format":"int64"}},"example":{"brief_id":"Magnam voluptates molestiae libero autem quod.","campaign_name":"Sunt accusantium totam quia.","id":"Occaecati rerum reiciendis.","platform":"Ullam ipsum.","platform_campaign_id":"Dolores dolore id dolore sed.","project_id":"Esse mollitia et dolorum accusantium aspernatur quos.","status":"Accusantium debitis adipisci qui iste explicabo.","version":9006499932988805057},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Dolor quia consectetur non nulla dolore."},"campaign_name":{"type":"string","description":"Campaign name","example":"Quos omnis."},"id":{"type":"string","description":"Campaign UUID","example":"Qui quia."},"platform":{"type":"string","description":"Channel","example":"Ducimus voluptas soluta quod qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Fugiat est omnis inventore voluptatum ab totam."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam sint autem repudiandae asperiores."},"status":{"type":"string","description":"Campaign status","example":"Libero consequatur."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3986034538934721868,"format":"int64"}},"example":{"brief_id":"Reiciendis odit eos et quidem.","campaign_name":"Quae voluptatem velit mollitia dolorem ea.","id":"Sapiente ex est modi cupiditate possimus ducimus.","platform":"Atque hic quam impedit placeat.","platform_campaign_id":"Voluptatibus aliquam et.","project_id":"Modi consequatur molestias et et deleniti.","status":"Enim voluptas numquam.","version":616047483519279742},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Qui libero natus."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["microsoft-ads","meta-ads","twitter-ads","hubspot"]}},"example":{"config":"Vitae officia dolorem.","platforms":["meta-ads","twitter-ads","hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Id voluptatem nihil quaerat asperiores."},"config":{"description":"Campaign configuration snapshot","example":"Error perferendis quae qui inventore dolorem."},"status":{"type":"string","description":"Campaign status","example":"Repellat vel veritatis hic rerum accusamus."}},"example":{"campaign_name":"Quasi in aut nam rerum.","config":"Architecto deserunt vero ducimus distinctio.","status":"Distinctio magnam."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Magni aut nisi est sit sint."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Et voluptas dolorem necessitatibus illum quisquam.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit quis."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel architecto quae error dolor placeat."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem nostrum."},"label":{"type":"string","description":"Optional friendly name","example":"Ut nobis."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Minus et."},"project_id":{"type":"string","description":"Owning project","example":"Deleniti voluptas quo nostrum quia."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7197135224651925465,"format":"int64"}},"example":{"account_id":"Nostrum atque illum nesciunt adipisci odit corrupti.","etag":"Voluptas omnis quidem dolor ipsum voluptas sed.","has_credentials":true,"id":"Fugiat aliquid aspernatur voluptatem in cupiditate.","label":"Iusto fugit non asperiores quidem natus.","login_customer_id":"Id ea.","project_id":"Et dolorem quod.","status":"deleted","version":8604742619872904748},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rem fugit accusantium est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto eius dolor magnam necessitatibus amet."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum tempore tempora."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dolorem asperiores autem aut aut soluta."},"project_id":{"type":"string","description":"Owning project","example":"Earum aut qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6983147448769937945,"format":"int64"}},"example":{"account_id":"Officia dolores et reprehenderit.","has_credentials":false,"id":"Et est et corporis.","label":"Aut explicabo.","login_customer_id":"Rerum rem.","project_id":"Voluptate est reprehenderit consectetur accusamus eaque inventore.","status":"deleted","version":8504196254053832609},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et vel dolorum aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vitae qui explicabo tempora accusantium aut."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis qui sunt laboriosam ipsa."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dicta ut."},"project_id":{"type":"string","description":"Owning project","example":"In vel."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5579476471615779331,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","has_credentials":true,"id":"Beatae error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","login_customer_id":"Iure dolores dolores dolorem sit nihil.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsam eligendi est dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sit est atque qui quaerat qui vitae."},"label":{"type":"string","description":"Optional friendly name","example":"Optio in ratione accusamus quasi."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quos excepturi natus est est."},"project_id":{"type":"string","description":"Owning project","example":"Optio non."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6617602369183761406,"format":"int64"}},"example":{"account_id":"Quibusdam ea nam aut.","has_credentials":false,"id":"Doloribus unde id aut perspiciatis.","label":"Sit totam ut et.","login_customer_id":"Est consequatur rerum neque velit nulla modi.","project_id":"Adipisci ut.","status":"active","version":926393304108038988},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"In consectetur et culpa quaerat vel sed."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et impedit quod."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Magni omnis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Ipsa nihil esse."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit id incidunt.","client_secret":"Non sed hic minima est distinctio.","developer_token":"A perferendis.","refresh_token":"Facere eum aliquid est repellat assumenda."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Error eligendi incidunt accusamus excepturi inventore."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut architecto aliquam mollitia labore sapiente."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quod minima dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nihil facilis sunt."},"label":{"type":"string","description":"Optional friendly name","example":"Ut beatae eaque quo atque."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Molestiae id aut debitis iure."},"project_id":{"type":"string","description":"Owning project","example":"Vero ad ex consequatur dolore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolore est dolorem quod enim pariatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Occaecati veritatis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7262698057225531796,"format":"int64"}},"example":{"account_id":"Ad quae nisi.","brand_kit":"Incidunt voluptas non necessitatibus.","etag":"Cum et ab ipsum.","has_credentials":true,"id":"Tenetur non accusamus qui ex.","label":"Ex et amet sunt.","portal_id":"Qui nemo nihil dolorum consequatur.","project_id":"Quia mollitia.","sender_email":"Tempora qui eum hic vel aspernatur at.","sender_name":"Est ea sed sit.","status":"deleted","version":7589133128297342291},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non in iure dolores et quis id."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Accusamus corrupti sint molestiae occaecati est quos."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sint consequuntur omnis distinctio possimus non aliquid."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi est et est totam."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quia sed nesciunt minus."},"project_id":{"type":"string","description":"Owning project","example":"Facilis neque sed alias dolore id."},"sender_email":{"type":"string","description":"Default sender address","example":"Non doloribus nam."},"sender_name":{"type":"string","description":"Default sender name","example":"Nulla suscipit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1661229305097180791,"format":"int64"}},"example":{"account_id":"Totam non qui.","brand_kit":"Sunt labore voluptate.","has_credentials":true,"id":"Est ut ratione nobis.","label":"Qui ut ut qui sed explicabo.","portal_id":"Vero nulla laboriosam vel et et iure.","project_id":"Occaecati tenetur minima veritatis sed impedit laborum.","sender_email":"Exercitationem voluptatum perspiciatis autem.","sender_name":"Eum ut.","status":"active","version":5481070480011205228},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur laborum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut tempora dolorem neque assumenda sed."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Cum ipsum quo possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Excepturi sit minus."},"project_id":{"type":"string","description":"Owning project","example":"Quam culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Et quisquam dicta."},"sender_name":{"type":"string","description":"Default sender name","example":"Eaque enim est libero enim quo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2473646846997850541,"format":"int64"}},"example":{"account_id":"Similique eaque autem impedit tenetur voluptatibus.","brand_kit":"Et fuga veniam.","has_credentials":true,"id":"Aspernatur ipsam consequatur qui illo totam fuga.","label":"Qui non illum expedita commodi in dolores.","portal_id":"Harum molestiae cupiditate ab et eum ex.","project_id":"In tempore quo consequatur.","sender_email":"Quia velit adipisci.","sender_name":"Aliquid eum itaque qui recusandae recusandae.","status":"deleted","version":5418486313404831501},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Praesentium eos aspernatur voluptatum facilis laboriosam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ab earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ea et iusto doloremque odio pariatur."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aliquid ratione est omnis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Alias et error nobis minima fuga reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Expedita animi ut velit at."},"sender_email":{"type":"string","description":"Default sender address","example":"Impedit qui suscipit ipsa."},"sender_name":{"type":"string","description":"Default sender name","example":"Animi fuga maxime tempora."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2736756583759126082,"format":"int64"}},"example":{"account_id":"Ab itaque tempore vel quia cum quas.","brand_kit":"Sed commodi voluptatibus.","has_credentials":true,"id":"Rerum perspiciatis dolor pariatur.","label":"Quo soluta maxime temporibus earum et aperiam.","portal_id":"Ipsa aut est et est debitis ea.","project_id":"Amet officia occaecati quam nostrum quis voluptas.","sender_email":"Eum voluptatum accusamus illo eveniet eum.","sender_name":"Nemo molestiae modi ut non atque.","status":"deleted","version":5960975059584485019},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Minus voluptatem ab delectus porro."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi esse voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Mollitia nulla."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Veniam molestias."},"sender_email":{"type":"string","description":"Default sender address","example":"Accusamus quia velit commodi."},"sender_name":{"type":"string","description":"Default sender name","example":"Tenetur cumque rerum."}},"example":{"account_id":"Hic magni.","brand_kit":"Nihil atque.","label":"Fugit dolorum nulla quo veritatis id.","portal_id":"Et optio sed omnis aut voluptatem voluptas.","sender_email":"Eum omnis est blanditiis maxime et.","sender_name":"Et eum inventore quisquam."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Quia omnis in qui."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Nihil ut."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Ut beatae quia."},"platforms":{"type":"array","items":{"type":"string","example":"Minima illo dolores natus a sint."},"description":"Platforms this job will create on","example":["Quae et nesciunt iure quis in.","Mollitia nihil ducimus."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Non quo necessitatibus.","platforms":["Accusantium laudantium nostrum earum dolores.","Eos exercitationem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Hic vel ut."},"job_id":{"type":"string","description":"Job UUID","example":"Illo accusamus."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dolores quidem necessitatibus voluptatem consequatur sit.","job_id":"Earum minus autem omnis qui debitis eum.","result":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}],"status":"running"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae illum accusamus debitis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Doloribus voluptas mollitia doloremque totam."},"label":{"type":"string","description":"Optional friendly name","example":"Quia doloremque commodi rerum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Praesentium sint laudantium error."},"project_id":{"type":"string","description":"Owning project","example":"Veniam et ducimus quos amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6150421422111226538,"format":"int64"}},"example":{"account_id":"Quas quis corporis.","etag":"Ea ducimus ipsum dolorem dignissimos.","has_credentials":true,"id":"Nihil iure officiis nemo quia.","label":"Et quia ex et alias ea.","org_id":"Quo ullam ad iusto quos.","project_id":"Ducimus id sint eius aut.","status":"inactive","version":2540282771582052941},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit soluta quia qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio quia similique vero est impedit quo."},"label":{"type":"string","description":"Optional friendly name","example":"Libero officia et quia."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil at."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1438953144952054594,"format":"int64"}},"example":{"account_id":"Optio rerum vel molestiae id.","has_credentials":false,"id":"Necessitatibus eos rerum.","label":"Qui quas aut provident suscipit.","org_id":"Reiciendis excepturi.","project_id":"Veniam amet et quisquam voluptatem fuga.","status":"active","version":8349066598252210000},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut temporibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut tenetur."},"label":{"type":"string","description":"Optional friendly name","example":"Iure aut tenetur ipsum ea ad ducimus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Voluptatem libero."},"project_id":{"type":"string","description":"Owning project","example":"Et et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8572511867951081487,"format":"int64"}},"example":{"account_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Eligendi non.","label":"Aut amet aut voluptatum magnam.","org_id":"Quisquam perspiciatis ipsam aperiam et totam in.","project_id":"Necessitatibus non eum ipsum eveniet quam.","status":"error","version":786757177338717877},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Debitis atque laboriosam unde facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"label":{"type":"string","description":"Optional friendly name","example":"Nam modi nostrum assumenda alias sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Mollitia ducimus sunt."},"project_id":{"type":"string","description":"Owning project","example":"Odit illo ut ut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4721820161303114412,"format":"int64"}},"example":{"account_id":"Est deserunt maiores consequatur.","has_credentials":true,"id":"Aliquam voluptatem.","label":"Eos minima sunt.","org_id":"Non ratione quo ullam dolores occaecati.","project_id":"Dolore aliquam est autem.","status":"deleted","version":2899021755311679849},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sit voluptatem ad ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Tempora dolor quis totam hic quibusdam eveniet.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Dolorem necessitatibus neque consectetur occaecati earum."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut sint non eum expedita non."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Id vel iusto optio repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"page_id":{"type":"string","description":"Facebook page ID","example":"Hic quos inventore."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Nisi est magni odio aut.","app_id":"Et ipsa magnam cum.","etag":"Ducimus voluptatem doloremque ullam consequatur.","has_credentials":false,"id":"Ad dolorem et.","label":"Inventore impedit unde voluptatem quia ab recusandae.","page_id":"Eveniet tempore est omnis iusto fugiat.","project_id":"Rerum eveniet nam sunt.","status":"inactive","version":8514774147978099222},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos qui quo et."},"app_id":{"type":"string","description":"Meta app ID","example":"Sed voluptas fuga officia nulla."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut magnam facilis non facilis dolor consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"A debitis ut ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Beatae facilis dolor quod nihil quia."},"project_id":{"type":"string","description":"Owning project","example":"Error quisquam recusandae nesciunt et itaque."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2532070289670969642,"format":"int64"}},"example":{"account_id":"Et nemo dicta illum omnis.","app_id":"Minus est dolor.","has_credentials":false,"id":"Recusandae consequatur nulla.","label":"Consequuntur provident nostrum vel ut.","page_id":"Deleniti magnam nemo cum delectus.","project_id":"Non consequuntur qui qui impedit assumenda voluptas.","status":"error","version":1382848930967937507},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsa ut saepe beatae quasi."},"app_id":{"type":"string","description":"Meta app ID","example":"Neque voluptas doloremque nobis consectetur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et voluptatem mollitia placeat aut laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Nam sequi iste iusto."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corrupti ut."},"project_id":{"type":"string","description":"Owning project","example":"Ut et laborum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2992056059874429339,"format":"int64"}},"example":{"account_id":"Quis impedit.","app_id":"Tempore qui repellendus.","has_credentials":false,"id":"Voluptas voluptatem.","label":"Corrupti dicta pariatur totam quas deserunt.","page_id":"Earum voluptates repellat ipsam aut et ut.","project_id":"Quia facere vitae aperiam.","status":"active","version":5857417550509828993},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Accusantium est."},"app_id":{"type":"string","description":"Meta app ID","example":"Dolorem similique sapiente."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Expedita commodi sit."},"label":{"type":"string","description":"Optional friendly name","example":"Quo porro."},"page_id":{"type":"string","description":"Facebook page ID","example":"Pariatur esse."},"project_id":{"type":"string","description":"Owning project","example":"Et porro saepe eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8954046891574288398,"format":"int64"}},"example":{"account_id":"Sed qui dolor illo facere ut voluptatem.","app_id":"Perferendis placeat earum occaecati et.","has_credentials":false,"id":"Ea pariatur.","label":"Nam repellat.","page_id":"Rerum maiores in alias est laboriosam saepe.","project_id":"Aut rem molestiae assumenda ea.","status":"deleted","version":8862716294143227386},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Et minima."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas quis nihil tempora rem asperiores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vero natus voluptatem."}},"example":{"account_id":"act_193556282970417","app_id":"Voluptas aliquid libero sapiente aspernatur fugit eum.","label":"Quas qui aut rerum illum vero.","page_id":"Et neque soluta."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Est placeat explicabo aliquid."},"app_secret":{"type":"string","description":"Meta app secret","example":"Tenetur ut."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Quo vel iste aut cum voluptatem.","app_secret":"Et et aperiam."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor ea iusto eveniet velit sint odit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quam enim odio quia."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate et esse voluptate optio quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et atque."},"label":{"type":"string","description":"Optional friendly name","example":"Aliquid explicabo eaque ab aut voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Impedit velit omnis incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8220727981299951228,"format":"int64"}},"example":{"account_id":"Unde fuga voluptas ut vero.","customer_id":"Velit dolorem.","etag":"A pariatur omnis.","has_credentials":true,"id":"Commodi aspernatur.","label":"Velit perferendis est ipsum aut voluptas.","project_id":"Nostrum numquam illo.","status":"active","version":5290138330966618163},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Odit numquam quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Ut unde dolore id.","customer_id":"Dolorem ut aspernatur et ad.","has_credentials":false,"id":"Aut dolores.","label":"Atque qui dignissimos aut eaque eveniet.","project_id":"Voluptatem beatae quis dignissimos voluptatem et labore.","status":"active","version":412346224570068154},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut dolorem ea veniam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ullam dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Magnam sequi esse at."},"label":{"type":"string","description":"Optional friendly name","example":"Assumenda cum nemo esse nobis."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut rerum voluptatem ad minus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6107904235260429813,"format":"int64"}},"example":{"account_id":"Nihil deleniti dolores dignissimos perferendis tempore eum.","customer_id":"Magnam saepe incidunt nisi.","has_credentials":true,"id":"Eum et consequatur quis.","label":"Consequatur dolor quia amet vero dolorum incidunt.","project_id":"Enim nisi doloremque rerum.","status":"deleted","version":9143198940358453773},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Repudiandae facilis blanditiis libero nam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus blanditiis magnam sed iure amet."}},"example":{"account_id":"Molestiae omnis doloremque.","customer_id":"Perspiciatis modi dicta quae sed ut.","label":"Deserunt et quidem sapiente."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Aut est voluptatibus placeat."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Pariatur perferendis explicabo expedita et velit accusamus."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Nulla eos."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Deleniti placeat rerum."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","developer_token":"Quisquam animi.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Magni atque amet omnis doloremque at."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolor et natus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Nihil neque quod alias ipsum."}},"example":{"campaign_id":"Consequatur non eveniet esse officia explicabo dolor.","error":"Aspernatur voluptatibus.","ok":true,"platform":"Cupiditate non exercitationem."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Rerum non assumenda molestiae modi impedit.","etag":"Aliquam voluptatibus assumenda mollitia molestias eos nobis.","has_credentials":false,"id":"Earum id consequatur.","label":"Adipisci ipsa.","project_id":"Dolorum id ut molestias.","status":"deleted","version":948876280422508983},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et natus possimus cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque magni omnis dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Quae et perspiciatis numquam."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda quam possimus aut ipsa."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6695567399746083998,"format":"int64"}},"example":{"account_id":"Amet itaque aut.","has_credentials":true,"id":"Atque delectus ut.","label":"Unde adipisci aut quisquam.","project_id":"Eum non ut itaque.","status":"inactive","version":8672712817511304757},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quas quia quam voluptate nam iste."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et doloremque porro non."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores quo est ratione beatae totam."},"project_id":{"type":"string","description":"Owning project","example":"Quis ab non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1807846651493588341,"format":"int64"}},"example":{"account_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Temporibus aut numquam.","label":"Enim velit voluptates officiis tempora possimus rerum.","project_id":"Accusantium ut vitae dolor soluta beatae.","status":"active","version":8042484860326151968},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Incidunt deleniti.","has_credentials":false,"id":"Officiis modi quae consequatur voluptatem et.","label":"Vero eum ea perspiciatis rerum.","project_id":"Culpa veritatis ut adipisci minus.","status":"active","version":6279401977493721745},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Numquam optio possimus velit quod."}},"example":{"account_id":"t2_gv9wtbfa","label":"Perspiciatis quam iste possimus ipsam."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Mollitia vel."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ea eum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Qui qui."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Repudiandae quae aut.","client_secret":"Tempore rem quo fuga accusantium voluptas ratione.","refresh_token":"Esse et labore earum."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo repudiandae."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel aut aliquam rerum et quidem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim voluptatem inventore quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est porro eos ipsa quia."},"project_id":{"type":"string","description":"Owning project","example":"Delectus enim quas id porro."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1500674714869504232,"format":"int64"}},"example":{"account_id":"Sequi non et.","etag":"Quibusdam repellendus qui numquam.","funding_instrument_id":"Necessitatibus quaerat minima a voluptatem ipsa et.","has_credentials":true,"id":"Aut omnis itaque ut vero voluptatibus.","label":"Vero dolorem qui.","project_id":"Eum provident velit voluptatibus.","status":"active","version":3990374454753155356},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","funding_instrument_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","funding_instrument_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est perferendis eos et cumque nulla."},"label":{"type":"string","description":"Optional friendly name","example":"Iste exercitationem voluptate quia esse nihil sed."}},"example":{"account_id":"8r7gb","funding_instrument_id":"In autem neque nihil laborum omnis.","label":"Neque maiores quo aliquam in rem."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Hic voluptatem ad similique sunt ratione."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Dicta et ratione impedit recusandae dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nemo sint et consequatur vel quisquam libero."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Eum et sint possimus omnis dolorem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Facere sed ea qui pariatur adipisci.","access_token_secret":"Enim esse dolores.","consumer_key":"Mollitia vel temporibus sunt nulla esse.","consumer_secret":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index 6ea9eca3..0ae17c6a 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -32,16 +32,17 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. responses: "201": description: Created response. @@ -51,27 +52,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et eum ex doloremque quia. - example: Eum itaque. + example: Nobis est fugit ratione consectetur exercitationem. + example: Aperiam quia doloribus omnis. content: application/json: schema: $ref: '#/components/schemas/Brief2' example: - copy: Architecto voluptas ratione delectus ut adipisci. - event_details: Quas qui mollitia perferendis eveniet voluptas est. - event_slug: Ullam tenetur quia totam magni sunt repellat. - id: A quos a sed exercitationem ut. - keywords: Temporibus aliquam animi unde. + copy: Ut temporibus aliquam animi unde. + event_details: Et architecto voluptas ratione delectus ut. + event_slug: Magni autem. + id: Laboriosam tempore vero voluptatum a quos. + keywords: Ut est nobis aspernatur. platforms: - - Quo eum dignissimos iure. - - Ea quis. - program_type: Doloremque itaque eius magni autem. - project_id: Ut minus in nemo perspiciatis et qui. + - Tempore nihil quos. + - Eum dignissimos iure praesentium ea. + - Quis quas qui mollitia perferendis eveniet voluptas. + program_type: Nemo perspiciatis et qui aliquam doloremque itaque. + project_id: Sed exercitationem ut totam ut minus. status: draft - targeting: Ut est nobis aspernatur. - url: Ex tempore. - version: 1756394405346388080 + targeting: Fugit qui tempora commodi reiciendis sit alias. + url: Ullam tenetur quia totam magni sunt repellat. + version: 958049424855577225 "400": description: 'BadRequest: Bad request' content: @@ -143,8 +145,8 @@ paths: schema: type: string description: Brief UUID - example: Aperiam et ab. - example: Tempore vel quia cum. + example: Sit ut repellat voluptas. + example: Eligendi consequatur officia labore eos. responses: "204": description: No Content response. @@ -218,8 +220,8 @@ paths: schema: type: string description: Brief UUID - example: Recusandae recusandae est et fuga veniam natus. - example: Et iusto doloremque odio. + example: Excepturi fugit. + example: Aut quia voluptates voluptates nisi. responses: "200": description: OK response. @@ -229,27 +231,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ipsum expedita animi. - example: Ratione est omnis voluptas praesentium. + example: Aut molestias aut excepturi cumque. + example: Ut hic distinctio non recusandae et qui. content: application/json: schema: $ref: '#/components/schemas/Brief3' example: - copy: Dolorum excepturi quibusdam. - event_details: Enim magnam eius voluptas voluptatibus deleniti. - event_slug: Hic vero et. - id: Voluptas et accusamus quia et officiis ipsum. - keywords: Amet iusto provident sequi est. + copy: Quaerat ea accusantium. + event_details: Amet iusto provident sequi est. + event_slug: Ut ea alias. + id: Explicabo cupiditate rerum. + keywords: Voluptatem iure vero. platforms: - - Aspernatur qui quidem est eligendi. - - Non accusantium quis architecto. - program_type: Incidunt ipsum est perspiciatis soluta voluptas est. - project_id: Explicabo cupiditate rerum. + - Accusantium quis architecto. + - Enim magnam eius voluptas voluptatibus deleniti. + - Dolorum excepturi quibusdam. + program_type: Hic vero et. + project_id: Incidunt ipsum est perspiciatis soluta voluptas est. status: draft - targeting: Quaerat ea accusantium. - url: Ut ea alias. - version: 4496268214732198365 + targeting: Consequatur neque tempore voluptatibus quo quod nesciunt. + url: Nam aspernatur qui quidem est eligendi. + version: 7881322722259816896 "400": description: 'BadRequest: Bad request' content: @@ -320,8 +323,8 @@ paths: schema: type: string description: Brief UUID - example: Aspernatur voluptatum facilis. - example: Laboriosam et. + example: Exercitationem officia corrupti tempora ea. + example: Totam unde. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -339,16 +342,17 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. responses: "200": description: OK response. @@ -358,29 +362,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sapiente alias et error nobis minima. - example: Fuga maxime tempora rem. + example: Ipsa sint optio nobis quae corporis. + example: Voluptas ut nostrum officiis et accusamus provident. content: application/json: schema: $ref: '#/components/schemas/Brief4' example: - copy: Veniam maiores dolorum sit et. - event_details: Dolor ut. - event_slug: Et assumenda recusandae. - id: Saepe pariatur. - keywords: Porro sed minus illo rerum ut. + copy: Rerum ut culpa totam sequi sit. + event_details: Sit et quod porro sed minus. + event_slug: Et ratione sit. + id: Et assumenda recusandae. + keywords: Excepturi dolor labore. platforms: - - Id incidunt qui et ratione sit quaerat. - - Ipsum quia ad a. - - Veritatis omnis excepturi. - - Et pariatur molestias autem. - program_type: Soluta alias natus aut eligendi ea. - project_id: Est quaerat id qui repudiandae. + - Omnis veritatis omnis. + - Officia et pariatur molestias autem ratione. + - Ut et veniam maiores. + program_type: Totam id incidunt. + project_id: Sint eveniet dicta numquam doloremque ab cumque. status: draft - targeting: Totam sequi. - url: Sint eveniet dicta numquam doloremque ab cumque. - version: 4401871562627166296 + targeting: Iusto dolores. + url: Sed ipsum quia. + version: 7723389563281978281 "400": description: 'BadRequest: Bad request' content: @@ -470,8 +473,8 @@ paths: schema: type: string description: Brief UUID - example: Earum debitis. - example: Perspiciatis dolor pariatur quae amet. + example: Odio eos earum fuga non est. + example: Rerum reiciendis similique. responses: "200": description: OK response. @@ -481,27 +484,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Occaecati quam nostrum quis. - example: Maxime temporibus earum. + example: Tempora qui incidunt tempora. + example: Vero voluptates soluta. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Blanditiis et qui est dolorem eos. - event_details: Modi sed. - event_slug: Eligendi earum qui est et id laudantium. - id: Sed ea. - keywords: Dolorem sed atque. + copy: Sint qui praesentium ea praesentium magni. + event_details: Consequuntur neque mollitia quia. + event_slug: Tempora veritatis harum ab nobis fuga atque. + id: Et tempore. + keywords: Iure dolore et et aut nam. platforms: - - Veritatis harum ab nobis. - - Atque inventore fugiat aut laboriosam maxime facere. - program_type: Et tempore. - project_id: Ut nihil quo tenetur doloribus fugiat natus. + - Blanditiis et qui est dolorem eos. + - Dolorem sed atque. + - Provident id quia porro rerum. + - Quo aliquid nobis. + program_type: Ratione incidunt est saepe. + project_id: Eligendi earum qui est et id laudantium. status: archived - targeting: Provident id quia porro rerum. - url: Ratione incidunt est saepe. - version: 2165165569618896837 + targeting: Voluptates odit consequatur quis. + url: Fugiat aut laboriosam maxime facere culpa modi. + version: 317664992246136086 "400": description: 'BadRequest: Bad request' content: @@ -573,8 +578,8 @@ paths: schema: type: string description: Brief UUID - example: Qui minus sit necessitatibus. - example: Aut est et. + example: Repudiandae odit. + example: Cupiditate est illo repellat et cum repellat. requestBody: required: true content: @@ -583,12 +588,10 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Est voluptatum enim earum et doloribus. + config: Vitae reiciendis voluptatem. platforms: - - hubspot - - meta-ads - reddit-ads - - twitter-ads + - microsoft-ads responses: "202": description: Accepted response. @@ -597,10 +600,10 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Id ducimus eius et laboriosam omnis vitae. + job_id: Rerum sint optio. platforms: - - Non voluptas ut enim. - - Rerum sint optio. + - Quos tempora dolorem dolor fugiat quia. + - Exercitationem rerum iste ducimus. status: queued "400": description: 'BadRequest: Bad request' @@ -673,8 +676,8 @@ paths: schema: type: string description: Brief UUID - example: Debitis ea molestiae eum voluptatum. - example: Illo eveniet. + example: Temporibus ipsum necessitatibus ratione possimus. + example: Facilis repellat eveniet reiciendis. - name: campaign_id in: path description: Campaign UUID @@ -682,8 +685,8 @@ paths: schema: type: string description: Campaign UUID - example: Consequatur nemo molestiae modi ut non atque. - example: Sed commodi voluptatibus. + example: Consequatur sint et vel molestiae. + example: Non placeat. responses: "200": description: OK response. @@ -693,21 +696,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Nobis est fugit ratione consectetur exercitationem. - example: Aperiam quia doloribus omnis. + example: Natus pariatur et et sed debitis. + example: Necessitatibus reprehenderit illum. content: application/json: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Ut consectetur. - campaign_name: Est qui molestiae rerum adipisci minima quibusdam. - id: Hic voluptas debitis error. - platform: Commodi quam voluptates. - platform_campaign_id: Optio dolorem omnis. - project_id: Veniam eum ut libero quibusdam debitis. - status: Accusantium sunt culpa libero quisquam. - version: 6082718548704928320 + brief_id: Est qui molestiae rerum adipisci minima quibusdam. + campaign_name: Harum distinctio reiciendis architecto atque maxime soluta. + id: Commodi quam voluptates. + platform: Accusantium sunt culpa libero quisquam. + platform_campaign_id: Rerum amet aut tempora recusandae aspernatur. + project_id: Optio dolorem omnis. + status: Ducimus porro maxime. + version: 5829797402937558935 "400": description: 'BadRequest: Bad request' content: @@ -778,8 +781,8 @@ paths: schema: type: string description: Brief UUID - example: Excepturi fugit. - example: Aut quia voluptates voluptates nisi. + example: Minima adipisci aut quia quisquam. + example: Quia facilis sit. - name: campaign_id in: path description: Campaign UUID @@ -787,8 +790,8 @@ paths: schema: type: string description: Campaign UUID - example: Aut molestias aut excepturi cumque. - example: Esse voluptate non autem. + example: Magnam nihil qui doloremque nam magnam aliquid. + example: Possimus accusantium expedita alias. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -806,9 +809,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. - config: Error similique. - status: Maxime fugiat illo. + campaign_name: Alias ullam fugiat deserunt sint nihil iusto. + config: Necessitatibus expedita. + status: Voluptas inventore sit. responses: "200": description: OK response. @@ -818,21 +821,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ut hic distinctio non recusandae et qui. - example: Totam unde. + example: Incidunt sit. + example: Totam tempora quod expedita. content: application/json: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Enim ea. - campaign_name: Totam sapiente vitae numquam ut nesciunt voluptas. - id: Necessitatibus expedita. - platform: Asperiores et. - platform_campaign_id: Laboriosam quis facere. - project_id: Beatae autem autem. - status: Exercitationem consectetur. - version: 6868385032394830606 + brief_id: Exercitationem consectetur. + campaign_name: Modi asperiores ut libero vel. + id: Laboriosam quis facere. + platform: Nesciunt necessitatibus ex ea ullam corrupti sunt. + platform_campaign_id: Omnis accusantium ad. + project_id: Totam sapiente vitae numquam ut nesciunt voluptas. + status: Voluptates iste autem veniam et enim unde. + version: 1765361339666375563 "400": description: 'BadRequest: Bad request' content: @@ -972,21 +975,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempora qui incidunt tempora. - example: Vero voluptates soluta. + example: Voluptas ipsam iste. + example: Delectus libero necessitatibus quis. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Ipsum quaerat delectus cupiditate sit et. + account_id: Quis sapiente ut sit quod. has_credentials: true - id: Eum dolorum. - label: Veniam velit sequi sit impedit dolorum voluptas. - login_customer_id: Sed non. - project_id: Distinctio vel. + id: Ea minus enim ut. + label: Magnam ut et ab. + login_customer_id: Quae nihil magni. + project_id: Nostrum veniam qui rerum ipsum eum fugit. status: error - version: 4111850562907897222 + version: 7243034772713915274 "404": description: 'NotFound: Resource not found' content: @@ -1044,10 +1047,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. responses: "201": description: Created response. @@ -1057,21 +1060,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas ut nostrum officiis et accusamus provident. - example: Rerum reiciendis similique. + example: Commodi et nihil et. + example: Repellendus adipisci sit et enim quasi ut. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Perspiciatis saepe consequatur doloribus sequi et. - has_credentials: true - id: Nulla ut laboriosam. - label: Omnis suscipit corrupti reiciendis. - login_customer_id: Nihil quia omnis eaque aperiam eum. - project_id: Rerum delectus velit. - status: active - version: 3995988906528985875 + account_id: Magni et rerum sed voluptatum. + has_credentials: false + id: Veniam velit sequi sit impedit dolorum voluptas. + label: Enim est occaecati sed non dolorem distinctio. + login_customer_id: Nostrum tenetur repellendus. + project_id: Ipsum quaerat delectus cupiditate sit et. + status: deleted + version: 5181448788196437025 "400": description: 'BadRequest: Bad request' content: @@ -1155,21 +1158,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit ut repellat voluptas. - example: Repudiandae odit. + example: Aut sunt ex et autem delectus. + example: Occaecati placeat et. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Ut laborum nostrum veniam qui rerum. + account_id: Deserunt magni voluptas odio assumenda totam. has_credentials: true - id: Aut ratione sunt nostrum tenetur. - label: Fugit enim et sint consectetur ea minus. - login_customer_id: Magnam ut et ab. - project_id: Dolorem cum. - status: active - version: 5799897036572741099 + id: Laudantium expedita ut ipsum id commodi nobis. + label: Velit sapiente qui iusto quis magni et. + login_customer_id: Officiis deleniti ipsam nam. + project_id: Vitae aut voluptatem inventore ab. + status: deleted + version: 6633489521806040497 "400": description: 'BadRequest: Bad request' content: @@ -1251,10 +1254,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. responses: "204": description: No Content response. @@ -1321,8 +1324,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sapiente ut sit quod. - ok: true + message: Aut id molestiae sit. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1426,24 +1429,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quo omnis et et molestiae dolorum. - example: Consequatur iste eum amet vel impedit et. + example: Dolorem quia. + example: Adipisci consectetur ut modi quo et. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Deleniti itaque voluptas magnam. - brand_kit: Dolor id. - has_credentials: false - id: Dolorem sapiente. - label: Sint autem. - portal_id: Vitae optio ut et consequuntur. - project_id: Aut natus. - sender_email: Libero autem ut. - sender_name: Debitis soluta sed quod dicta aperiam eveniet. - status: error - version: 7443019901611180865 + account_id: Non ut voluptas et accusamus natus id. + brand_kit: Eos voluptatibus. + has_credentials: true + id: Sit similique ut minima ut. + label: Quia enim illo et eligendi. + portal_id: Et quam architecto vero. + project_id: Voluptatum officia quod error amet quia inventore. + sender_email: Vero labore laudantium maiores. + sender_name: Reiciendis dignissimos consequatur iste qui minima. + status: deleted + version: 4350724330275405551 "404": description: 'NotFound: Resource not found' content: @@ -1497,14 +1500,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. responses: "201": description: Created response. @@ -1514,24 +1517,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Architecto ab et libero ea aut. - example: Corrupti aut earum rerum ducimus dicta. + example: Iure ut. + example: Minus id deleniti. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Qui et. - brand_kit: Porro ea cum et magni adipisci. - has_credentials: false - id: Ad esse neque earum modi. - label: Ab voluptatem esse. - portal_id: Aut culpa impedit sit quibusdam nulla adipisci. - project_id: Quis possimus placeat. - sender_email: Dolorem molestias natus velit. - sender_name: Non dolorum odit est. - status: active - version: 8186374755967651666 + account_id: Debitis soluta sed quod dicta aperiam eveniet. + brand_kit: Voluptas expedita omnis ex. + has_credentials: true + id: Deleniti itaque voluptas magnam. + label: Consequuntur sit libero autem ut. + portal_id: Accusantium sequi modi corrupti esse mollitia. + project_id: Voluptatem modi velit vitae optio ut. + sender_email: Saepe rerum sunt eum et qui aut. + sender_name: Ut quia harum. + status: error + version: 6360555217771164808 "400": description: 'BadRequest: Bad request' content: @@ -1603,12 +1606,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. responses: "200": description: OK response. @@ -1618,24 +1621,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et rerum repudiandae et at iusto. - example: Voluptas esse qui quisquam quae est magni. + example: Eum autem quia quis soluta nostrum cumque. + example: Quia velit. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Ut aut. - brand_kit: Ut voluptas et accusamus natus. - has_credentials: false - id: Saepe rerum sunt eum et qui aut. - label: Voluptas expedita omnis ex. - portal_id: Minima ut quasi voluptatum officia quod error. - project_id: Ut quia harum. - sender_email: Quia inventore est quia enim illo. - sender_name: Eligendi aperiam. - status: error - version: 9020823344753101103 + account_id: Autem recusandae totam. + brand_kit: Similique deserunt iusto. + has_credentials: true + id: Ex delectus. + label: Officia quidem non qui voluptates natus cum. + portal_id: Odit necessitatibus veritatis amet ut rerum quidem. + project_id: Voluptas ullam dolores rem. + sender_email: Iusto velit quo voluptatibus modi reiciendis aliquam. + sender_name: Quidem explicabo expedita sunt. + status: active + version: 3951189417473657674 "400": description: 'BadRequest: Bad request' content: @@ -1717,7 +1720,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. responses: "204": description: No Content response. @@ -1784,7 +1787,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Et officia sequi et quam. + message: Aspernatur possimus. ok: true "404": description: 'NotFound: Resource not found' @@ -1889,21 +1892,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur sint et vel molestiae. - example: Natus pariatur et et sed debitis. + example: Tempore qui est. + example: Provident saepe aliquam architecto non vero. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Ducimus sequi. + account_id: Accusamus vero et voluptas accusamus sunt. has_credentials: true - id: Et placeat. - label: Aut et. - org_id: Culpa voluptas quia tenetur. - project_id: Qui esse. - status: inactive - version: 3277300697475451657 + id: Minus voluptas asperiores debitis labore aut. + label: Distinctio ipsa nihil ad hic repellendus nobis. + org_id: Vel blanditiis sunt ut facere. + project_id: Porro ab id necessitatibus consequatur natus tempora. + status: error + version: 4876542408988375571 "404": description: 'NotFound: Resource not found' content: @@ -1958,10 +1961,10 @@ paths: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. responses: "201": description: Created response. @@ -1971,21 +1974,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Cupiditate est illo repellat et cum repellat. - example: Facilis repellat eveniet reiciendis. + example: Natus aliquam aut quas aliquid. + example: Praesentium beatae quis ut eius. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Deserunt magni voluptas odio assumenda totam. + account_id: Facere harum enim consequatur id voluptatem. has_credentials: true - id: Nobis ipsam. - label: Velit sapiente qui iusto quis magni et. - org_id: Officiis deleniti ipsam nam. - project_id: Aut voluptatem inventore ab. - status: deleted - version: 6633489521806040497 + id: Ducimus sequi. + label: Quia tenetur ducimus. + org_id: Consequatur dolorum sint voluptatem voluptas omnis est. + project_id: Autem ab voluptas culpa. + status: active + version: 4064850428710517856 "400": description: 'BadRequest: Bad request' content: @@ -2058,7 +2061,7 @@ paths: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" responses: "200": @@ -2069,21 +2072,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quaerat iure ipsam. - example: Minima adipisci aut quia quisquam. + example: Voluptas consequatur iusto nostrum pariatur. + example: Quidem minus pariatur praesentium. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Minus voluptas asperiores debitis labore aut. - has_credentials: true - id: Enim consequatur id voluptatem adipisci alias. - label: Tempora ipsum aut enim harum. - org_id: Necessitatibus consequatur natus tempora ut. - project_id: Sequi consequatur dolorum sint voluptatem voluptas omnis. + account_id: Et corporis officia sint. + has_credentials: false + id: Consequatur omnis quidem est non tenetur. + label: Voluptatibus qui cupiditate voluptatem. + org_id: Quia nulla autem ratione. + project_id: Deleniti dolores commodi. status: error - version: 7443611122231905788 + version: 874315130556833044 "400": description: 'BadRequest: Bad request' content: @@ -2165,7 +2168,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. responses: "204": description: No Content response. @@ -2232,8 +2235,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Nihil ad hic repellendus nobis voluptatem. - ok: true + message: Mollitia a magni vel consequatur ea deserunt. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2337,22 +2340,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Incidunt sit. - example: Totam tempora quod expedita. + example: Deserunt reiciendis dolorem totam voluptatem. + example: Repudiandae molestias est consectetur porro quo pariatur. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Asperiores ipsum quam. - app_id: Cum rem architecto vel quibusdam vel autem. + account_id: Aut et. + app_id: Quia laboriosam magnam unde hic. has_credentials: false - id: Non praesentium voluptas saepe sit. - label: Reiciendis qui id tenetur exercitationem aperiam incidunt. - page_id: Qui suscipit rerum quo eligendi tempora. - project_id: Sed qui. - status: active - version: 5968285761891001183 + id: Facilis facilis aut suscipit aut odio iste. + label: Tenetur velit quaerat aut. + page_id: Distinctio ea totam rem harum provident. + project_id: Deleniti earum magni quibusdam. + status: deleted + version: 5896744453366252956 "404": description: 'NotFound: Resource not found' content: @@ -2407,12 +2410,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. responses: "201": description: Created response. @@ -2422,22 +2425,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quia facilis sit. - example: Possimus accusantium expedita alias. + example: Voluptas libero pariatur ut qui sint. + example: Quasi esse corporis molestiae excepturi suscipit. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Ratione quis. - app_id: Aut assumenda unde occaecati eum tenetur nam. + account_id: Quibusdam vel autem modi id facere. + app_id: Possimus expedita qui. has_credentials: true - id: Voluptatibus qui cupiditate voluptatem. - label: Ut in possimus quia nulla. - page_id: Vel consequatur ea deserunt. - project_id: Et corporis officia sint. - status: error - version: 935673982343451083 + id: Eius voluptatem molestiae qui suscipit rerum. + label: Rem architecto. + page_id: Et maxime. + project_id: Eligendi tempora quos. + status: deleted + version: 8688592599556109682 "400": description: 'BadRequest: Bad request' content: @@ -2510,9 +2513,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. responses: "200": description: OK response. @@ -2522,22 +2525,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit harum ipsa et. - example: Commodi et nihil et. + example: Ut ea. + example: Aliquam eum molestiae. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Aliquid ducimus quia. - app_id: Quas tenetur velit quaerat aut. + account_id: Vero commodi est qui asperiores velit enim. + app_id: Architecto dicta. has_credentials: true - id: Hic delectus. - label: Quibusdam aliquam consequuntur. - page_id: Aut odio iste assumenda deleniti earum magni. - project_id: Maxime ut possimus expedita. - status: inactive - version: 7469982570284737303 + id: Atque rerum et officiis sapiente et et. + label: Eligendi ea vel consequatur nihil. + page_id: Ut est recusandae aspernatur eum fugit voluptas. + project_id: Dolores in hic rem. + status: deleted + version: 2446786767075191046 "400": description: 'BadRequest: Bad request' content: @@ -2619,8 +2622,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. responses: "204": description: No Content response. @@ -2687,8 +2690,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Et quo. - ok: false + message: Numquam doloremque et qui perferendis ut. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -2792,21 +2795,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Amet qui provident. - example: Ut ea. + example: Debitis iusto molestias itaque. + example: Fugit et soluta. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Ut tempora consequuntur cumque repudiandae omnis ut. - customer_id: Est aut labore sint natus. + account_id: Doloremque architecto ea et. + customer_id: Exercitationem soluta possimus a. has_credentials: false - id: Vero quis consequuntur. - label: Ut fugiat magnam quia. - project_id: Quis quo illum cum quod. + id: Sed maiores qui sed exercitationem quam. + label: Et et veritatis voluptas nobis. + project_id: Non sint praesentium quia. status: active - version: 343208040254291221 + version: 2312965176389631300 "404": description: 'NotFound: Resource not found' content: @@ -2860,14 +2863,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. responses: "201": description: Created response. @@ -2877,21 +2880,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Earum laboriosam dignissimos reiciendis et quisquam. - example: Deserunt reiciendis dolorem totam voluptatem. + example: Dolorem labore laboriosam repellat harum. + example: Aut eos. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Autem aspernatur ea voluptatem. - customer_id: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Quia sed omnis quaerat aut. + customer_id: Magnam cumque quasi magni ducimus. has_credentials: true - id: Eos explicabo non quidem. - label: Nam voluptas sed et doloremque reiciendis pariatur. - project_id: Debitis itaque itaque dolores nihil. - status: deleted - version: 8497111294039610948 + id: Ducimus debitis nesciunt quas quibusdam occaecati cum. + label: Nostrum laborum minima. + project_id: Iste voluptatem et voluptatem ut ut. + status: error + version: 3654633208585641813 "400": description: 'BadRequest: Bad request' content: @@ -2963,9 +2966,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. responses: "200": description: OK response. @@ -2975,21 +2978,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Laudantium doloremque aut eligendi perferendis aut. - example: Consectetur delectus libero id. + example: Et qui officiis repudiandae qui iste accusantium. + example: Consequatur provident ea sint. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: In expedita. - customer_id: Magni ducimus nulla suscipit sed minus soluta. - has_credentials: false - id: Iste voluptatem et voluptatem ut ut. - label: Quia sed omnis quaerat aut. - project_id: Nostrum laborum minima. - status: error - version: 7283482467977491974 + account_id: Quis possimus placeat. + customer_id: Et qui et. + has_credentials: true + id: Dignissimos voluptate iste. + label: Ad esse neque earum modi. + project_id: Aut qui est iste. + status: active + version: 280885210133145304 "400": description: 'BadRequest: Bad request' content: @@ -3071,10 +3074,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. responses: "204": description: No Content response. @@ -3141,8 +3144,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sed maiores qui sed exercitationem quam. - ok: true + message: Quo quae aut culpa. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -3246,20 +3249,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sed ipsam enim esse iure est. - example: Aut sunt ex et autem delectus. + example: Corrupti aut earum rerum ducimus dicta. + example: Perspiciatis a aut quas delectus a. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Ipsam temporibus sint et necessitatibus dolorem ut. + account_id: Incidunt aut aperiam et ipsam. has_credentials: true - id: Quidem illo numquam doloremque et. - label: Fugiat adipisci eos rerum. - project_id: Perferendis ut quia aut. - status: active - version: 1442766184420227830 + id: Pariatur consequatur iste sed illo. + label: Consectetur porro quo. + project_id: Sunt ipsa. + status: error + version: 6549464945762782488 "404": description: 'NotFound: Resource not found' content: @@ -3314,11 +3317,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. responses: "201": description: Created response. @@ -3328,20 +3331,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dolorem omnis aspernatur veritatis adipisci. - example: Voluptas ipsam iste. + example: Consectetur delectus libero id. + example: Aut sit iste. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Asperiores velit enim tempore expedita ut. - has_credentials: false - id: Sapiente et et itaque dolores in. - label: Consequatur nihil explicabo vero commodi est. - project_id: Rem dolores eligendi ea. - status: deleted - version: 2256150830368172012 + account_id: Neque ipsum nihil cumque repellendus. + has_credentials: true + id: Sit iusto. + label: Architecto unde rerum quisquam ut. + project_id: Voluptates neque expedita. + status: inactive + version: 3464454785938965677 "400": description: 'BadRequest: Bad request' content: @@ -3414,7 +3417,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. responses: "200": description: OK response. @@ -3424,20 +3427,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Adipisci omnis veritatis omnis praesentium omnis. - example: Natus aliquam aut quas aliquid. + example: Consequatur iste eum amet vel impedit et. + example: Adipisci et laboriosam veritatis saepe numquam rem. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Architecto unde rerum quisquam ut. - has_credentials: true - id: Veniam debitis aut similique ullam temporibus qui. - label: Voluptates neque expedita. - project_id: Sit iusto. - status: deleted - version: 2250019048790832853 + account_id: Est consequatur eveniet in fuga ut. + has_credentials: false + id: Recusandae beatae aliquam quia officiis hic ea. + label: Vitae quae debitis sunt aperiam ex voluptatibus. + project_id: Ut dolor velit. + status: active + version: 2352400902970282412 "400": description: 'BadRequest: Bad request' content: @@ -3519,9 +3522,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. responses: "204": description: No Content response. @@ -3588,8 +3591,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Repellendus sint. - ok: true + message: Ratione consequuntur aut et corrupti. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -3693,21 +3696,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ullam voluptatibus nihil. - example: Voluptas consequatur iusto nostrum pariatur. + example: Ullam sunt rem non doloribus. + example: Corrupti ipsum. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Numquam quia. - funding_instrument_id: Autem provident est. + account_id: Dignissimos necessitatibus consequuntur. + funding_instrument_id: Ipsum voluptatem et quam beatae laborum omnis. has_credentials: true - id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Sit ex commodi sapiente a illum. - project_id: Pariatur voluptas odit fuga illo. - status: active - version: 4562568070495708080 + id: Error necessitatibus et autem doloribus est. + label: Repudiandae voluptatem vitae iste maxime modi laborum. + project_id: Maxime labore illo maxime provident. + status: error + version: 1380295609570133746 "404": description: 'NotFound: Resource not found' content: @@ -3762,13 +3765,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. responses: "201": description: Created response. @@ -3778,21 +3781,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Saepe non tempore. - example: Tempore qui est. + example: Voluptas esse qui quisquam quae est magni. + example: Quibusdam accusamus possimus. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Est consequatur eveniet in fuga ut. - funding_instrument_id: Accusamus ratione consequuntur aut et corrupti. - has_credentials: false - id: Beatae aliquam quia officiis hic ea. - label: Vitae quae debitis sunt aperiam ex voluptatibus. - project_id: Ut dolor velit. - status: active - version: 2352400902970282412 + account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + funding_instrument_id: Eaque animi molestias error laudantium. + has_credentials: true + id: Quis et odio tenetur optio. + label: Iste eveniet laudantium rerum. + project_id: Ut sint. + status: error + version: 7980949958307848867 "400": description: 'BadRequest: Bad request' content: @@ -3865,8 +3868,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. responses: "200": description: OK response. @@ -3876,21 +3879,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Laborum ut magnam aut illum commodi placeat. - example: Voluptas libero pariatur ut qui sint. + example: Consequuntur quia et saepe aperiam. + example: Accusamus ipsa qui. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - funding_instrument_id: Eaque animi molestias error laudantium. + account_id: Nobis nam. + funding_instrument_id: Reiciendis pariatur quisquam. has_credentials: true - id: Quis et odio tenetur optio. - label: Iste eveniet laudantium rerum. - project_id: Ut sint. + id: Aut quis qui laudantium dolore. + label: Non quidem doloribus debitis itaque itaque dolores. + project_id: Possimus nihil qui enim ratione voluptatem eos. status: error - version: 7980949958307848867 + version: 7616558197057713508 "400": description: 'BadRequest: Bad request' content: @@ -3972,10 +3975,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. responses: "204": description: No Content response. @@ -4042,8 +4045,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Odio adipisci dolore iste ipsa. - ok: true + message: Ea voluptatem eum voluptas eveniet. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -4097,8 +4100,8 @@ paths: schema: type: string description: Job UUID - example: Ipsa sint optio nobis quae corporis. - example: Et iste. + example: Sit harum ipsa et. + example: Dignissimos fugiat voluptatibus natus. responses: "200": description: OK response. @@ -4107,9 +4110,21 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Veniam et. - job_id: Iure modi asperiores ut. - result: Autem voluptates iste. + error: Reiciendis et perspiciatis saepe consequatur doloribus. + job_id: Velit minus. + result: + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. status: running "400": description: 'BadRequest: Bad request' @@ -4182,80 +4197,80 @@ components: properties: copy: description: Ad copy - example: Eaque ut laudantium nostrum ratione. + example: Odit odio praesentium. etag: type: string description: ETag header value (mirrors version) - example: Non iusto odit consequatur in vero soluta. + example: Eaque ratione debitis nam blanditiis. event_details: description: Extracted event/course details - example: Laboriosam nostrum quos expedita voluptas. + example: Dolorem fugiat et aspernatur voluptatem nobis. event_slug: type: string description: Event/course slug - example: Deserunt labore et id aut et adipisci. + example: Nihil sunt doloremque. id: type: string description: Brief UUID - example: Et qui ut libero numquam. + example: Vero at ut quis. keywords: description: Keyword list - example: Eius laborum. + example: Eveniet sint voluptatibus quam dicta. platforms: type: array items: type: string - example: Voluptates ut culpa saepe necessitatibus. + example: Ea architecto autem iste. description: Suggested default platforms example: - - Enim id voluptas aperiam distinctio. - - Harum eos eveniet ut. + - Ipsa tempore incidunt velit provident. + - Magni tempore sunt itaque omnis. + - Ex sunt sit beatae. + - Modi voluptatum veniam molestiae quibusdam. program_type: type: string description: Funnel context - example: Esse voluptate eum laboriosam distinctio non. + example: Qui maiores quia non unde deserunt. project_id: type: string description: Owning project - example: Ullam facilis ab sapiente voluptatem. + example: Molestiae aut fugit alias. status: type: string description: Lifecycle status - example: approved + example: draft enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Voluptate itaque fugit rerum cumque. + example: Consequuntur voluptatem est qui. url: type: string description: Event/course page URL - example: Ut molestiae. + example: Ut ut odio odio sed minus quia. version: type: integer description: Optimistic-concurrency version - example: 7582961521318439491 + example: 6644792324746576285 format: int64 example: - copy: Ut ut odio odio sed minus quia. - etag: Itaque omnis ut. - event_details: Nihil sunt doloremque. - event_slug: Porro ut et cupiditate. - id: Eius dicta. - keywords: Ea architecto autem iste. + copy: Iure culpa est possimus dolores dignissimos. + etag: Id eum aut et itaque. + event_details: Itaque est fugiat aut dicta. + event_slug: Magnam quisquam et consequuntur ut sunt. + id: Ex aut quia distinctio consequatur. + keywords: Velit laudantium error. platforms: - - Necessitatibus dolorem enim beatae. - - Minus vero at ut quis. - - Molestiae aut fugit alias. - - Qui maiores quia non unde deserunt. - program_type: Non assumenda perspiciatis. - project_id: Ullam distinctio dolore velit. + - Beatae sed aut quia nihil est. + - Qui fugiat. + program_type: Provident repudiandae sit qui aut aut. + project_id: Dolor corporis consequatur voluptatem voluptates sed. status: draft - targeting: In ipsa tempore incidunt velit provident perspiciatis. - url: Ea ullam minima voluptatem vel deleniti. - version: 1281384136826250351 + targeting: Et aut quia beatae. + url: Et velit fuga quos est. + version: 9139670973455309725 required: - id - project_id @@ -4268,40 +4283,39 @@ components: properties: copy: description: Ad copy - example: Quod enim pariatur et occaecati veritatis voluptatem. + example: Ut aperiam voluptate voluptates. event_details: description: Extracted event/course details - example: Iure enim dolore est. + example: Eum necessitatibus alias. event_slug: type: string description: Event/course slug - example: Nihil atque. + example: Provident dicta tenetur voluptatem voluptate dolor. id: type: string description: Brief UUID - example: Et optio sed omnis aut voluptatem voluptas. + example: Ad quis aperiam deserunt nostrum. keywords: description: Keyword list - example: Architecto aliquam mollitia labore sapiente dolores tenetur. + example: Sapiente molestiae dolorum repellat expedita ut. platforms: type: array items: type: string - example: Vero ad ex consequatur dolore. + example: Odio sunt esse mollitia incidunt. description: Suggested default platforms example: - - Beatae eaque quo atque. - - Error eligendi incidunt accusamus excepturi inventore. - - Est ut voluptas quod. - - Dolor qui molestiae id aut. + - Laborum sed molestias veritatis itaque. + - Est quis impedit. + - Illo harum et consequatur. program_type: type: string description: Funnel context - example: Et eum inventore quisquam. + example: Qui minima in nulla sunt autem eos. project_id: type: string description: Owning project - example: Eum omnis est blanditiis maxime et. + example: Et sed praesentium libero. status: type: string description: Lifecycle status @@ -4312,31 +4326,33 @@ components: - archived targeting: description: Targeting recommendation - example: Accusamus qui. + example: Dolor quam dolor consectetur eos iste. url: type: string description: Event/course page URL - example: Nihil facilis sunt. + example: Provident porro. version: type: integer description: Optimistic-concurrency version - example: 1931126915939314041 + example: 709937816203366628 format: int64 example: - copy: Necessitatibus sit. - event_details: Sit dignissimos incidunt voluptas. - event_slug: Reiciendis enim. - id: Mollitia ea. - keywords: Quis aperiam deserunt nostrum consectetur et sed. + copy: Animi sit esse ratione aliquid. + event_details: Repudiandae tenetur aperiam saepe vel. + event_slug: Alias minus reprehenderit dignissimos aut velit. + id: Quis veniam iusto consequatur quia. + keywords: Laborum est quasi dignissimos. platforms: - - Nemo nihil dolorum consequatur sed tempora qui. - - Hic vel aspernatur at quam est ea. - program_type: Ad quae nisi. - project_id: Et amet sunt. - status: approved - targeting: Libero blanditiis. - url: Cum et ab ipsum. - version: 1441686313140477581 + - Omnis doloribus. + - Cum ut quo. + - Necessitatibus id sint dicta assumenda omnis voluptatem. + - Praesentium voluptatem blanditiis non totam temporibus. + program_type: Impedit dolores. + project_id: Officia eligendi alias. + status: draft + targeting: Velit quis harum recusandae est ipsum. + url: At sint laborum veniam. + version: 285293330655778463 required: - id - project_id @@ -4349,77 +4365,75 @@ components: properties: copy: description: Ad copy - example: Praesentium et. + example: Reiciendis sit minima. event_details: description: Extracted event/course details - example: Dolor consectetur eos iste. + example: Eligendi ipsam aut vel atque. event_slug: type: string description: Event/course slug - example: Dolores laborum sed. + example: Perspiciatis alias et amet ex molestiae. id: type: string description: Brief UUID - example: Nulla sunt autem eos rerum provident dicta. + example: Modi repellat eum. keywords: description: Keyword list - example: Veniam iusto consequatur quia sed officia eligendi. + example: Unde et. platforms: type: array items: type: string - example: Est quis impedit. + example: Pariatur mollitia incidunt autem. description: Suggested default platforms example: - - Harum et consequatur eligendi eum necessitatibus. - - Magnam ut. - - Voluptate voluptates corrupti sapiente. - - Dolorum repellat expedita ut recusandae dolor. + - Voluptate fuga ea distinctio maiores mollitia aut. + - Rerum cum eaque nesciunt est totam inventore. program_type: type: string description: Funnel context - example: Commodi odio sunt esse mollitia incidunt. + example: Eligendi magni quidem sit in quia. project_id: type: string description: Owning project - example: Voluptatem voluptate dolor dolores provident. + example: Voluptatem eos doloribus sint. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Qui impedit. + example: Ut dolores in voluptas. url: type: string description: Event/course page URL - example: Veritatis itaque. + example: Minus libero et consequuntur suscipit. version: type: integer description: Optimistic-concurrency version - example: 1624749011573187666 + example: 3896136867528920326 format: int64 example: - copy: Amet quaerat modi. - event_details: Velit quis harum recusandae est ipsum. - event_slug: Quo necessitatibus necessitatibus. - id: Minus reprehenderit dignissimos aut velit. - keywords: Eum totam voluptatem eos. + copy: Sapiente harum aliquam sunt eum rerum eaque. + event_details: Voluptatem sint hic. + event_slug: Aut omnis labore et quis consequatur dolores. + id: Numquam molestias quibusdam aliquid deleniti. + keywords: Facere voluptatibus. platforms: - - Voluptatem rerum praesentium voluptatem blanditiis non. - - Temporibus in repudiandae tenetur. - - Saepe vel aut animi sit esse ratione. - - Blanditiis laborum est quasi dignissimos. - program_type: Repellendus omnis doloribus amet cum. - project_id: At sint laborum veniam. + - Minima aut fugit eos et iure laudantium. + - Est molestiae voluptates ipsum neque sapiente aliquid. + - Velit sunt molestiae eius. + - Reprehenderit nobis hic eos magni. + program_type: Est natus sequi beatae. + project_id: Est aliquam debitis natus. status: approved - targeting: Sint exercitationem. - url: Sint dicta. - version: 6296331077615132388 + targeting: Nisi repudiandae. + url: Nostrum similique omnis iste. + version: 7605661861379582739 required: - id - project_id @@ -4432,39 +4446,39 @@ components: properties: copy: description: Ad copy - example: Placeat dolores numquam molestias quibusdam aliquid. + example: Delectus veniam vel est et magni. event_details: description: Extracted event/course details - example: Et itaque ut dolores in voluptas. + example: Vero consequatur possimus aut assumenda. event_slug: type: string description: Event/course slug - example: Autem quo tempora voluptate fuga. + example: Recusandae ut ullam aliquam dolore iure. id: type: string description: Brief UUID - example: Sit in quia molestiae perspiciatis alias et. + example: Velit omnis dolorem est aut. keywords: description: Keyword list - example: Fuga est aliquam debitis. + example: Et provident illo non quisquam iure doloremque. platforms: type: array items: type: string - example: Rerum cum eaque nesciunt est totam inventore. + example: Officia natus quia labore. description: Suggested default platforms example: - - Ipsam aut vel. - - Eos reiciendis. - - Minima non. + - Dolores et incidunt voluptatem ipsa. + - Assumenda excepturi. + - Tempora est eveniet sequi ea. program_type: type: string description: Funnel context - example: Libero et consequuntur suscipit distinctio pariatur mollitia. + example: Consequuntur esse culpa. project_id: type: string description: Owning project - example: Ex molestiae praesentium. + example: Recusandae dignissimos dolore harum totam tempora vitae. status: type: string description: Lifecycle status @@ -4475,32 +4489,33 @@ components: - archived targeting: description: Targeting recommendation - example: Deleniti est natus sequi beatae consectetur. + example: Ut aliquid. url: type: string description: Event/course page URL - example: Distinctio maiores mollitia aut. + example: Minus nostrum iste nemo fugiat sunt. version: type: integer description: Optimistic-concurrency version - example: 7075859053648216976 + example: 1796419171074064120 format: int64 example: - copy: Distinctio tempore qui velit omnis dolorem est. - event_details: Voluptatibus nihil nisi. - event_slug: Est molestiae voluptates ipsum neque sapiente aliquid. - id: Et quis consequatur dolores repellat nostrum similique. - keywords: Quia recusandae dignissimos dolore harum totam. + copy: Commodi qui mollitia et eum veniam. + event_details: Alias voluptatem ut consequatur ut recusandae. + event_slug: Ab laboriosam sunt quis omnis. + id: Veritatis impedit aut. + keywords: Aliquam eaque voluptatem omnis. platforms: - - Nobis hic eos magni eos voluptatem. - - Hic ut sapiente harum aliquam sunt eum. - - Eaque occaecati. - program_type: Minima aut fugit eos et iure laudantium. - project_id: Iste aliquid. - status: draft - targeting: Vitae illo consequuntur esse. - url: Velit sunt molestiae eius. - version: 7533657070215672415 + - Alias temporibus illum impedit ullam. + - Suscipit harum. + - Neque quia. + - Et veniam itaque optio consequatur nulla sint. + program_type: Exercitationem accusamus pariatur saepe ab qui. + project_id: Earum doloribus. + status: approved + targeting: Cupiditate aut. + url: Sunt quis odio enim nam id voluptatem. + version: 232152934679383541 required: - id - project_id @@ -4513,73 +4528,75 @@ components: properties: copy: description: Ad copy - example: Et provident illo non quisquam iure doloremque. + example: Qui rerum numquam quo omnis a quia. event_details: description: Extracted event/course details - example: Est et magni. + example: Itaque qui repudiandae magnam atque. event_slug: type: string description: Event/course slug - example: Voluptatem ipsa. + example: Soluta dolore vitae. id: type: string description: Brief UUID - example: Ut ullam aliquam dolore iure consequatur. + example: Minima iure quos enim occaecati beatae. keywords: description: Keyword list - example: Ut aliquid. + example: Culpa ipsam totam nulla. platforms: type: array items: type: string - example: Tempora est eveniet sequi ea. + example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. description: Suggested default platforms example: - - Consequatur possimus. - - Assumenda sit delectus veniam. + - Voluptatem aut debitis vitae unde velit eos. + - Accusantium odit rerum commodi ea. + - Consequatur et. program_type: type: string description: Funnel context - example: Quia labore non ut dolores et. + example: Quaerat et eius culpa magni illum consequatur. project_id: type: string description: Owning project - example: Nostrum iste nemo fugiat sunt deleniti officia. + example: Molestiae ad voluptatum ducimus accusantium et. status: type: string description: Lifecycle status - example: archived + example: approved enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Repellendus eveniet veritatis impedit aut iste earum. + example: Molestias sint sequi. url: type: string description: Event/course page URL - example: Assumenda excepturi. + example: In commodi et asperiores et. version: type: integer description: Optimistic-concurrency version - example: 2088061558739708952 + example: 122602759626083426 format: int64 example: - copy: Commodi qui mollitia et eum veniam. - event_details: Alias voluptatem ut consequatur ut recusandae. - event_slug: Quis odio enim nam id voluptatem. - id: Accusamus pariatur saepe. - keywords: Aliquam eaque voluptatem omnis. + copy: Fuga atque. + event_details: Qui omnis nesciunt qui consequuntur. + event_slug: Minima dolorem sit est tempora qui. + id: Placeat perferendis omnis ad voluptas. + keywords: Sequi culpa. platforms: - - Eaque suscipit harum sint neque quia fuga. - - Veniam itaque optio consequatur nulla sint. - program_type: Laboriosam sunt quis omnis animi. - project_id: Qui et. - status: approved - targeting: Cupiditate aut. - url: Vero alias temporibus illum. - version: 232152934679383541 + - Praesentium cumque illum pariatur odio molestias voluptatum. + - Nulla perferendis possimus deserunt iure et. + - Ea quidem ducimus tempora ea molestias. + program_type: Enim totam. + project_id: Voluptates laboriosam cumque mollitia quidem quo. + status: draft + targeting: Odit provident sed quo aperiam. + url: Voluptas necessitatibus cumque non porro qui molestias. + version: 4353559979947303924 required: - id - project_id @@ -4592,54 +4609,56 @@ components: properties: copy: description: Ad copy - example: Optio labore omnis. + example: Voluptas aperiam. event_details: description: Extracted event/course details - example: Sunt omnis mollitia aut rerum quis et. + example: Dolores enim. event_slug: type: string description: Event/course slug (unique within the project) - example: Amet enim non rem. + example: Rerum numquam amet deserunt rem quia. keywords: description: Keyword list - example: Nihil aut rerum est vel. + example: Assumenda harum eos eveniet ut et laboriosam. platforms: type: array items: type: string - example: Quos perferendis nisi blanditiis eveniet quasi ea. + example: Numquam omnis ullam facilis ab sapiente. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Corporis dolorum consequatur eius perferendis. - - Omnis vel voluptate necessitatibus enim et et. + - Esse voluptate eum laboriosam distinctio non. + - Deserunt labore et id aut et adipisci. + - Ut molestiae. + - Voluptates ut culpa saepe necessitatibus. program_type: type: string description: Funnel context - example: membership + example: education enum: - events - education - membership targeting: description: Targeting recommendation - example: Rem ab corporis. + example: Quos expedita voluptas qui eaque. url: type: string description: Event/course page URL - example: Voluptas deserunt quod officiis. + example: Ipsam dolores et et qui ut. example: - copy: Vitae vel omnis autem accusamus mollitia. - event_details: Corrupti voluptas. - event_slug: Dolorem repellendus porro et distinctio. - keywords: Assumenda aut harum eligendi rerum numquam amet. + copy: Porro ut et cupiditate. + event_details: Non assumenda perspiciatis. + event_slug: Nostrum ratione id. + keywords: Ea ullam minima voluptatem vel deleniti. platforms: - - Error aut maxime dicta qui. - - Quas suscipit eos nam ipsa. - - Velit et impedit facilis quaerat. - - Dolor ut velit quam omnis et dolor. + - Quae molestiae suscipit non iusto. + - Consequatur in vero soluta. + - Eius dicta. + - Ullam distinctio dolore velit. program_type: education - targeting: Rem quia vel ipsam dolores. - url: Aut assumenda fugiat quia eaque dolor porro. + targeting: Repudiandae necessitatibus dolorem enim beatae quia. + url: Laborum aspernatur voluptate itaque fugit. required: - program_type - event_slug @@ -4649,50 +4668,50 @@ components: brief_id: type: string description: Parent brief - example: Facere qui omnis. + example: Aut ut. campaign_name: type: string description: Campaign name - example: Dolores natus a sint quod sunt. + example: Aut ut sit nisi architecto. etag: type: string description: ETag header value (mirrors version) - example: Ipsa non. + example: Voluptate enim qui impedit temporibus. id: type: string description: Campaign UUID - example: Et itaque rem eos et deleniti dolores. + example: Et vel beatae molestiae fuga. platform: type: string description: Channel - example: Enim vitae officia dolorem odio. + example: Sed corrupti sit. platform_campaign_id: type: string description: ID returned by the ad platform - example: Beatae quia qui excepturi minima. + example: Labore quia esse consectetur tenetur eum. project_id: type: string description: Owning project - example: Facilis qui libero. + example: Vitae consequatur eos. status: type: string description: Campaign status - example: Et nesciunt iure quis in ut mollitia. + example: Rerum et recusandae possimus quis. version: type: integer description: Optimistic-concurrency version - example: 9203456138223090094 + example: 9161333083936888105 format: int64 example: - brief_id: Dolores sit. - campaign_name: Amet omnis. - etag: Sit cupiditate non. - id: Necessitatibus quibusdam. - platform: Exercitationem accusantium nihil. - platform_campaign_id: Quod alias ipsum voluptates pariatur magni. - project_id: Est accusantium laudantium nostrum. - status: At fugit dolor. - version: 6873369027351486557 + brief_id: Explicabo repudiandae aut reiciendis recusandae molestias. + campaign_name: Hic est quia pariatur odit ullam. + etag: Quisquam nisi repellendus quos magnam aut. + id: Eos omnis cumque nemo ipsam ut. + platform: Vel inventore aliquid aut non eligendi accusamus. + platform_campaign_id: Quod impedit accusamus incidunt minus veritatis enim. + project_id: Natus et unde. + status: Ex id corrupti sed quo perferendis. + version: 7863921121752869750 required: - id - project_id @@ -4707,45 +4726,45 @@ components: brief_id: type: string description: Parent brief - example: Quaerat et eius culpa magni illum consequatur. + example: Voluptates sit est corporis molestiae voluptatem. campaign_name: type: string description: Campaign name - example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. + example: Ratione ipsum. id: type: string description: Campaign UUID - example: Minima iure quos enim occaecati beatae. + example: Et incidunt. platform: type: string description: Channel - example: Soluta dolore vitae. + example: Expedita inventore qui necessitatibus ut necessitatibus in. platform_campaign_id: type: string description: ID returned by the ad platform - example: In commodi et asperiores et. + example: Autem maxime hic. project_id: type: string description: Owning project - example: Molestiae ad voluptatum ducimus accusantium et. + example: Dolor sed excepturi delectus. status: type: string description: Campaign status - example: Assumenda voluptatem aut debitis vitae. + example: Amet hic est. version: type: integer description: Optimistic-concurrency version - example: 529135087014785401 + example: 906675377577277444 format: int64 example: - brief_id: Et et itaque qui repudiandae magnam. - campaign_name: Quaerat molestias. - id: Eos eius. - platform: Ullam qui rerum numquam quo. - platform_campaign_id: A quia magnam culpa ipsam totam. - project_id: Odit rerum commodi ea et. - status: Sequi aut veniam ratione. - version: 4528974556497386277 + brief_id: Magnam voluptates molestiae libero autem quod. + campaign_name: Sunt accusantium totam quia. + id: Occaecati rerum reiciendis. + platform: Ullam ipsum. + platform_campaign_id: Dolores dolore id dolore sed. + project_id: Esse mollitia et dolorum accusantium aspernatur quos. + status: Accusantium debitis adipisci qui iste explicabo. + version: 9006499932988805057 required: - id - project_id @@ -4760,45 +4779,45 @@ components: brief_id: type: string description: Parent brief - example: Quo et enim totam et minima dolorem. + example: Dolor quia consectetur non nulla dolore. campaign_name: type: string description: Campaign name - example: In praesentium cumque. + example: Quos omnis. id: type: string description: Campaign UUID - example: Omnis ad voluptas esse voluptates. + example: Qui quia. platform: type: string description: Channel - example: Est tempora qui. + example: Ducimus voluptas soluta quod qui. platform_campaign_id: type: string description: ID returned by the ad platform - example: Voluptas necessitatibus cumque non porro qui molestias. + example: Fugiat est omnis inventore voluptatum ab totam. project_id: type: string description: Owning project - example: Cumque mollitia. + example: Ipsam sint autem repudiandae asperiores. status: type: string description: Campaign status - example: Pariatur odio molestias voluptatum. + example: Libero consequatur. version: type: integer description: Optimistic-concurrency version - example: 7642665711405677689 + example: 3986034538934721868 format: int64 example: - brief_id: Qui omnis nesciunt qui consequuntur. - campaign_name: Odit provident sed quo aperiam. - id: Perferendis possimus deserunt iure et. - platform: Fuga atque. - platform_campaign_id: Sequi culpa. - project_id: Ea quidem ducimus tempora ea molestias. - status: Aspernatur nihil et incidunt dolorem dolor sed. - version: 7197986407230546835 + brief_id: Reiciendis odit eos et quidem. + campaign_name: Quae voluptatem velit mollitia dolorem ea. + id: Sapiente ex est modi cupiditate possimus ducimus. + platform: Atque hic quam impedit placeat. + platform_campaign_id: Voluptatibus aliquam et. + project_id: Modi consequatur molestias et et deleniti. + status: Enim voluptas numquam. + version: 616047483519279742 required: - id - project_id @@ -4812,12 +4831,12 @@ components: properties: config: description: Per-platform campaign configuration - example: Voluptatum veniam molestiae. + example: Qui libero natus. platforms: type: array items: type: string - example: google-ads + example: twitter-ads enum: - google-ads - linkedin-ads @@ -4828,15 +4847,16 @@ components: - hubspot description: Platforms to create campaigns on (binding selection) example: + - microsoft-ads - meta-ads - - google-ads - twitter-ads + - hubspot example: - config: Aspernatur voluptatem nobis. + config: Vitae officia dolorem. platforms: - - google-ads - meta-ads - - microsoft-ads + - twitter-ads + - hubspot required: - platforms CampaignUpdateInput: @@ -4845,18 +4865,18 @@ components: campaign_name: type: string description: Campaign name - example: Modi possimus consequatur. + example: Id voluptatem nihil quaerat asperiores. config: description: Campaign configuration snapshot - example: Voluptatibus aspernatur. + example: Error perferendis quae qui inventore dolorem. status: type: string description: Campaign status - example: Eveniet esse officia explicabo dolor deserunt. + example: Repellat vel veritatis hic rerum accusamus. example: - campaign_name: Accusamus nam cupiditate. - config: Earum minus autem omnis qui debitis eum. - status: Hic vel ut. + campaign_name: Quasi in aut nam rerum. + config: Architecto deserunt vero ducimus distinctio. + status: Distinctio magnam. required: - campaign_name - status @@ -4900,14 +4920,14 @@ components: message: type: string description: Human-readable detail - example: Veniam dolores quidem necessitatibus. + example: Magni aut nisi est sit sint. ok: type: boolean description: Whether the credential authenticated against the provider example: false example: - message: Sit reiciendis et vel beatae molestiae. - ok: false + message: Et voluptas dolorem necessitatibus illum quisquam. + ok: true required: - ok CreateBriefRequestBody: @@ -4917,16 +4937,17 @@ components: $ref: '#/components/schemas/BriefInput' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. required: - brief CreateCampaignsRequestBody: @@ -4936,12 +4957,10 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Est voluptatum enim earum et doloribus. + config: Vitae reiciendis voluptatem. platforms: - - hubspot - - meta-ads - reddit-ads - - twitter-ads + - microsoft-ads required: - input CreateGoogleAdsRequestBody: @@ -4957,10 +4976,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - config - credentials @@ -4973,14 +4992,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - config - credentials @@ -4994,10 +5013,10 @@ components: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - config - credentials @@ -5011,12 +5030,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - config - credentials @@ -5029,14 +5048,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. required: - config - credentials @@ -5050,11 +5069,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - config - credentials @@ -5068,13 +5087,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - config - credentials @@ -5084,11 +5103,11 @@ components: account_id: type: string description: Provider account identifier - example: Hic est quia pariatur odit ullam. + example: Velit quis. etag: type: string description: ETag header value (mirrors version) - example: Sed quo perferendis nemo ut quisquam. + example: Vel architecto quae error dolor placeat. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5096,23 +5115,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Explicabo repudiandae aut reiciendis recusandae molestias. + example: Voluptatem nostrum. label: type: string description: Optional friendly name - example: Quod impedit accusamus incidunt minus veritatis enim. + example: Ut nobis. login_customer_id: type: string description: Manager account used for API access - example: Repellendus quos magnam. + example: Minus et. project_id: type: string description: Owning project - example: Vel inventore aliquid aut non eligendi accusamus. + example: Deleniti voluptas quo nostrum quia. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5121,18 +5140,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2175885598856983154 + example: 7197135224651925465 format: int64 example: - account_id: Quae qui inventore dolorem deserunt. - etag: Rerum sint. + account_id: Nostrum atque illum nesciunt adipisci odit corrupti. + etag: Voluptas omnis quidem dolor ipsum voluptas sed. has_credentials: true - id: In id voluptatem nihil quaerat. - label: Hic rerum accusamus velit error. - login_customer_id: Magnam adipisci architecto deserunt. - project_id: Pariatur repellat vel. - status: active - version: 1017420418363680400 + id: Fugiat aliquid aspernatur voluptatem in cupiditate. + label: Iusto fugit non asperiores quidem natus. + login_customer_id: Id ea. + project_id: Et dolorem quod. + status: deleted + version: 8604742619872904748 required: - id - project_id @@ -5147,31 +5166,31 @@ components: account_id: type: string description: Provider account identifier - example: Autem maxime hic. + example: Rem fugit accusantium est. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Harum voluptates sit est corporis. + example: Iusto eius dolor magnam necessitatibus amet. label: type: string description: Optional friendly name - example: Necessitatibus ut necessitatibus in. + example: Rerum tempore tempora. login_customer_id: type: string description: Manager account used for API access - example: Amet hic est. + example: Dolorem asperiores autem aut aut soluta. project_id: type: string description: Owning project - example: Voluptatem repellat expedita inventore. + example: Earum aut qui. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5180,17 +5199,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7828959688196597051 + example: 6983147448769937945 format: int64 example: - account_id: Libero autem quod saepe ullam ipsum. + account_id: Officia dolores et reprehenderit. has_credentials: false - id: Quaerat occaecati rerum. - label: Aspernatur quos est magnam voluptates. - login_customer_id: Dolore sed. - project_id: Quae esse mollitia et dolorum. - status: error - version: 3252068377050447352 + id: Et est et corporis. + label: Aut explicabo. + login_customer_id: Rerum rem. + project_id: Voluptate est reprehenderit consectetur accusamus eaque inventore. + status: deleted + version: 8504196254053832609 required: - id - project_id @@ -5204,27 +5223,27 @@ components: account_id: type: string description: Provider account identifier - example: Est ipsam sint autem repudiandae asperiores et. + example: Et vel dolorum aut inventore consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Sunt accusantium totam quia. + example: Vitae qui explicabo tempora accusantium aut. label: type: string description: Optional friendly name - example: Commodi qui. + example: Nobis qui sunt laboriosam ipsa. login_customer_id: type: string description: Manager account used for API access - example: Nulla dolore quibusdam ducimus voluptas soluta. + example: Dicta ut. project_id: type: string description: Owning project - example: Accusantium debitis adipisci qui iste explicabo. + example: In vel. status: type: string description: Connection status @@ -5237,17 +5256,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7019802315342385433 + example: 5579476471615779331 format: int64 example: - account_id: Ex est modi cupiditate. + account_id: Alias quod minima blanditiis. has_credentials: true - id: Qui at fugiat est omnis inventore. - label: Consequatur quisquam explicabo. - login_customer_id: Consequatur molestias et et deleniti sint. - project_id: Ab totam laboriosam quos omnis deserunt. - status: error - version: 765646658236151796 + id: Beatae error deleniti vitae molestiae qui nobis. + label: Quia enim non asperiores velit. + login_customer_id: Iure dolores dolores dolorem sit nihil. + project_id: Aut temporibus dolorem cumque quis. + status: inactive + version: 4548596825330631938 required: - id - project_id @@ -5261,7 +5280,7 @@ components: account_id: type: string description: Provider account identifier - example: Aliquam et asperiores quae voluptatem velit. + example: Ipsam eligendi est dolore. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5269,19 +5288,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Odit eos. + example: Sit est atque qui quaerat qui vitae. label: type: string description: Optional friendly name - example: Hic quam impedit placeat consequatur. + example: Optio in ratione accusamus quasi. login_customer_id: type: string description: Manager account used for API access - example: Enim voluptas numquam. + example: Quos excepturi natus est est. project_id: type: string description: Owning project - example: Quidem est. + example: Optio non. status: type: string description: Connection status @@ -5294,17 +5313,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5408757854107547795 + example: 6617602369183761406 format: int64 example: - account_id: Officia dolorem. - has_credentials: true - id: Et iusto eius dolor magnam necessitatibus. - label: Tempora voluptatem rem fugit accusantium est necessitatibus. - login_customer_id: Aut soluta quae et est et corporis. - project_id: Mollitia earum aut qui sit rerum. - status: inactive - version: 758133864872776679 + account_id: Quibusdam ea nam aut. + has_credentials: false + id: Doloribus unde id aut perspiciatis. + label: Sit totam ut et. + login_customer_id: Est consequatur rerum neque velit nulla modi. + project_id: Adipisci ut. + status: active + version: 926393304108038988 required: - id - project_id @@ -5339,25 +5358,25 @@ components: client_id: type: string description: OAuth client id - example: Sed corrupti sit. + example: In consectetur et culpa quaerat vel sed. client_secret: type: string description: OAuth client secret - example: Labore quia esse consectetur tenetur eum. + example: Et impedit quod. developer_token: type: string description: Google Ads developer token - example: Aut ut sit nisi architecto. + example: Magni omnis. refresh_token: type: string description: OAuth refresh token - example: Natus vitae consequatur eos sit aut ut. + example: Ipsa nihil esse. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Praesentium voluptate. - client_secret: Qui impedit temporibus eveniet eos omnis cumque. - developer_token: Ipsam ut sed natus et unde. - refresh_token: Rerum et recusandae possimus quis. + client_id: Sit id incidunt. + client_secret: Non sed hic minima est distinctio. + developer_token: A perferendis. + refresh_token: Facere eum aliquid est repellat assumenda. required: - refresh_token - client_id @@ -5369,47 +5388,47 @@ components: account_id: type: string description: Provider account identifier - example: Quia omnis commodi aspernatur pariatur nostrum. + example: Error eligendi incidunt accusamus excepturi inventore. brand_kit: type: string description: Per-project brand kit selector - example: Quia omnis in qui. + example: Aut architecto aliquam mollitia labore sapiente. etag: type: string description: ETag header value (mirrors version) - example: Perferendis est ipsum aut voluptas molestias. + example: Quod minima dolor. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolor ea iusto eveniet velit sint odit. + example: Nihil facilis sunt. label: type: string description: Optional friendly name - example: Quis quae quam enim. + example: Ut beatae eaque quo atque. portal_id: type: string description: HubSpot portal/account ID - example: Fuga voluptas ut vero autem consequuntur. + example: Molestiae id aut debitis iure. project_id: type: string description: Owning project - example: Ipsa eos nemo cupiditate et esse voluptate. + example: Vero ad ex consequatur dolore. sender_email: type: string description: Default sender address - example: Omnis a pariatur omnis. + example: Dolore est dolorem quod enim pariatur. sender_name: type: string description: Default sender name - example: Velit dolorem. + example: Occaecati veritatis. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -5418,21 +5437,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1005353535355254376 + example: 7262698057225531796 format: int64 example: - account_id: Veniam molestias. - brand_kit: Hic magni. - etag: Commodi recusandae. - has_credentials: false - id: Nihil ut. - label: Minus voluptatem ab delectus porro. - portal_id: Cumque rerum. - project_id: Mollitia nulla. - sender_email: Modi esse voluptatibus. - sender_name: Fugit dolorum nulla quo veritatis id. - status: error - version: 3871826656092488452 + account_id: Ad quae nisi. + brand_kit: Incidunt voluptas non necessitatibus. + etag: Cum et ab ipsum. + has_credentials: true + id: Tenetur non accusamus qui ex. + label: Ex et amet sunt. + portal_id: Qui nemo nihil dolorum consequatur. + project_id: Quia mollitia. + sender_email: Tempora qui eum hic vel aspernatur at. + sender_name: Est ea sed sit. + status: deleted + version: 7589133128297342291 required: - id - project_id @@ -5447,11 +5466,11 @@ components: account_id: type: string description: Provider account identifier - example: Itaque iure soluta autem. + example: Non in iure dolores et quis id. brand_kit: type: string description: Per-project brand kit selector - example: Atque qui dignissimos aut eaque eveniet. + example: Accusamus corrupti sint molestiae occaecati est quos. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5459,31 +5478,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Est eum ut ut amet et molestiae. + example: Sint consequuntur omnis distinctio possimus non aliquid. label: type: string description: Optional friendly name - example: Qui quae qui optio. + example: Excepturi est et est totam. portal_id: type: string description: HubSpot portal/account ID - example: Odit numquam quia. + example: Quia sed nesciunt minus. project_id: type: string description: Owning project - example: Nihil dolor exercitationem eum placeat dolores culpa. + example: Facilis neque sed alias dolore id. sender_email: type: string description: Default sender address - example: Aut dolores. + example: Non doloribus nam. sender_name: type: string description: Default sender name - example: Voluptatem beatae quis dignissimos voluptatem et labore. + example: Nulla suscipit. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5492,20 +5511,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3577746410602694753 + example: 1661229305097180791 format: int64 example: - account_id: Modi vel aut rerum. - brand_kit: Dolor eum et consequatur. - has_credentials: false - id: Ut unde dolore id. - label: Ad optio magnam sequi esse. - portal_id: Assumenda cum nemo esse nobis. - project_id: Necessitatibus fuga ducimus dolorem ut aspernatur. - sender_email: Aut dolorem ea veniam. - sender_name: Quae adipisci doloribus ullam. - status: deleted - version: 9002316743787506494 + account_id: Totam non qui. + brand_kit: Sunt labore voluptate. + has_credentials: true + id: Est ut ratione nobis. + label: Qui ut ut qui sed explicabo. + portal_id: Vero nulla laboriosam vel et et iure. + project_id: Occaecati tenetur minima veritatis sed impedit laborum. + sender_email: Exercitationem voluptatum perspiciatis autem. + sender_name: Eum ut. + status: active + version: 5481070480011205228 required: - id - project_id @@ -5519,11 +5538,11 @@ components: account_id: type: string description: Provider account identifier - example: At magnam saepe incidunt nisi est. + example: Consequatur laborum. brand_kit: type: string description: Per-project brand kit selector - example: Deleniti non in iure dolores et quis. + example: Aut tempora dolorem neque assumenda sed. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5531,31 +5550,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Optio enim nisi doloremque rerum sed consequatur. + example: Cum ipsum quo possimus. label: type: string description: Optional friendly name - example: Dolores dignissimos perferendis tempore eum laboriosam iure. + example: Cum ipsa molestias voluptatibus nam debitis hic. portal_id: type: string description: HubSpot portal/account ID - example: Possimus non aliquid qui. + example: Excepturi sit minus. project_id: type: string description: Owning project - example: Quia amet vero dolorum incidunt officia nihil. + example: Quam culpa. sender_email: type: string description: Default sender address - example: Neque sed alias. + example: Et quisquam dicta. sender_name: type: string description: Default sender name - example: Id ducimus excepturi est et est. + example: Eaque enim est libero enim quo. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5564,20 +5583,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6047270410556243251 + example: 2473646846997850541 format: int64 example: - account_id: Corrupti sint molestiae occaecati est. - brand_kit: Nesciunt sed magnam sed vero nulla. + account_id: Similique eaque autem impedit tenetur voluptatibus. + brand_kit: Et fuga veniam. has_credentials: true - id: Recusandae similique assumenda ut quia. - label: Nam eius nulla suscipit ullam. - portal_id: Ratione nobis ut occaecati tenetur minima veritatis. - project_id: Nesciunt minus natus non. - sender_email: Impedit laborum quaerat qui ut ut qui. - sender_name: Explicabo dolorem totam non. - status: error - version: 9169545032565251193 + id: Aspernatur ipsam consequatur qui illo totam fuga. + label: Qui non illum expedita commodi in dolores. + portal_id: Harum molestiae cupiditate ab et eum ex. + project_id: In tempore quo consequatur. + sender_email: Quia velit adipisci. + sender_name: Aliquid eum itaque qui recusandae recusandae. + status: deleted + version: 5418486313404831501 required: - id - project_id @@ -5591,39 +5610,39 @@ components: account_id: type: string description: Provider account identifier - example: Sunt labore voluptate. + example: Praesentium eos aspernatur voluptatum facilis laboriosam. brand_kit: type: string description: Per-project brand kit selector - example: Beatae non et excepturi sit minus. + example: Ab earum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Vel et et iure tempora. + example: Ea et iusto doloremque odio pariatur. label: type: string description: Optional friendly name - example: Eum ut. + example: Autem aliquid ratione est omnis. portal_id: type: string description: HubSpot portal/account ID - example: Possimus saepe quam culpa qui. + example: Alias et error nobis minima fuga reprehenderit. project_id: type: string description: Owning project - example: Voluptatum perspiciatis autem. + example: Expedita animi ut velit at. sender_email: type: string description: Default sender address - example: Ipsa molestias. + example: Impedit qui suscipit ipsa. sender_name: type: string description: Default sender name - example: Nam debitis hic qui consequatur laborum. + example: Animi fuga maxime tempora. status: type: string description: Connection status @@ -5636,20 +5655,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2692133725202625638 + example: 2736756583759126082 format: int64 example: - account_id: Aspernatur ipsam consequatur qui illo totam fuga. - brand_kit: Libero quia quam harum molestiae cupiditate. + account_id: Ab itaque tempore vel quia cum quas. + brand_kit: Sed commodi voluptatibus. has_credentials: true - id: Et quisquam dicta. - label: Aut tempora dolorem neque assumenda sed. - portal_id: Consequatur sint. - project_id: Eaque enim est libero enim quo. - sender_email: Non illum expedita commodi in dolores nemo. - sender_name: Eaque autem impedit tenetur voluptatibus. - status: inactive - version: 6362542183217834869 + id: Rerum perspiciatis dolor pariatur. + label: Quo soluta maxime temporibus earum et aperiam. + portal_id: Ipsa aut est et est debitis ea. + project_id: Amet officia occaecati quam nostrum quis voluptas. + sender_email: Eum voluptatum accusamus illo eveniet eum. + sender_name: Nemo molestiae modi ut non atque. + status: deleted + version: 5960975059584485019 required: - id - project_id @@ -5663,34 +5682,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Qui et assumenda quas. + example: Minus voluptatem ab delectus porro. brand_kit: type: string description: Per-project brand kit selector - example: Qui sed voluptatibus quam quia. + example: Modi esse voluptatibus. label: type: string description: Optional friendly name - example: Praesentium libero. + example: Mollitia nulla. portal_id: type: string description: HubSpot portal/account ID - example: Quisquam animi. + example: Veniam molestias. sender_email: type: string description: Default sender address - example: Delectus blanditiis magnam sed iure amet. + example: Accusamus quia velit commodi. sender_name: type: string description: Default sender name - example: Repudiandae facilis blanditiis libero nam. + example: Tenetur cumque rerum. example: - account_id: Molestiae omnis doloremque. - brand_kit: Aliquid explicabo eaque ab aut voluptas. - label: Deserunt et quidem sapiente. - portal_id: Perspiciatis modi dicta quae sed ut. - sender_email: Et atque. - sender_name: Impedit velit omnis incidunt. + account_id: Hic magni. + brand_kit: Nihil atque. + label: Fugit dolorum nulla quo veritatis id. + portal_id: Et optio sed omnis aut voluptatem voluptas. + sender_email: Eum omnis est blanditiis maxime et. + sender_name: Et eum inventore quisquam. required: - account_id HubspotCredentials: @@ -5699,10 +5718,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Nulla eos. + example: Quia omnis in qui. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Recusandae totam soluta. + private_app_token: Nihil ut. required: - private_app_token InternalServerError: @@ -5728,17 +5747,16 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Odit odio praesentium. + example: Ut beatae quia. platforms: type: array items: type: string - example: Sint voluptatibus quam dicta voluptate consequuntur. + example: Minima illo dolores natus a sint. description: Platforms this job will create on example: - - Qui temporibus quis iste eaque. - - Debitis nam. - - Delectus ex aut quia. + - Quae et nesciunt iure quis in. + - Mollitia nihil ducimus. status: type: string description: Initial status (always 'queued' on create) @@ -5746,11 +5764,10 @@ components: enum: - queued example: - job_id: Consequatur dolore dolor corporis consequatur voluptatem voluptates. + job_id: Non quo necessitatibus. platforms: - - Repudiandae sit qui aut aut. - - Magnam quisquam et consequuntur ut sunt. - - Et velit fuga quos est. + - Accusantium laudantium nostrum earum dolores. + - Eos exercitationem. status: queued required: - job_id @@ -5761,18 +5778,33 @@ components: error: type: string description: Terminal error, if any - example: Fugiat aut dicta libero. + example: Hic vel ut. job_id: type: string description: Job UUID - example: Officiis beatae sed aut. + example: Illo accusamus. result: + type: array + items: + $ref: '#/components/schemas/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state - example: Est quia qui fugiat est itaque. + example: + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. status: type: string description: Job status - example: succeeded + example: queued enum: - queued - running @@ -5780,10 +5812,22 @@ components: - partial - failed example: - error: Beatae harum similique corporis id eum. - job_id: Culpa est possimus dolores dignissimos. - result: Laudantium error eum et aut. - status: partial + error: Dolores quidem necessitatibus voluptatem consequatur sit. + job_id: Earum minus autem omnis qui debitis eum. + result: + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + status: running required: - job_id - status @@ -5793,31 +5837,31 @@ components: account_id: type: string description: Provider account identifier - example: Omnis corrupti facere eum aliquid est repellat. + example: Quidem omnis totam eos non molestias. etag: type: string description: ETag header value (mirrors version) - example: Incidunt mollitia non sed hic. + example: Recusandae illum accusamus debitis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Ex ipsa nihil esse voluptate in consectetur. + example: Doloribus voluptas mollitia doloremque totam. label: type: string description: Optional friendly name - example: Sed voluptatum et impedit quod rem. + example: Quia doloremque commodi rerum. org_id: type: string description: LinkedIn organization URN id - example: Est distinctio accusamus a perferendis. + example: Praesentium sint laudantium error. project_id: type: string description: Owning project - example: Culpa quaerat. + example: Veniam et ducimus quos amet. status: type: string description: Connection status @@ -5830,18 +5874,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6865823349289112261 + example: 6150421422111226538 format: int64 example: - account_id: Velit quis. - etag: Vel architecto quae error dolor placeat. + account_id: Quas quis corporis. + etag: Ea ducimus ipsum dolorem dignissimos. has_credentials: true - id: Voluptatem nostrum. - label: Ut nobis. - org_id: Minus et. - project_id: Deleniti voluptas quo nostrum quia. + id: Nihil iure officiis nemo quia. + label: Et quia ex et alias ea. + org_id: Quo ullam ad iusto quos. + project_id: Ducimus id sint eius aut. status: inactive - version: 7197135224651925465 + version: 2540282771582052941 required: - id - project_id @@ -5856,7 +5900,7 @@ components: account_id: type: string description: Provider account identifier - example: Ex dolor. + example: Sit soluta quia qui. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5864,23 +5908,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptate est reprehenderit consectetur accusamus eaque inventore. + example: Optio quia similique vero est impedit quo. label: type: string description: Optional friendly name - example: Officia dolores et reprehenderit. + example: Libero officia et quia. org_id: type: string description: LinkedIn organization URN id - example: Vitae qui explicabo tempora accusantium aut. + example: Expedita sed velit distinctio. project_id: type: string description: Owning project - example: Aut explicabo. + example: Nihil at. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5889,17 +5933,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2969272646168040903 + example: 1438953144952054594 format: int64 example: - account_id: Autem eaque eaque dicta ut magni. - has_credentials: true - id: In vel. - label: Et vel dolorum aut inventore consequatur. - org_id: Molestiae qui nobis culpa. - project_id: Nobis qui sunt laboriosam ipsa. - status: inactive - version: 32502071618905206 + account_id: Optio rerum vel molestiae id. + has_credentials: false + id: Necessitatibus eos rerum. + label: Qui quas aut provident suscipit. + org_id: Reiciendis excepturi. + project_id: Veniam amet et quisquam voluptatem fuga. + status: active + version: 8349066598252210000 required: - id - project_id @@ -5913,7 +5957,7 @@ components: account_id: type: string description: Provider account identifier - example: Dolores dolores. + example: Aut temporibus. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5921,23 +5965,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Temporibus dolorem cumque quis accusantium quia enim. + example: Aut tenetur. label: type: string description: Optional friendly name - example: Ipsum et et laudantium. + example: Iure aut tenetur ipsum ea ad ducimus. org_id: type: string description: LinkedIn organization URN id - example: Sit est atque qui quaerat qui vitae. + example: Voluptatem libero. project_id: type: string description: Owning project - example: Asperiores velit aut alias quod minima. + example: Et et. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5946,17 +5990,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1323696837483058057 + example: 8572511867951081487 format: int64 example: - account_id: Consequatur aut vero. + account_id: Accusamus eos neque velit. has_credentials: true - id: Optio non. - label: Ipsam eligendi est dolore. - org_id: Est saepe doloribus unde id. - project_id: Optio in ratione accusamus quasi. - status: active - version: 4544790407326456577 + id: Eligendi non. + label: Aut amet aut voluptatum magnam. + org_id: Quisquam perspiciatis ipsam aperiam et totam in. + project_id: Necessitatibus non eum ipsum eveniet quam. + status: error + version: 786757177338717877 required: - id - project_id @@ -5970,7 +6014,7 @@ components: account_id: type: string description: Provider account identifier - example: Voluptas est consequatur rerum neque. + example: Debitis atque laboriosam unde facilis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5978,23 +6022,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Perspiciatis perferendis adipisci. + example: Numquam voluptatem maiores ipsam dicta cum odit. label: type: string description: Optional friendly name - example: Ea nam aut aut dolores. + example: Nam modi nostrum assumenda alias sed. org_id: type: string description: LinkedIn organization URN id - example: Optio quia similique vero est impedit quo. + example: Mollitia ducimus sunt. project_id: type: string description: Owning project - example: Sapiente sit totam ut et ullam. + example: Odit illo ut ut. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -6003,17 +6047,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5284871868291627638 + example: 4721820161303114412 format: int64 example: - account_id: Eos deserunt quia expedita sed velit distinctio. - has_credentials: false - id: Nihil at. - label: Sit soluta quia qui. - org_id: Natus veniam amet. - project_id: Libero officia et quia. - status: inactive - version: 1537409143960626181 + account_id: Est deserunt maiores consequatur. + has_credentials: true + id: Aliquam voluptatem. + label: Eos minima sunt. + org_id: Non ratione quo ullam dolores occaecati. + project_id: Dolore aliquam est autem. + status: deleted + version: 2899021755311679849 required: - id - project_id @@ -6031,14 +6075,14 @@ components: label: type: string description: Optional friendly name - example: Sint est sed. + example: Sit voluptatem ad ab. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Voluptas dolorem necessitatibus illum. + label: Tempora dolor quis totam hic quibusdam eveniet. org_id: "208777" required: - account_id @@ -6049,10 +6093,10 @@ components: access_token: type: string description: OAuth access token - example: Ducimus distinctio deserunt quia magni. + example: Dolorem necessitatibus neque consectetur occaecati earum. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Nisi est. + access_token: Ut sint non eum expedita non. required: - access_token MetaAdsConnection: @@ -6061,15 +6105,15 @@ components: account_id: type: string description: Provider account identifier - example: Quia doloremque commodi rerum. + example: Occaecati quaerat eum quia a excepturi. app_id: type: string description: Meta app ID - example: Error sit nihil iure officiis nemo. + example: Id vel iusto optio repellendus. etag: type: string description: ETag header value (mirrors version) - example: Eos non molestias laudantium quia iusto maxime. + example: Eos culpa quaerat culpa inventore aut molestiae. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6077,19 +6121,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Totam hic quibusdam eveniet. + example: Necessitatibus voluptatem incidunt et totam esse rerum. label: type: string description: Optional friendly name - example: Veniam et ducimus quos amet. + example: Voluptatem incidunt cum. page_id: type: string description: Facebook page ID - example: Illum accusamus debitis explicabo praesentium sint. + example: Hic quos inventore. project_id: type: string description: Owning project - example: Doloribus voluptas mollitia doloremque totam. + example: Dolorem delectus. status: type: string description: Connection status @@ -6102,19 +6146,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4075428576386055706 + example: 4898302691270586418 format: int64 example: - account_id: Corporis dolorem laborum maiores est ea ducimus. - app_id: Tenetur ut. - etag: Quo ullam ad iusto quos. + account_id: Nisi est magni odio aut. + app_id: Et ipsa magnam cum. + etag: Ducimus voluptatem doloremque ullam consequatur. has_credentials: false - id: Molestias ducimus id. - label: Ex et alias ea asperiores quas. - page_id: Est placeat explicabo aliquid. - project_id: Eius aut quo et. + id: Ad dolorem et. + label: Inventore impedit unde voluptatem quia ab recusandae. + page_id: Eveniet tempore est omnis iusto fugiat. + project_id: Rerum eveniet nam sunt. status: inactive - version: 7062935514847310019 + version: 8514774147978099222 required: - id - project_id @@ -6129,11 +6173,11 @@ components: account_id: type: string description: Provider account identifier - example: Reiciendis excepturi. + example: Quos qui quo et. app_id: type: string description: Meta app ID - example: Iure aut tenetur ipsum ea ad ducimus. + example: Sed voluptas fuga officia nulla. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6141,19 +6185,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quisquam voluptatem fuga quia qui. + example: Ut magnam facilis non facilis dolor consectetur. label: type: string description: Optional friendly name - example: Rerum vel molestiae id quae vero aut. + example: A debitis ut ea. page_id: type: string description: Facebook page ID - example: Et et. + example: Beatae facilis dolor quod nihil quia. project_id: type: string description: Owning project - example: Aut provident suscipit incidunt. + example: Error quisquam recusandae nesciunt et itaque. status: type: string description: Connection status @@ -6166,18 +6210,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8554261525276101559 + example: 2532070289670969642 format: int64 example: - account_id: Necessitatibus non eum ipsum eveniet quam. - app_id: Accusamus eos neque velit. - has_credentials: true - id: Aut temporibus. - label: Eligendi non. - page_id: Voluptatum magnam. - project_id: Laborum ipsum accusantium voluptatem libero. + account_id: Et nemo dicta illum omnis. + app_id: Minus est dolor. + has_credentials: false + id: Recusandae consequatur nulla. + label: Consequuntur provident nostrum vel ut. + page_id: Deleniti magnam nemo cum delectus. + project_id: Non consequuntur qui qui impedit assumenda voluptas. status: error - version: 8043832967599792035 + version: 1382848930967937507 required: - id - project_id @@ -6191,11 +6235,11 @@ components: account_id: type: string description: Provider account identifier - example: Odit illo ut ut. + example: Ipsa ut saepe beatae quasi. app_id: type: string description: Meta app ID - example: Perspiciatis debitis atque. + example: Neque voluptas doloremque nobis consectetur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6203,19 +6247,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: In iure molestiae quisquam. + example: Et voluptatem mollitia placeat aut laudantium. label: type: string description: Optional friendly name - example: Numquam voluptatem maiores ipsam dicta cum odit. + example: Nam sequi iste iusto. page_id: type: string description: Facebook page ID - example: Assumenda alias. + example: Corrupti ut. project_id: type: string description: Owning project - example: Ipsam aperiam et totam in. + example: Ut et laborum. status: type: string description: Connection status @@ -6228,18 +6272,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8618836083038100083 + example: 2992056059874429339 format: int64 example: - account_id: Aliquam est autem vel eos minima. - app_id: Ea voluptatum pariatur non. - has_credentials: true - id: Unde facilis. - label: Voluptatem optio. - page_id: Maiores consequatur. - project_id: Ut quas officiis mollitia ducimus sunt repellendus. - status: inactive - version: 2884566362507518761 + account_id: Quis impedit. + app_id: Tempore qui repellendus. + has_credentials: false + id: Voluptas voluptatem. + label: Corrupti dicta pariatur totam quas deserunt. + page_id: Earum voluptates repellat ipsam aut et ut. + project_id: Quia facere vitae aperiam. + status: active + version: 5857417550509828993 required: - id - project_id @@ -6253,35 +6297,35 @@ components: account_id: type: string description: Provider account identifier - example: Quisquam recusandae nesciunt et. + example: Accusantium est. app_id: type: string description: Meta app ID - example: Perferendis et. + example: Dolorem similique sapiente. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quo ullam. + example: Expedita commodi sit. label: type: string description: Optional friendly name - example: Facilis dolor consectetur sed. + example: Quo porro. page_id: type: string description: Facebook page ID - example: Ut ea sequi quos qui quo et. + example: Pariatur esse. project_id: type: string description: Owning project - example: Occaecati hic ut magnam facilis. + example: Et porro saepe eius. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -6290,18 +6334,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8315950268383046552 + example: 8954046891574288398 format: int64 example: - account_id: Non consequuntur qui qui impedit assumenda voluptas. - app_id: Et nemo dicta illum omnis. - has_credentials: true - id: Beatae facilis dolor quod nihil quia. - label: Recusandae consequatur nulla. - page_id: Vel ut. - project_id: Sed voluptas fuga officia nulla. - status: error - version: 8342264622249142271 + account_id: Sed qui dolor illo facere ut voluptatem. + app_id: Perferendis placeat earum occaecati et. + has_credentials: false + id: Ea pariatur. + label: Nam repellat. + page_id: Rerum maiores in alias est laboriosam saepe. + project_id: Aut rem molestiae assumenda ea. + status: deleted + version: 8862716294143227386 required: - id - project_id @@ -6319,20 +6363,20 @@ components: app_id: type: string description: Meta app ID - example: Occaecati id ea sunt dolorem necessitatibus neque. + example: Et minima. label: type: string description: Optional friendly name - example: Consequatur hic voluptatem. + example: Voluptas quis nihil tempora rem asperiores. page_id: type: string description: Facebook page ID - example: Omnis quidem dolor ipsum voluptas. + example: Vero natus voluptatem. example: account_id: act_193556282970417 - app_id: Ab quasi tempora dolor. - label: Occaecati earum unde ut. - page_id: Non eum expedita non voluptas sit voluptatem. + app_id: Voluptas aliquid libero sapiente aspernatur fugit eum. + label: Quas qui aut rerum illum vero. + page_id: Et neque soluta. required: - account_id MetaAdsCredentials: @@ -6341,15 +6385,15 @@ components: access_token: type: string description: Meta access token - example: Fugiat aliquid aspernatur voluptatem in cupiditate. + example: Est placeat explicabo aliquid. app_secret: type: string description: Meta app secret - example: Et dolorem quod. + example: Tenetur ut. description: Meta Ads credential. Write-only; never returned. example: - access_token: Iusto fugit non asperiores quidem natus. - app_secret: Nostrum atque illum nesciunt adipisci odit corrupti. + access_token: Quo vel iste aut cum voluptatem. + app_secret: Et et aperiam. required: - access_token - app_secret @@ -6359,15 +6403,15 @@ components: account_id: type: string description: Provider account identifier - example: Aut omnis itaque ut vero voluptatibus. + example: Dolor ea iusto eveniet velit sint odit. customer_id: type: string description: Microsoft Advertising customer ID - example: Sequi non et. + example: Quam enim odio quia. etag: type: string description: ETag header value (mirrors version) - example: Voluptatibus voluptatem vero dolorem qui. + example: Cupiditate et esse voluptate optio quis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6375,15 +6419,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Non eos. + example: Et atque. label: type: string description: Optional friendly name - example: Enim voluptatem inventore quasi. + example: Aliquid explicabo eaque ab aut voluptas. project_id: type: string description: Owning project - example: Vel aut aliquam rerum et quidem. + example: Impedit velit omnis incidunt. status: type: string description: Connection status @@ -6396,18 +6440,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6330819027913820088 + example: 8220727981299951228 format: int64 example: - account_id: Aut est voluptatibus placeat. - customer_id: Deleniti placeat rerum. - etag: Expedita et velit accusamus. - has_credentials: false - id: Vero vel. - label: Necessitatibus quaerat minima a voluptatem ipsa et. - project_id: Quibusdam repellendus qui numquam. - status: inactive - version: 7624219269087359761 + account_id: Unde fuga voluptas ut vero. + customer_id: Velit dolorem. + etag: A pariatur omnis. + has_credentials: true + id: Commodi aspernatur. + label: Velit perferendis est ipsum aut voluptas. + project_id: Nostrum numquam illo. + status: active + version: 5290138330966618163 required: - id - project_id @@ -6422,31 +6466,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo veritatis nisi velit distinctio animi. + example: Soluta et quam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptas tenetur esse. + example: Voluptate est enim aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Architecto molestiae cum. + example: Eaque ut. label: type: string description: Optional friendly name - example: Sapiente perspiciatis dolores dignissimos soluta non vel. + example: Iste et alias quis magni ad. project_id: type: string description: Owning project - example: Perspiciatis consequatur beatae sunt officiis sequi qui. + example: Et aspernatur delectus rem sit. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6455,17 +6499,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8298836967576578537 + example: 2822393091615672408 format: int64 example: - account_id: Eveniet aliquid quia aut impedit a veritatis. - customer_id: Sunt debitis enim voluptas qui voluptas veniam. - has_credentials: false - id: Assumenda sed minima nihil. - label: Dolor molestiae quia voluptatem deserunt libero. - project_id: Quaerat ipsa voluptatem. - status: error - version: 5039507493953656552 + account_id: Velit atque nam voluptatem in eveniet. + customer_id: Totam ea ut voluptatem velit eos aut. + has_credentials: true + id: Sequi non consequatur est. + label: Occaecati repellendus autem ullam odio quis sed. + project_id: Beatae magni est officiis enim. + status: active + version: 7510768710450776293 required: - id - project_id @@ -6479,11 +6523,11 @@ components: account_id: type: string description: Provider account identifier - example: Dolor cumque dolores. + example: Itaque iure soluta autem. customer_id: type: string description: Microsoft Advertising customer ID - example: Neque aspernatur culpa sed non. + example: Odit numquam quia. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6491,15 +6535,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptas maxime non illo ab in voluptatem. + example: Est eum ut ut amet et molestiae. label: type: string description: Optional friendly name - example: Ad et in voluptatem et perspiciatis. + example: Qui quae qui optio. project_id: type: string description: Owning project - example: Est magnam molestiae soluta. + example: Nihil dolor exercitationem eum placeat dolores culpa. status: type: string description: Connection status @@ -6512,17 +6556,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 889781010736384145 + example: 3577746410602694753 format: int64 example: - account_id: Deleniti reprehenderit saepe quas commodi qui qui. - customer_id: Excepturi reiciendis numquam consequatur amet dolorem. + account_id: Ut unde dolore id. + customer_id: Dolorem ut aspernatur et ad. has_credentials: false - id: Ad cumque voluptas. - label: Non minima possimus totam occaecati enim eaque. - project_id: Facere rerum voluptatem saepe eligendi. - status: deleted - version: 2150669320812381725 + id: Aut dolores. + label: Atque qui dignissimos aut eaque eveniet. + project_id: Voluptatem beatae quis dignissimos voluptatem et labore. + status: active + version: 412346224570068154 required: - id - project_id @@ -6536,11 +6580,11 @@ components: account_id: type: string description: Provider account identifier - example: Soluta et quam. + example: Aut dolorem ea veniam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptate est enim aut. + example: Ullam dolor. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6548,19 +6592,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Eaque ut. + example: Magnam sequi esse at. label: type: string description: Optional friendly name - example: Iste et alias quis magni ad. + example: Assumenda cum nemo esse nobis. project_id: type: string description: Owning project - example: Et aspernatur delectus rem sit. + example: Vel aut rerum voluptatem ad minus. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6569,17 +6613,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2822393091615672408 + example: 6107904235260429813 format: int64 example: - account_id: Velit atque nam voluptatem in eveniet. - customer_id: Totam ea ut voluptatem velit eos aut. + account_id: Nihil deleniti dolores dignissimos perferendis tempore eum. + customer_id: Magnam saepe incidunt nisi. has_credentials: true - id: Sequi non consequatur est. - label: Occaecati repellendus autem ullam odio quis sed. - project_id: Beatae magni est officiis enim. - status: active - version: 7510768710450776293 + id: Eum et consequatur quis. + label: Consequatur dolor quia amet vero dolorum incidunt. + project_id: Enim nisi doloremque rerum. + status: deleted + version: 9143198940358453773 required: - id - project_id @@ -6593,19 +6637,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: In autem neque nihil laborum omnis. + example: Repudiandae facilis blanditiis libero nam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptatem possimus veniam dignissimos consequatur. + example: Qui sed voluptatibus quam quia. label: type: string description: Optional friendly name - example: Neque maiores quo aliquam in rem. + example: Delectus blanditiis magnam sed iure amet. example: - account_id: Est porro eos ipsa quia. - customer_id: Quo repudiandae. - label: Delectus enim quas id porro. + account_id: Molestiae omnis doloremque. + customer_id: Perspiciatis modi dicta quae sed ut. + label: Deserunt et quidem sapiente. required: - account_id MicrosoftAdsCredentials: @@ -6614,25 +6658,25 @@ components: client_id: type: string description: OAuth client id - example: Doloremque dicta. + example: Aut est voluptatibus placeat. client_secret: type: string description: OAuth client secret - example: Ratione impedit recusandae dolor consequatur. + example: Pariatur perferendis explicabo expedita et velit accusamus. developer_token: type: string description: Microsoft Advertising developer token - example: Voluptatem beatae repellat veritatis perferendis veritatis. + example: Nulla eos. refresh_token: type: string description: OAuth refresh token - example: Vel temporibus sunt nulla esse sed. + example: Deleniti placeat rerum. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Facere sed ea qui pariatur adipisci. - client_secret: Enim esse dolores. - developer_token: Est perferendis eos et cumque nulla. - refresh_token: Iste exercitationem voluptate quia esse nihil sed. + client_id: Recusandae totam soluta. + client_secret: Praesentium libero. + developer_token: Quisquam animi. + refresh_token: Qui et assumenda quas. required: - client_id - client_secret @@ -6655,6 +6699,33 @@ components: required: - code - message + PlatformResult: + type: object + properties: + campaign_id: + type: string + description: Upstream platform campaign id (present when ok) + example: Magni atque amet omnis doloremque at. + error: + type: string + description: Failure reason (present when not ok) + example: Dolor et natus. + ok: + type: boolean + description: Whether the campaign was created (or reused) successfully + example: true + platform: + type: string + description: Platform this result is for + example: Nihil neque quod alias ipsum. + example: + campaign_id: Consequatur non eveniet esse officia explicabo dolor. + error: Aspernatur voluptatibus. + ok: true + platform: Cupiditate non exercitationem. + required: + - platform + - ok PreconditionFailedError: type: object properties: @@ -6695,11 +6766,11 @@ components: account_id: type: string description: Provider account identifier - example: Occaecati quaerat eum quia a excepturi. + example: Minima vitae illo cumque optio impedit. etag: type: string description: ETag header value (mirrors version) - example: Eos culpa quaerat culpa inventore aut molestiae. + example: Odit autem repellendus dicta qui vel. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6707,19 +6778,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Necessitatibus voluptatem incidunt et totam esse rerum. + example: Enim id. label: type: string description: Optional friendly name - example: Voluptatem incidunt cum. + example: Vel necessitatibus vel voluptates tenetur veniam repellat. project_id: type: string description: Owning project - example: Dolorem delectus. + example: Eveniet quia voluptatem impedit cumque doloribus. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -6728,17 +6799,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4898302691270586418 + example: 234140326367801793 format: int64 example: - account_id: Rerum eveniet nam sunt. - etag: Voluptatem quia ab recusandae praesentium nisi. - has_credentials: true - id: Hic quos inventore. - label: Ad dolorem et. - project_id: Id vel iusto optio repellendus. + account_id: Rerum non assumenda molestiae modi impedit. + etag: Aliquam voluptatibus assumenda mollitia molestias eos nobis. + has_credentials: false + id: Earum id consequatur. + label: Adipisci ipsa. + project_id: Dolorum id ut molestias. status: deleted - version: 4971099885577230620 + version: 948876280422508983 required: - id - project_id @@ -6753,7 +6824,7 @@ components: account_id: type: string description: Provider account identifier - example: Laudantium eligendi ut et. + example: Et natus possimus cupiditate. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6761,19 +6832,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolor et aliquam deleniti. + example: Eaque magni omnis dolorem. label: type: string description: Optional friendly name - example: Est dolor velit et voluptatem mollitia placeat. + example: Quae et perspiciatis numquam. project_id: type: string description: Owning project - example: Nemo cum delectus laudantium. + example: Assumenda quam possimus aut ipsa. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -6782,16 +6853,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7301828793581898625 + example: 6695567399746083998 format: int64 example: - account_id: Necessitatibus quia facere vitae aperiam velit corrupti. + account_id: Amet itaque aut. has_credentials: true - id: Iste iusto reiciendis ipsa ut saepe beatae. - label: Voluptas doloremque nobis consectetur voluptas voluptas. - project_id: Temporibus in qui provident corrupti ut similique. - status: deleted - version: 8091372322961997197 + id: Atque delectus ut. + label: Unde adipisci aut quisquam. + project_id: Eum non ut itaque. + status: inactive + version: 8672712817511304757 required: - id - project_id @@ -6805,7 +6876,7 @@ components: account_id: type: string description: Provider account identifier - example: Repellendus dolore expedita commodi sit omnis et. + example: Quas quia quam voluptate nam iste. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6813,19 +6884,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Deserunt minima quis impedit. + example: Et doloremque porro non. label: type: string description: Optional friendly name - example: Aut et ut dolorem tempore. + example: Dolores quo est ratione beatae totam. project_id: type: string description: Owning project - example: In voluptate debitis earum voluptates repellat. + example: Quis ab non. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -6834,16 +6905,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4154692188906674111 + example: 1807846651493588341 format: int64 example: - account_id: Pariatur esse. - has_credentials: false - id: Quo porro. - label: Molestias reprehenderit. - project_id: Accusantium est. - status: error - version: 1321629448594002998 + account_id: Molestiae veniam exercitationem blanditiis ratione non. + has_credentials: true + id: Temporibus aut numquam. + label: Enim velit voluptates officiis tempora possimus rerum. + project_id: Accusantium ut vitae dolor soluta beatae. + status: active + version: 8042484860326151968 required: - id - project_id @@ -6857,7 +6928,7 @@ components: account_id: type: string description: Provider account identifier - example: Facere ut voluptatem. + example: Quos provident. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6865,19 +6936,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ab ea pariatur deserunt. + example: Quia qui dicta. label: type: string description: Optional friendly name - example: Repellat sequi sed qui dolor. + example: Totam et voluptates atque consequatur consequuntur voluptates. project_id: type: string description: Owning project - example: Rem molestiae assumenda ea incidunt. + example: Commodi facere vel. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -6886,16 +6957,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8862716294143227386 + example: 413153877019026133 format: int64 example: - account_id: Assumenda quam possimus aut ipsa. + account_id: Incidunt deleniti. has_credentials: false - id: Rerum maiores in alias est laboriosam saepe. - label: Eaque magni omnis dolorem. - project_id: Perferendis placeat earum occaecati et. - status: inactive - version: 7088601354925466349 + id: Officiis modi quae consequatur voluptatem et. + label: Vero eum ea perspiciatis rerum. + project_id: Culpa veritatis ut adipisci minus. + status: active + version: 6279401977493721745 required: - id - project_id @@ -6913,10 +6984,10 @@ components: label: type: string description: Optional friendly name - example: Et neque soluta. + example: Numquam optio possimus velit quod. example: account_id: t2_gv9wtbfa - label: Voluptas aliquid libero sapiente aspernatur fugit eum. + label: Perspiciatis quam iste possimus ipsam. required: - account_id RedditAdsCredentials: @@ -6925,20 +6996,20 @@ components: client_id: type: string description: OAuth client id - example: Quo vel iste aut cum voluptatem. + example: Mollitia vel. client_secret: type: string description: OAuth client secret - example: Et et aperiam. + example: Ea eum. refresh_token: type: string description: OAuth refresh token - example: Voluptas quis nihil tempora rem asperiores. + example: Qui qui. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Vero natus voluptatem. - client_secret: Et minima. - refresh_token: Quas qui aut rerum illum vero. + client_id: Repudiandae quae aut. + client_secret: Tempore rem quo fuga accusantium voluptas ratione. + refresh_token: Esse et labore earum. required: - client_id - client_secret @@ -6967,10 +7038,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - credentials SetCredentialHubspotRequestBody: @@ -6980,7 +7051,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -6990,7 +7061,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7000,8 +7071,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7011,9 +7082,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7023,10 +7094,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - credentials TwitterAdsConnection: @@ -7035,31 +7106,31 @@ components: account_id: type: string description: Provider account identifier - example: Dicta qui. + example: Quo repudiandae. etag: type: string description: ETag header value (mirrors version) - example: Consequatur voluptate dolorum id ut. + example: Vel aut aliquam rerum et quidem. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Id adipisci. + example: Enim voluptatem inventore quasi. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Vel necessitatibus vel voluptates tenetur veniam repellat. + example: Voluptatem possimus veniam dignissimos consequatur. label: type: string description: Optional friendly name - example: Aut repudiandae voluptatibus odit autem. + example: Est porro eos ipsa quia. project_id: type: string description: Owning project - example: Minima vitae illo cumque optio impedit. + example: Delectus enim quas id porro. status: type: string description: Connection status @@ -7072,18 +7143,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6671950557225375758 + example: 1500674714869504232 format: int64 example: - account_id: Vitae nemo sint et consequatur vel quisquam. - etag: Sint possimus. - funding_instrument_id: Dolorem neque hic voluptatem ad similique sunt. + account_id: Sequi non et. + etag: Quibusdam repellendus qui numquam. + funding_instrument_id: Necessitatibus quaerat minima a voluptatem ipsa et. has_credentials: true - id: Aut rerum non assumenda molestiae modi. - label: Voluptatibus assumenda mollitia molestias eos. - project_id: Vitae molestiae itaque autem. - status: error - version: 3850958169697422368 + id: Aut omnis itaque ut vero voluptatibus. + label: Vero dolorem qui. + project_id: Eum provident velit voluptatibus. + status: active + version: 3990374454753155356 required: - id - project_id @@ -7098,11 +7169,11 @@ components: account_id: type: string description: Provider account identifier - example: Ut itaque voluptatem unde adipisci aut. + example: Eius omnis id itaque. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Aut praesentium eos ex laborum et doloremque. + example: Perferendis placeat dolores. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7110,19 +7181,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Numquam numquam et natus possimus. + example: Quidem quibusdam officiis dolor. label: type: string description: Optional friendly name - example: Repudiandae eum. + example: Sint dolor eaque culpa. project_id: type: string description: Owning project - example: Provident molestiae quia neque atque delectus. + example: Nisi sunt. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -7131,17 +7202,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 9192676630235860462 + example: 1134950045517095139 format: int64 example: - account_id: Quas quia quam voluptate nam iste. - funding_instrument_id: Temporibus aut numquam. - has_credentials: true - id: Non laudantium quis ab non sunt. - label: Beatae totam. - project_id: Quo est. - status: active - version: 1807846651493588341 + account_id: Sint suscipit. + funding_instrument_id: Non neque optio. + has_credentials: false + id: Dolore voluptatem qui eveniet amet. + label: Voluptate et. + project_id: Qui pariatur odio reprehenderit nam. + status: deleted + version: 6078188127403523196 required: - id - project_id @@ -7155,11 +7226,11 @@ components: account_id: type: string description: Provider account identifier - example: Sed dolorum cupiditate quia qui dicta. + example: Quo veritatis nisi velit distinctio animi. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Quae totam et voluptates atque consequatur. + example: Voluptas tenetur esse. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7167,15 +7238,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Accusantium ut vitae dolor soluta beatae. + example: Architecto molestiae cum. label: type: string description: Optional friendly name - example: Molestiae veniam exercitationem blanditiis ratione non. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. project_id: type: string description: Owning project - example: Enim velit voluptates officiis tempora possimus rerum. + example: Perspiciatis consequatur beatae sunt officiis sequi qui. status: type: string description: Connection status @@ -7188,17 +7259,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2489572558350094249 + example: 8298836967576578537 format: int64 example: - account_id: Adipisci minus et vero. - funding_instrument_id: Occaecati incidunt deleniti sunt dolorem ea. + account_id: Eveniet aliquid quia aut impedit a veritatis. + funding_instrument_id: Sunt debitis enim voluptas qui voluptas veniam. has_credentials: false - id: Voluptates ab quos provident magni et. - label: Et culpa culpa veritatis. - project_id: Reprehenderit officiis modi quae consequatur. - status: inactive - version: 8208341011850859357 + id: Assumenda sed minima nihil. + label: Dolor molestiae quia voluptatem deserunt libero. + project_id: Quaerat ipsa voluptatem. + status: error + version: 5039507493953656552 required: - id - project_id @@ -7212,11 +7283,11 @@ components: account_id: type: string description: Provider account identifier - example: Eius omnis id itaque. + example: Dolor cumque dolores. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Perferendis placeat dolores. + example: Neque aspernatur culpa sed non. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7224,19 +7295,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quidem quibusdam officiis dolor. + example: Voluptas maxime non illo ab in voluptatem. label: type: string description: Optional friendly name - example: Sint dolor eaque culpa. + example: Ad et in voluptatem et perspiciatis. project_id: type: string description: Owning project - example: Nisi sunt. + example: Est magnam molestiae soluta. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -7245,17 +7316,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1134950045517095139 + example: 889781010736384145 format: int64 example: - account_id: Sint suscipit. - funding_instrument_id: Non neque optio. + account_id: Deleniti reprehenderit saepe quas commodi qui qui. + funding_instrument_id: Excepturi reiciendis numquam consequatur amet dolorem. has_credentials: false - id: Dolore voluptatem qui eveniet amet. - label: Voluptate et. - project_id: Qui pariatur odio reprehenderit nam. + id: Ad cumque voluptas. + label: Non minima possimus totam occaecati enim eaque. + project_id: Facere rerum voluptatem saepe eligendi. status: deleted - version: 6078188127403523196 + version: 2150669320812381725 required: - id - project_id @@ -7273,15 +7344,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Cumque perspiciatis quam. + example: Est perferendis eos et cumque nulla. label: type: string description: Optional friendly name - example: Iste numquam optio possimus velit. + example: Iste exercitationem voluptate quia esse nihil sed. example: account_id: 8r7gb - funding_instrument_id: Eveniet quia voluptatem impedit cumque doloribus. - label: Possimus ipsam perspiciatis enim id. + funding_instrument_id: In autem neque nihil laborum omnis. + label: Neque maiores quo aliquam in rem. required: - account_id TwitterAdsCredentials: @@ -7290,25 +7361,25 @@ components: access_token: type: string description: OAuth 1.0a access token - example: Ullam consequatur ut eveniet tempore est. + example: Hic voluptatem ad similique sunt ratione. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Iusto fugiat ad et. + example: Dicta et ratione impedit recusandae dolor. consumer_key: type: string description: OAuth 1.0a consumer key - example: Magni odio aut omnis vel. + example: Nemo sint et consequatur vel quisquam libero. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Iure ducimus voluptatem. + example: Eum et sint possimus omnis dolorem. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Necessitatibus tempore rem quo. - access_token_secret: Accusantium voluptas ratione dignissimos esse et labore. - consumer_key: Magnam cum veritatis mollitia vel velit. - consumer_secret: Eum perferendis qui qui soluta repudiandae quae. + access_token: Facere sed ea qui pariatur adipisci. + access_token_secret: Enim esse dolores. + consumer_key: Mollitia vel temporibus sunt nulla esse. + consumer_secret: Sunt voluptatem beatae repellat veritatis perferendis veritatis. required: - consumer_key - consumer_secret @@ -7321,9 +7392,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. - config: Error similique. - status: Maxime fugiat illo. + campaign_name: Alias ullam fugiat deserunt sint nihil iusto. + config: Necessitatibus expedita. + status: Voluptas inventore sit. required: - campaign UpdateGoogleAdsRequestBody: @@ -7345,12 +7416,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. required: - config UpdateLinkedinAdsRequestBody: @@ -7361,7 +7432,7 @@ components: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" required: - config @@ -7373,9 +7444,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. required: - config UpdateMicrosoftAdsRequestBody: @@ -7385,9 +7456,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. required: - config UpdateRedditAdsRequestBody: @@ -7398,7 +7469,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. required: - config UpdateTwitterAdsRequestBody: @@ -7409,8 +7480,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. required: - config securitySchemes: diff --git a/design/brief.go b/design/brief.go index f50f491b..fa927acb 100644 --- a/design/brief.go +++ b/design/brief.go @@ -75,13 +75,24 @@ var JobCreateResponse = Type("job-create-response", func() { Required("job_id", "status") }) +// PlatformResult is one platform's outcome within a terminal job result. It +// mirrors exactly what the orchestrator emits so the OpenAPI can describe the +// result array instead of an opaque Any. +var PlatformResult = Type("platform-result", func() { + Attribute("platform", String, "Platform this result is for") + Attribute("ok", Boolean, "Whether the campaign was created (or reused) successfully") + Attribute("campaign_id", String, "Upstream platform campaign id (present when ok)") + Attribute("error", String, "Failure reason (present when not ok)") + Required("platform", "ok") +}) + // JobPollResponse is returned from GET .../jobs/{jobId}. var JobPollResponse = Type("job-poll-response", func() { Attribute("job_id", String, "Job UUID") Attribute("status", String, "Job status", func() { Enum("queued", "running", "succeeded", "partial", "failed") }) - Attribute("result", Any, "Per-platform results, written once when the job reaches a terminal state") + Attribute("result", ArrayOf(PlatformResult), "Per-platform results, written once when the job reaches a terminal state") Attribute("error", String, "Terminal error, if any") Required("job_id", "status") }) diff --git a/docs/api-catalog.md b/docs/api-catalog.md index 552096bf..ec178dcc 100644 --- a/docs/api-catalog.md +++ b/docs/api-catalog.md @@ -276,11 +276,20 @@ platforms: CampaignPlatform[] — Platforms this job will create on (echoed fr jobId: string status: 'queued' | 'running' | 'succeeded' | 'partial' | 'failed' — 'partial' = some platforms succeeded, some failed -result?: CampaignCreateResult[] — Per-platform results, written once when the job +result?: PlatformResult[] — Per-platform results, written once when the job reaches a terminal state (absent while queued/running) error?: string — Terminal error, if the job failed as a whole ``` +### PlatformResult (per-platform outcome, embedded in JobPollResponse.result) + +``` +platform: string — Platform this result is for +ok: boolean — Whether the campaign was created (or reused) successfully +campaignId?: string — Upstream platform campaign id (present when ok) +error?: string — Failure reason (present when not ok) +``` + Per-platform errors are carried inside each `result` entry rather than in a separate top-level array; the job's own start/finish times are available from the job record's timestamps and are not echoed in the poll payload. diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index 367c2960..94bf7659 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -33,8 +33,8 @@ func UsageCommands() []string { // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + - os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + os.Args[0] + " " + "lfx-v2-campaign-service-svc readyz" + "\n" + "" } @@ -809,7 +809,7 @@ func lfxV2CampaignServiceBriefsCreateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetBriefUsage() { @@ -831,7 +831,7 @@ func lfxV2CampaignServiceBriefsGetBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"Enim quidem odio et sequi consequatur.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"Rem provident itaque labore voluptas.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateBriefUsage() { @@ -857,7 +857,7 @@ func lfxV2CampaignServiceBriefsUpdateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }' --project-id \"cncf\" --brief-id \"Neque tempore voluptatibus quo quod nesciunt.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }' --project-id \"cncf\" --brief-id \"Id qui repudiandae veniam soluta alias.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsApproveBriefUsage() { @@ -879,7 +879,7 @@ func lfxV2CampaignServiceBriefsApproveBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"Dolores omnis rem non natus.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"Sed ea.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsDeleteBriefUsage() { @@ -901,7 +901,7 @@ func lfxV2CampaignServiceBriefsDeleteBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"Facilis sint qui praesentium ea praesentium magni.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"Possimus ea.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { @@ -925,7 +925,7 @@ func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Est voluptatum enim earum et doloribus.\",\n \"platforms\": [\n \"hubspot\",\n \"meta-ads\",\n \"reddit-ads\",\n \"twitter-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"Ea consequatur et ut.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Vitae reiciendis voluptatem.\",\n \"platforms\": [\n \"reddit-ads\",\n \"microsoft-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"Non voluptas ut enim.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetCampaignUsage() { @@ -949,7 +949,7 @@ func lfxV2CampaignServiceBriefsGetCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"Exercitationem rerum iste ducimus.\" --campaign-id \"Omnis nesciunt.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"Hic voluptas debitis error.\" --campaign-id \"Veniam eum ut libero quibusdam debitis.\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { @@ -977,7 +977,7 @@ func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Reiciendis architecto atque maxime soluta dolorem ducimus.\",\n \"config\": \"Error similique.\",\n \"status\": \"Maxime fugiat illo.\"\n }\n }' --project-id \"cncf\" --brief-id \"Minus est ut.\" --campaign-id \"Alias ullam fugiat deserunt sint nihil iusto.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Alias ullam fugiat deserunt sint nihil iusto.\",\n \"config\": \"Necessitatibus expedita.\",\n \"status\": \"Voluptas inventore sit.\"\n }\n }' --project-id \"cncf\" --brief-id \"Beatae autem autem.\" --campaign-id \"Enim ea.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsGetJobUsage() { @@ -999,7 +999,7 @@ func lfxV2CampaignServiceBriefsGetJobUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"Et omnis accusantium.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"Consequatur quos atque voluptates quo sit.\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceConnectionsUsage displays the usage of the @@ -1073,7 +1073,7 @@ func lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetGoogleAdsUsage() { @@ -1179,7 +1179,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { @@ -1201,7 +1201,7 @@ func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetLinkedinAdsUsage() { @@ -1245,7 +1245,7 @@ func lfxV2CampaignServiceConnectionsUpdateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteLinkedinAdsUsage() { @@ -1307,7 +1307,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { @@ -1329,7 +1329,7 @@ func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n },\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n },\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMetaAdsUsage() { @@ -1373,7 +1373,7 @@ func lfxV2CampaignServiceConnectionsUpdateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMetaAdsUsage() { @@ -1435,7 +1435,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { @@ -1457,7 +1457,7 @@ func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n },\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetRedditAdsUsage() { @@ -1501,7 +1501,7 @@ func lfxV2CampaignServiceConnectionsUpdateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteRedditAdsUsage() { @@ -1563,7 +1563,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { @@ -1585,7 +1585,7 @@ func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n },\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n },\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetTwitterAdsUsage() { @@ -1629,7 +1629,7 @@ func lfxV2CampaignServiceConnectionsUpdateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteTwitterAdsUsage() { @@ -1691,7 +1691,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { @@ -1713,7 +1713,7 @@ func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n },\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMicrosoftAdsUsage() { @@ -1757,7 +1757,7 @@ func lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMicrosoftAdsUsage() { @@ -1819,7 +1819,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { @@ -1841,7 +1841,7 @@ func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetHubspotUsage() { @@ -1885,7 +1885,7 @@ func lfxV2CampaignServiceConnectionsUpdateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteHubspotUsage() { @@ -1947,7 +1947,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceSvcUsage displays the usage of the diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go index c44e8396..160ddd18 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -23,7 +23,7 @@ func BuildCreateBriefPayload(lfxV2CampaignServiceBriefsCreateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -90,7 +90,7 @@ func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Et incidunt pariatur quod.\",\n \"event_details\": \"Molestiae inventore voluptas.\",\n \"event_slug\": \"Voluptas corporis velit et.\",\n \"keywords\": \"Placeat velit ullam enim voluptatem cupiditate voluptas.\",\n \"platforms\": [\n \"Molestiae saepe qui.\",\n \"Commodi voluptatem expedita.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Facilis iste.\",\n \"url\": \"Quia ut atque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -194,7 +194,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Est voluptatum enim earum et doloribus.\",\n \"platforms\": [\n \"hubspot\",\n \"meta-ads\",\n \"reddit-ads\",\n \"twitter-ads\"\n ]\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Vitae reiciendis voluptatem.\",\n \"platforms\": [\n \"reddit-ads\",\n \"microsoft-ads\"\n ]\n }\n }'") } if body.Input == nil { err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) @@ -271,7 +271,7 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateCampaignBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Reiciendis architecto atque maxime soluta dolorem ducimus.\",\n \"config\": \"Error similique.\",\n \"status\": \"Maxime fugiat illo.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Alias ullam fugiat deserunt sint nihil iusto.\",\n \"config\": \"Necessitatibus expedita.\",\n \"status\": \"Voluptas inventore sit.\"\n }\n }'") } if body.Campaign == nil { err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go index 6fa9795b..42fe5c55 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go @@ -1726,3 +1726,20 @@ func marshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaignUp return res } + +// unmarshalPlatformResultResponseBodyToLfxv2campaignservicebriefsPlatformResult +// builds a value of type *lfxv2campaignservicebriefs.PlatformResult from a +// value of type *PlatformResultResponseBody. +func unmarshalPlatformResultResponseBodyToLfxv2campaignservicebriefsPlatformResult(v *PlatformResultResponseBody) *lfxv2campaignservicebriefs.PlatformResult { + if v == nil { + return nil + } + res := &lfxv2campaignservicebriefs.PlatformResult{ + Platform: *v.Platform, + OK: *v.OK, + CampaignID: v.CampaignID, + Error: v.Error, + } + + return res +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index 1ccc269a..f88456a2 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -217,7 +217,7 @@ type GetJobResponseBody struct { // Job status Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` // Per-platform results, written once when the job reaches a terminal state - Result any `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` + Result []*PlatformResultResponseBody `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` // Terminal error, if any Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` } @@ -753,6 +753,18 @@ type CampaignUpdateInputRequestBody struct { Config any `form:"config,omitempty" json:"config,omitempty" xml:"config,omitempty"` } +// PlatformResultResponseBody is used to define fields on response body types. +type PlatformResultResponseBody struct { + // Platform this result is for + Platform *string `form:"platform,omitempty" json:"platform,omitempty" xml:"platform,omitempty"` + // Whether the campaign was created (or reused) successfully + OK *bool `form:"ok,omitempty" json:"ok,omitempty" xml:"ok,omitempty"` + // Upstream platform campaign id (present when ok) + CampaignID *string `form:"campaign_id,omitempty" json:"campaign_id,omitempty" xml:"campaign_id,omitempty"` + // Failure reason (present when not ok) + Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` +} + // NewCreateBriefRequestBody builds the HTTP request body from the payload of // the "create-brief" endpoint of the "lfx-v2-campaign-service-briefs" service. func NewCreateBriefRequestBody(p *lfxv2campaignservicebriefs.CreateBriefPayload) *CreateBriefRequestBody { @@ -1449,9 +1461,18 @@ func NewGetJobJobPollResponseOK(body *GetJobResponseBody) *lfxv2campaignserviceb v := &lfxv2campaignservicebriefs.JobPollResponse{ JobID: *body.JobID, Status: *body.Status, - Result: body.Result, Error: body.Error, } + if body.Result != nil { + v.Result = make([]*lfxv2campaignservicebriefs.PlatformResult, len(body.Result)) + for i, val := range body.Result { + if val == nil { + v.Result[i] = nil + continue + } + v.Result[i] = unmarshalPlatformResultResponseBodyToLfxv2campaignservicebriefsPlatformResult(val) + } + } return v } @@ -1712,6 +1733,13 @@ func ValidateGetJobResponseBody(body *GetJobResponseBody) (err error) { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"queued", "running", "succeeded", "partial", "failed"})) } } + for _, e := range body.Result { + if e != nil { + if err2 := ValidatePlatformResultResponseBody(e); err2 != nil { + err = goa.MergeErrors(err, err2) + } + } + } return } @@ -2325,3 +2353,15 @@ func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody } return } + +// ValidatePlatformResultResponseBody runs the validations defined on +// platform-resultResponseBody +func ValidatePlatformResultResponseBody(body *PlatformResultResponseBody) (err error) { + if body.Platform == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("platform", "body")) + } + if body.OK == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("ok", "body")) + } + return +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go index 8d5c87e1..f2d8974a 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go @@ -1344,3 +1344,20 @@ func unmarshalCampaignUpdateInputRequestBodyToLfxv2campaignservicebriefsCampaign return res } + +// marshalLfxv2campaignservicebriefsPlatformResultToPlatformResultResponseBody +// builds a value of type *PlatformResultResponseBody from a value of type +// *lfxv2campaignservicebriefs.PlatformResult. +func marshalLfxv2campaignservicebriefsPlatformResultToPlatformResultResponseBody(v *lfxv2campaignservicebriefs.PlatformResult) *PlatformResultResponseBody { + if v == nil { + return nil + } + res := &PlatformResultResponseBody{ + Platform: v.Platform, + OK: v.OK, + CampaignID: v.CampaignID, + Error: v.Error, + } + + return res +} diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 4024fd76..3f38a6c9 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -217,7 +217,7 @@ type GetJobResponseBody struct { // Job status Status string `form:"status" json:"status" xml:"status"` // Per-platform results, written once when the job reaches a terminal state - Result any `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` + Result []*PlatformResultResponseBody `form:"result,omitempty" json:"result,omitempty" xml:"result,omitempty"` // Terminal error, if any Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` } @@ -712,6 +712,18 @@ type GetJobNotFoundResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// PlatformResultResponseBody is used to define fields on response body types. +type PlatformResultResponseBody struct { + // Platform this result is for + Platform string `form:"platform" json:"platform" xml:"platform"` + // Whether the campaign was created (or reused) successfully + OK bool `form:"ok" json:"ok" xml:"ok"` + // Upstream platform campaign id (present when ok) + CampaignID *string `form:"campaign_id,omitempty" json:"campaign_id,omitempty" xml:"campaign_id,omitempty"` + // Failure reason (present when not ok) + Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` +} + // BriefInputRequestBody is used to define fields on request body types. type BriefInputRequestBody struct { // Funnel context @@ -909,9 +921,18 @@ func NewGetJobResponseBody(res *lfxv2campaignservicebriefs.JobPollResponse) *Get body := &GetJobResponseBody{ JobID: res.JobID, Status: res.Status, - Result: res.Result, Error: res.Error, } + if res.Result != nil { + body.Result = make([]*PlatformResultResponseBody, len(res.Result)) + for i, val := range res.Result { + if val == nil { + body.Result[i] = nil + continue + } + body.Result[i] = marshalLfxv2campaignservicebriefsPlatformResultToPlatformResultResponseBody(val) + } + } return body } diff --git a/gen/http/lfx_v2_campaign_service_connections/client/cli.go b/gen/http/lfx_v2_campaign_service_connections/client/cli.go index 92991268..5f53aff3 100644 --- a/gen/http/lfx_v2_campaign_service_connections/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_connections/client/cli.go @@ -24,7 +24,7 @@ func BuildCreateGoogleAdsPayload(lfxV2CampaignServiceConnectionsCreateGoogleAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -174,7 +174,7 @@ func BuildSetCredentialGoogleAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Ut voluptatum consequatur quos atque voluptates.\",\n \"client_secret\": \"Sit nostrum dolor.\",\n \"developer_token\": \"Ipsa dolorum est aut blanditiis.\",\n \"refresh_token\": \"Unde omnis facere quam sed rem quia.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -212,7 +212,7 @@ func BuildCreateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsCreateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -276,7 +276,7 @@ func BuildUpdateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsUpdateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Tempora error rerum quae nihil.\",\n \"org_id\": \"208777\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -363,7 +363,7 @@ func BuildSetCredentialLinkedinAdsPayload(lfxV2CampaignServiceConnectionsSetCred { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Quis et maxime ipsam voluptatem repudiandae laudantium.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -400,7 +400,7 @@ func BuildCreateMetaAdsPayload(lfxV2CampaignServiceConnectionsCreateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n },\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n },\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -463,7 +463,7 @@ func BuildUpdateMetaAdsPayload(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Vel blanditiis sunt ut facere.\",\n \"label\": \"Vero et voluptas accusamus sunt.\",\n \"page_id\": \"Rerum cupiditate.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -548,7 +548,7 @@ func BuildSetCredentialMetaAdsPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Quo sint dolorum vel.\",\n \"app_secret\": \"Consequatur omnis quidem est non tenetur.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -586,7 +586,7 @@ func BuildCreateRedditAdsPayload(lfxV2CampaignServiceConnectionsCreateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n },\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -650,7 +650,7 @@ func BuildUpdateRedditAdsPayload(lfxV2CampaignServiceConnectionsUpdateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Provident quia distinctio.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -736,7 +736,7 @@ func BuildSetCredentialRedditAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Totam rem harum.\",\n \"client_secret\": \"Provident quia laboriosam magnam unde.\",\n \"refresh_token\": \"Et sed nobis blanditiis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -774,7 +774,7 @@ func BuildCreateTwitterAdsPayload(lfxV2CampaignServiceConnectionsCreateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n },\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n },\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -838,7 +838,7 @@ func BuildUpdateTwitterAdsPayload(lfxV2CampaignServiceConnectionsUpdateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Amet et eaque.\",\n \"label\": \"Aut sed quibusdam reiciendis qui vel.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -924,7 +924,7 @@ func BuildSetCredentialTwitterAdsPayload(lfxV2CampaignServiceConnectionsSetCrede { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Aperiam et ipsam vitae.\",\n \"access_token_secret\": \"Velit est quis aliquid aliquam.\",\n \"consumer_key\": \"Consequatur iste sed illo adipisci sunt.\",\n \"consumer_secret\": \"Soluta consectetur porro quo quia incidunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -962,7 +962,7 @@ func BuildCreateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsCreateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n },\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1027,7 +1027,7 @@ func BuildUpdateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsUpdateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Fugiat maxime labore illo.\",\n \"customer_id\": \"Provident quas repudiandae voluptatem vitae iste maxime.\",\n \"label\": \"Necessitatibus et autem doloribus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1114,7 +1114,7 @@ func BuildSetCredentialMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsSetCre { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.\",\n \"client_secret\": \"Fugit dignissimos ipsum voluptatem et quam beatae.\",\n \"developer_token\": \"Ipsam aut quis qui laudantium.\",\n \"refresh_token\": \"Omnis eveniet esse aut et rem suscipit.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -1151,7 +1151,7 @@ func BuildCreateHubspotPayload(lfxV2CampaignServiceConnectionsCreateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1214,7 +1214,7 @@ func BuildUpdateHubspotPayload(lfxV2CampaignServiceConnectionsUpdateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Et et veritatis voluptas nobis.\",\n \"brand_kit\": \"Consequuntur omnis a dignissimos voluptate.\",\n \"label\": \"Non sint praesentium quia.\",\n \"portal_id\": \"Doloremque architecto ea et.\",\n \"sender_email\": \"Asperiores facere et exercitationem soluta possimus.\",\n \"sender_name\": \"Aliquid et in.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1299,7 +1299,7 @@ func BuildSetCredentialHubspotPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Distinctio aut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index f63347da..5daf0890 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Iusto velit quo voluptatibus modi reiciendis aliquam."},"event_details":{"description":"Extracted event/course details","example":"Odit necessitatibus veritatis amet ut rerum quidem."},"event_slug":{"type":"string","description":"Event/course slug","example":"Eos voluptatibus."},"id":{"type":"string","description":"Brief UUID","example":"Vero quisquam."},"keywords":{"description":"Keyword list","example":"Quidem explicabo expedita sunt."},"platforms":{"type":"array","items":{"type":"string","example":"Ex delectus."},"description":"Suggested default platforms","example":["Ullam dolores rem.","Officia quidem non qui voluptates natus cum.","Autem recusandae totam.","Rerum nisi."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis reiciendis dignissimos consequatur iste qui minima."},"project_id":{"type":"string","description":"Owning project","example":"Labore laudantium."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Similique deserunt iusto."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptatem sed quia excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8240116664126121650,"format":"int64"}},"example":{"copy":"Placeat ea odio ea eos.","event_details":"Non adipisci rerum.","event_slug":"Adipisci quaerat est nobis.","id":"Possimus exercitationem repellendus quo quidem.","keywords":"Ipsum et delectus dolorum eveniet.","platforms":["Veritatis quisquam sed ratione et.","Cumque molestiae eos rem aut.","Quos impedit."],"program_type":"Illum rerum error incidunt.","project_id":"Cumque totam nulla aut reprehenderit.","status":"approved","targeting":"Alias ea quibusdam.","url":"Fugit non fuga rem adipisci.","version":8901460428935487189},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Et eveniet."},"event_details":{"description":"Extracted event/course details","example":"Est eaque ipsam harum nisi nobis."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Enim dolorum nobis itaque est enim."},"keywords":{"description":"Keyword list","example":"Corporis ut non."},"platforms":{"type":"array","items":{"type":"string","example":"Praesentium ipsam officiis cum ipsum recusandae."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Ullam pariatur ex voluptas aspernatur.","Voluptates aliquam vero ducimus.","Recusandae aut perferendis."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eius sed qui deserunt perspiciatis nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Pariatur explicabo est totam."}},"example":{"copy":"Provident provident.","event_details":"Odit rerum quidem accusamus.","event_slug":"Tempora minima voluptas quod facere aut.","keywords":"Odit iusto ad animi eos doloribus autem.","platforms":["Hic quis facere exercitationem.","Exercitationem aut eaque."],"program_type":"membership","targeting":"Sed voluptatum laborum.","url":"Porro dolor ipsa."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut rerum ut blanditiis dolor."},"id":{"type":"string","description":"Campaign UUID","example":"Voluptatibus quos accusantium fugit."},"platform":{"type":"string","description":"Channel","example":"Molestiae minus dolor accusantium."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Cum molestias fuga voluptatibus quis."},"project_id":{"type":"string","description":"Owning project","example":"Excepturi saepe sit vel perspiciatis neque."},"status":{"type":"string","description":"Campaign status","example":"Nobis aliquid rerum consequatur officiis velit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8006615023617839427,"format":"int64"}},"example":{"brief_id":"Omnis voluptates quaerat.","campaign_name":"Beatae placeat cumque iure veritatis cumque.","id":"Assumenda accusantium.","platform":"Quos cum porro architecto.","platform_campaign_id":"Aperiam doloribus aut.","project_id":"Fugiat dolore similique.","status":"Ex distinctio ipsum ab assumenda natus.","version":5157498100002718362},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Velit dolores eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"reddit-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["google-ads","linkedin-ads","hubspot","hubspot"]}},"example":{"config":"Est et expedita itaque.","platforms":["reddit-ads","microsoft-ads","microsoft-ads","reddit-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Est in deserunt."},"config":{"description":"Campaign configuration snapshot","example":"Odio sunt totam."},"status":{"type":"string","description":"Campaign status","example":"Omnis explicabo doloremque et sed."}},"example":{"campaign_name":"Sunt id ipsa perspiciatis sunt.","config":"Impedit at perspiciatis quisquam perferendis.","status":"Velit voluptatibus aut mollitia aut molestiae exercitationem."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusamus et atque enim."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Rerum dicta distinctio.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis rerum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Suscipit ut mollitia accusantium dignissimos numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Ratione nesciunt."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Voluptate mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Qui molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6319115309163667798,"format":"int64"}},"example":{"account_id":"Quisquam incidunt qui.","has_credentials":true,"id":"Atque dolores accusantium non dolor.","label":"Nobis labore dicta.","login_customer_id":"Quia exercitationem consequatur velit.","project_id":"Enim qui officia id necessitatibus mollitia soluta.","status":"inactive","version":2620236536617279883},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Officiis est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Qui quisquam voluptatibus sint quia."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Tempore nemo illum ut maiores."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Quia culpa iste id sit incidunt."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit repudiandae aut aut ducimus dolores vel.","client_secret":"Minus voluptatem sed architecto itaque doloribus.","developer_token":"Consequatur quis fugiat expedita recusandae qui.","refresh_token":"Accusantium enim temporibus dolor ipsam."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et voluptatem deserunt consequuntur omnis sed dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo veritatis quis delectus est."},"label":{"type":"string","description":"Optional friendly name","example":"Vel voluptate."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"In hic."},"project_id":{"type":"string","description":"Owning project","example":"Et rerum in expedita."},"sender_email":{"type":"string","description":"Default sender address","example":"Facere ipsa et reprehenderit dignissimos voluptas."},"sender_name":{"type":"string","description":"Default sender name","example":"Consequatur dignissimos itaque quia ut aperiam cum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4147907586526409625,"format":"int64"}},"example":{"account_id":"Assumenda dignissimos beatae vitae aut ea dolor.","brand_kit":"Eaque voluptate reprehenderit sed voluptatem sed illo.","has_credentials":true,"id":"Voluptatibus quod necessitatibus non iste ad rem.","label":"Harum corporis deleniti doloribus.","portal_id":"Sit architecto ut unde.","project_id":"Sunt qui cupiditate ullam ab suscipit et.","sender_email":"Sapiente possimus.","sender_name":"Voluptates atque.","status":"error","version":6055913800302101668},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Cum nisi numquam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id unde veritatis officiis aut fugiat."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut commodi et voluptas tenetur nobis facere."},"sender_name":{"type":"string","description":"Default sender name","example":"Quo corporis recusandae dicta quibusdam."}},"example":{"account_id":"Omnis nobis.","brand_kit":"Dolorum ut architecto deleniti nostrum.","label":"Nostrum tempore.","portal_id":"Deserunt repellendus corrupti itaque quo sit.","sender_email":"Rerum explicabo.","sender_name":"Eum et ipsum expedita reprehenderit eos."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aperiam et nihil."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Perspiciatis porro."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Suscipit quas sunt eos nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Qui maiores aut reiciendis ullam."},"description":"Platforms this job will create on","example":["Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur non cumque laudantium quod modi voluptas.","platforms":["Et ad.","Quia dolores voluptatibus tempora possimus consequatur.","Unde nihil et.","Quod est voluptas sequi voluptatem numquam."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Nihil ea quod et aut."},"job_id":{"type":"string","description":"Job UUID","example":"Ut alias quis nihil dolore suscipit reprehenderit."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Animi laudantium ullam omnis autem et id."},"status":{"type":"string","description":"Job status","example":"failed","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Molestiae ratione officia fugit provident officia.","job_id":"Inventore enim reiciendis.","result":"Ut rerum facilis.","status":"failed"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit in recusandae maiores et voluptatem voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut ut nisi fuga nostrum velit hic."},"label":{"type":"string","description":"Optional friendly name","example":"Atque dolor odio labore pariatur."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui consequatur et dignissimos ex."},"project_id":{"type":"string","description":"Owning project","example":"Omnis reprehenderit distinctio quos ut unde."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":342612035894089324,"format":"int64"}},"example":{"account_id":"Vel natus provident.","has_credentials":true,"id":"Praesentium voluptas beatae.","label":"Eos et architecto voluptas.","org_id":"Ut non error aut et fuga.","project_id":"Officia et sint numquam accusamus.","status":"inactive","version":4235609230431250467},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nihil nihil quae porro qui rem autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Et nulla officia vitae.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Eveniet quibusdam."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut asperiores quo aut."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium amet veritatis rerum itaque consequatur laboriosam."},"app_id":{"type":"string","description":"Meta app ID","example":"Quis illo minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et sunt quis dicta voluptate aut in."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi deleniti voluptas aperiam vel."},"page_id":{"type":"string","description":"Facebook page ID","example":"Provident maiores."},"project_id":{"type":"string","description":"Owning project","example":"Provident nobis soluta culpa vitae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":206759142589582139,"format":"int64"}},"example":{"account_id":"At odio incidunt distinctio sint qui.","app_id":"Enim cumque saepe sint quidem odio.","has_credentials":false,"id":"Earum eligendi.","label":"Provident dicta temporibus debitis.","page_id":"Non quae omnis.","project_id":"Ipsum sunt assumenda ipsa dolor officia eligendi.","status":"inactive","version":1065443246813246267},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatibus deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Deleniti error pariatur consequatur esse."}},"example":{"account_id":"act_193556282970417","app_id":"Et eum est molestiae necessitatibus magni.","label":"Necessitatibus eos.","page_id":"Et eligendi et numquam dolorum consequatur in."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Molestiae praesentium perferendis deserunt ipsum dolorum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Error nulla fuga fugit repellendus et accusamus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Non sequi error assumenda quam deleniti et.","app_secret":"Nam quia aperiam sunt est."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"A necessitatibus molestiae."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolorem qui explicabo consequuntur repellat non suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quos hic doloribus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum et sint corrupti eos."},"project_id":{"type":"string","description":"Owning project","example":"Neque autem ex eos."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7747776820204091337,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","customer_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Enim accusantium labore esse numquam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium sunt minima repudiandae illo harum."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"Sit dolor sunt eos nihil ipsam.","customer_id":"Odio totam cum deleniti placeat fuga.","label":"Dolorum deserunt."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Saepe voluptatem reiciendis pariatur."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et ut quis ut."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia cum non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iusto omnis."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Aut autem sint minus voluptatum.","client_secret":"Tempore quae.","developer_token":"Dolores tenetur ut illum.","refresh_token":"Consequatur dolore unde illum."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam quis quam dolor occaecati earum iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Libero ut est rerum est occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus voluptatem iste nisi in."},"project_id":{"type":"string","description":"Owning project","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6933590282461306362,"format":"int64"}},"example":{"account_id":"Nostrum corporis quasi magnam.","has_credentials":false,"id":"Iste qui rerum est sed sed similique.","label":"Expedita voluptatum commodi fuga ipsa.","project_id":"Ea maiores quidem molestiae deleniti omnis.","status":"inactive","version":6739884703025890394},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint ipsa quo."}},"example":{"account_id":"t2_gv9wtbfa","label":"Architecto quas eligendi impedit qui sed."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Necessitatibus laudantium est ut."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Neque facilis est qui possimus eligendi."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Possimus et corrupti et nobis voluptas."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Exercitationem illum et quisquam.","client_secret":"Est facilis qui.","refresh_token":"Modi ut culpa excepturi blanditiis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum illo mollitia odio et dolor."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ipsam maiores et maiores laudantium aut perspiciatis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia quisquam corrupti distinctio voluptas eius."},"label":{"type":"string","description":"Optional friendly name","example":"Nam rerum eaque eius."},"project_id":{"type":"string","description":"Owning project","example":"Autem est est distinctio sunt aliquid harum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9024066918837864439,"format":"int64"}},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","funding_instrument_id":"Aperiam velit dolores.","has_credentials":true,"id":"Voluptates non sint inventore iste iure ut.","label":"Porro voluptate.","project_id":"Facilis suscipit.","status":"inactive","version":358292288538552244},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos non sed omnis officiis et."},"label":{"type":"string","description":"Optional friendly name","example":"Placeat unde distinctio ducimus qui."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Magni repudiandae.","label":"Laboriosam qui id enim."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Eos quaerat rem aut fuga."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Est dolor ut corporis."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nihil corrupti repellat eius."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Qui nobis et delectus quam."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Pariatur debitis.","access_token_secret":"Explicabo possimus consequatur.","consumer_key":"Cupiditate ut illo dolor quaerat totam.","consumer_secret":"Illo vitae occaecati omnis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui alias ea."},"event_details":{"description":"Extracted event/course details","example":"Eos nesciunt ipsum et delectus dolorum."},"event_slug":{"type":"string","description":"Event/course slug","example":"Adipisci quaerat est nobis."},"id":{"type":"string","description":"Brief UUID","example":"Repellendus quo quidem."},"keywords":{"description":"Keyword list","example":"Tempore maxime."},"platforms":{"type":"array","items":{"type":"string","example":"Et veritatis quisquam sed ratione et."},"description":"Suggested default platforms","example":["Molestiae eos.","Aut iusto quos impedit eos.","Adipisci rerum consequatur placeat ea odio."]},"program_type":{"type":"string","description":"Funnel context","example":"Illum rerum error incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Cumque totam nulla aut reprehenderit."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Porro enim dolorum nobis."},"url":{"type":"string","description":"Event/course page URL","example":"Fugit non fuga rem adipisci."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6324133014862191516,"format":"int64"}},"example":{"copy":"Aut facilis porro dolor ipsa velit.","event_details":"Ut mollitia tempora minima voluptas quod.","event_slug":"Aperiam voluptates.","id":"Magnam pariatur explicabo est.","keywords":"Hic quis facere exercitationem.","platforms":["Aut perferendis natus.","Eaque ipsam harum nisi nobis et et.","Excepturi corporis ut.","Odio eius sed qui deserunt perspiciatis."],"program_type":"Adipisci ullam pariatur ex voluptas.","project_id":"Qui praesentium ipsam officiis cum ipsum recusandae.","status":"archived","targeting":"Exercitationem aut eaque.","url":"Vero ducimus.","version":5743767113243123162},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Commodi dicta."},"event_details":{"description":"Extracted event/course details","example":"Consequatur non cumque laudantium quod modi voluptas."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Accusamus et provident provident."},"keywords":{"description":"Keyword list","example":"Ad non."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Dolores voluptatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Odit iusto ad animi eos doloribus autem."}},"example":{"copy":"Quos accusantium fugit.","event_details":"Et expedita itaque quos.","event_slug":"Consequatur est unde nihil.","keywords":"Excepturi saepe sit vel perspiciatis neque.","platforms":["Qui eveniet laboriosam possimus.","Facere velit dolores eligendi.","Ad voluptatem.","Tempore impedit."],"program_type":"education","targeting":"Qui molestias.","url":"Laudantium quod est voluptas sequi voluptatem."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Nihil dolore suscipit reprehenderit et aut animi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Et aut consequatur inventore enim reiciendis."},"id":{"type":"string","description":"Campaign UUID","example":"Aut molestiae exercitationem et impedit at."},"platform":{"type":"string","description":"Channel","example":"Ullam omnis autem."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Id laboriosam nihil ea."},"project_id":{"type":"string","description":"Owning project","example":"Quisquam perferendis autem ut alias."},"status":{"type":"string","description":"Campaign status","example":"Neque ut rerum facilis quia molestiae ratione."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3905678301175813319,"format":"int64"}},"example":{"brief_id":"Consequatur qui molestiae velit ratione nesciunt et.","campaign_name":"Enim qui officia id necessitatibus mollitia soluta.","id":"Provident officia officiis.","platform":"Rerum ut necessitatibus illum ratione.","platform_campaign_id":"Mollitia atque atque dolores accusantium non dolor.","project_id":"Ut mollitia accusantium dignissimos.","status":"Nobis labore dicta.","version":6819175354933615501},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Sunt totam incidunt sunt id ipsa."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["linkedin-ads","hubspot","meta-ads","meta-ads"]}},"example":{"config":"Voluptatibus aut.","platforms":["hubspot","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Incidunt qui aut tempora dolor sequi quia."},"config":{"description":"Campaign configuration snapshot","example":"Culpa iste."},"status":{"type":"string","description":"Campaign status","example":"Consequatur velit odio."}},"example":{"campaign_name":"Sit incidunt.","config":"Qui quisquam voluptatibus sint quia.","status":"Officiis est."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Sunt assumenda."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Officia eligendi tempore provident dicta temporibus debitis.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est officia et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit in recusandae maiores et voluptatem voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ex quo praesentium voluptas."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Eos et architecto voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Mollitia omnis doloribus qui consequatur et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5274458285620360301,"format":"int64"}},"example":{"account_id":"Nihil nihil quae porro qui rem autem.","has_credentials":true,"id":"Vel natus provident.","label":"Ut non error aut et fuga.","login_customer_id":"Vitae perspiciatis eveniet quibusdam nobis ut asperiores.","project_id":"Perspiciatis id.","status":"deleted","version":4918506778223386612},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quis dicta voluptate aut in corporis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Nobis soluta."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Vitae accusantium excepturi deleniti voluptas."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut enim et."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Laboriosam non id temporibus et provident.","client_secret":"Neque quis illo minima.","developer_token":"Earum eligendi.","refresh_token":"Vel quae laudantium amet veritatis rerum itaque."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt repellendus corrupti itaque quo sit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Perspiciatis porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Omnis nobis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Eum et ipsum expedita reprehenderit eos."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum tempore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolorum ut architecto deleniti nostrum."},"sender_name":{"type":"string","description":"Default sender name","example":"Aperiam et nihil."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6605548766358472787,"format":"int64"}},"example":{"account_id":"Aperiam quos perferendis nisi blanditiis eveniet.","brand_kit":"Optio labore omnis.","has_credentials":true,"id":"Distinctio amet enim.","label":"Deserunt quod.","portal_id":"Corporis dolorum consequatur eius perferendis.","project_id":"Rem error.","sender_email":"Omnis vel voluptate necessitatibus enim et et.","sender_name":"Sunt omnis mollitia aut rerum quis et.","status":"active","version":7462268971443661923},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Rem ab corporis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Eaque dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil aut rerum est vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Non dolorem."},"sender_email":{"type":"string","description":"Default sender address","example":"Porro et."},"sender_name":{"type":"string","description":"Default sender name","example":"Dolor aut assumenda fugiat."}},"example":{"account_id":"Aut quas suscipit eos.","brand_kit":"Dolor et corrupti voluptas neque vitae.","label":"Inventore alias error aut maxime dicta.","portal_id":"Ipsa rerum velit et impedit.","sender_email":"Quaerat labore dolor.","sender_name":"Velit quam omnis."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Omnis autem accusamus."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Est assumenda aut."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Molestiae minus dolor accusantium."},"platforms":{"type":"array","items":{"type":"string","example":"Molestias fuga voluptatibus quis adipisci."},"description":"Platforms this job will create on","example":["Ut blanditiis dolor modi nobis aliquid.","Consequatur officiis velit quasi dolores assumenda.","Mollitia fugiat dolore similique et.","Voluptates quaerat molestiae."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Cum porro architecto doloremque aperiam doloribus aut.","platforms":["Cumque iure veritatis cumque nisi.","Distinctio ipsum ab.","Natus placeat esse est in deserunt aliquid."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Distinctio voluptas ut ut nisi."},"job_id":{"type":"string","description":"Job UUID","example":"Tempore nemo illum ut maiores."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}]},"status":{"type":"string","description":"Job status","example":"partial","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Et atque dolor odio labore pariatur.","job_id":"Nostrum velit hic excepturi omnis reprehenderit distinctio.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"queued"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"At odio incidunt distinctio sint qui."},"label":{"type":"string","description":"Optional friendly name","example":"Cumque saepe sint quidem odio ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Esse praesentium voluptatibus deserunt aliquam."},"project_id":{"type":"string","description":"Owning project","example":"Quis quis reprehenderit non quae omnis qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1342488242351916696,"format":"int64"}},"example":{"account_id":"Necessitatibus magni et molestiae.","has_credentials":true,"id":"Eos ut et eligendi.","label":"Est et eum est.","org_id":"Dolorum quas.","project_id":"Numquam dolorum consequatur.","status":"active","version":6946177746341876830},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nulla fuga fugit repellendus et accusamus sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Sequi error.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quam deleniti et et."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Quia aperiam sunt est labore."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus voluptatem iste nisi in."},"app_id":{"type":"string","description":"Meta app ID","example":"Iste qui rerum est sed sed similique."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut est rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"page_id":{"type":"string","description":"Facebook page ID","example":"Dolor occaecati earum iusto rerum sit cupiditate."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3681253484013323435,"format":"int64"}},"example":{"account_id":"Qui quidem exercitationem.","app_id":"Necessitatibus laudantium est ut.","has_credentials":false,"id":"Ea maiores quidem molestiae deleniti omnis.","label":"Nostrum corporis quasi magnam.","page_id":"Architecto quas eligendi impedit qui sed.","project_id":"Expedita voluptatum commodi fuga ipsa.","status":"active","version":8272760528024179326},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Exercitationem illum et quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Neque facilis est qui possimus eligendi."},"page_id":{"type":"string","description":"Facebook page ID","example":"Possimus et corrupti et nobis voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Quia quisquam corrupti distinctio voluptas eius.","label":"Est facilis qui.","page_id":"Modi ut culpa excepturi blanditiis."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Autem est est distinctio sunt aliquid harum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Nam rerum eaque eius."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Rerum illo mollitia odio et dolor.","app_secret":"Consectetur sint error ipsam maiores."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et rerum in expedita."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Consequatur dolore unde illum."},"label":{"type":"string","description":"Optional friendly name","example":"Quo veritatis quis delectus est."},"project_id":{"type":"string","description":"Owning project","example":"Dolores tenetur ut illum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4673192311933251173,"format":"int64"}},"example":{"account_id":"Aperiam cum possimus.","customer_id":"Omnis sed dolore dolorem voluptatibus quod.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Ullam ab suscipit et labore harum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Deleniti doloribus debitis assumenda dignissimos."},"label":{"type":"string","description":"Optional friendly name","example":"Non iste ad rem quidem sunt qui."}},"example":{"account_id":"Quisquam quam officiis aut.","customer_id":"Architecto ut unde.","label":"Vitae aut ea."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sapiente possimus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Voluptates atque."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Eaque voluptate reprehenderit sed voluptatem sed illo."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Cum nisi numquam.","client_secret":"Id unde veritatis officiis aut fugiat.","developer_token":"Quo corporis recusandae dicta quibusdam.","refresh_token":"Ut commodi et voluptas tenetur nobis facere."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Sed sit repudiandae aut aut."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolores vel dolorum minus voluptatem."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"Enim temporibus."}},"example":{"campaign_id":"Qui culpa deleniti.","error":"Et atque enim quis sed.","ok":true,"platform":"Architecto itaque doloribus voluptatem consequatur quis fugiat."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facilis suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Non sint inventore iste iure ut."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis deleniti."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4582993025544492856,"format":"int64"}},"example":{"account_id":"Expedita dignissimos non sed omnis officiis et.","has_credentials":false,"id":"Ad inventore voluptatum eligendi quasi.","label":"Velit dolores omnis placeat unde distinctio ducimus.","project_id":"Ipsa et dolore.","status":"active","version":4526728339972318921},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Enim repellendus magni repudiandae inventore."}},"example":{"account_id":"t2_gv9wtbfa","label":"Corrupti repellat eius ut qui nobis."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Delectus quam et eos."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Rem aut fuga."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Est dolor ut corporis."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Cupiditate ut illo dolor quaerat totam.","client_secret":"Illo vitae occaecati omnis.","refresh_token":"Pariatur debitis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eum et sint corrupti eos."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Qui unde dicta autem dolorem qui explicabo."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo possimus consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque autem ex eos."},"project_id":{"type":"string","description":"Owning project","example":"Quos hic doloribus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4374149818121411294,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","funding_instrument_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Repellat non suscipit veritatis sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim accusantium labore esse numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Dolorum deserunt.","label":"Non laudantium sunt minima repudiandae illo harum."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Saepe voluptatem reiciendis pariatur."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Et ut quis ut."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Sit dolor sunt eos nihil ipsam."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Odio totam cum deleniti placeat fuga."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Aut autem sint minus voluptatum.","access_token_secret":"Tempore quae.","consumer_key":"Iusto omnis.","consumer_secret":"Quia cum non."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 8e0d6c4a..35626754 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -3428,76 +3428,76 @@ definitions: properties: copy: description: Ad copy - example: Iusto velit quo voluptatibus modi reiciendis aliquam. + example: Qui alias ea. event_details: description: Extracted event/course details - example: Odit necessitatibus veritatis amet ut rerum quidem. + example: Eos nesciunt ipsum et delectus dolorum. event_slug: type: string description: Event/course slug - example: Eos voluptatibus. + example: Adipisci quaerat est nobis. id: type: string description: Brief UUID - example: Vero quisquam. + example: Repellendus quo quidem. keywords: description: Keyword list - example: Quidem explicabo expedita sunt. + example: Tempore maxime. platforms: type: array items: type: string - example: Ex delectus. + example: Et veritatis quisquam sed ratione et. description: Suggested default platforms example: - - Ullam dolores rem. - - Officia quidem non qui voluptates natus cum. - - Autem recusandae totam. - - Rerum nisi. + - Molestiae eos. + - Aut iusto quos impedit eos. + - Adipisci rerum consequatur placeat ea odio. program_type: type: string description: Funnel context - example: Facilis reiciendis dignissimos consequatur iste qui minima. + example: Illum rerum error incidunt. project_id: type: string description: Owning project - example: Labore laudantium. + example: Cumque totam nulla aut reprehenderit. status: type: string description: Lifecycle status - example: archived + example: draft enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Similique deserunt iusto. + example: Porro enim dolorum nobis. url: type: string description: Event/course page URL - example: Voluptatem sed quia excepturi. + example: Fugit non fuga rem adipisci. version: type: integer description: Optimistic-concurrency version - example: 8240116664126121650 + example: 6324133014862191516 format: int64 example: - copy: Placeat ea odio ea eos. - event_details: Non adipisci rerum. - event_slug: Adipisci quaerat est nobis. - id: Possimus exercitationem repellendus quo quidem. - keywords: Ipsum et delectus dolorum eveniet. + copy: Aut facilis porro dolor ipsa velit. + event_details: Ut mollitia tempora minima voluptas quod. + event_slug: Aperiam voluptates. + id: Magnam pariatur explicabo est. + keywords: Hic quis facere exercitationem. platforms: - - Veritatis quisquam sed ratione et. - - Cumque molestiae eos rem aut. - - Quos impedit. - program_type: Illum rerum error incidunt. - project_id: Cumque totam nulla aut reprehenderit. - status: approved - targeting: Alias ea quibusdam. - url: Fugit non fuga rem adipisci. - version: 8901460428935487189 + - Aut perferendis natus. + - Eaque ipsam harum nisi nobis et et. + - Excepturi corporis ut. + - Odio eius sed qui deserunt perspiciatis. + program_type: Adipisci ullam pariatur ex voluptas. + project_id: Qui praesentium ipsam officiis cum ipsum recusandae. + status: archived + targeting: Exercitationem aut eaque. + url: Vero ducimus. + version: 5743767113243123162 required: - id - project_id @@ -3511,27 +3511,28 @@ definitions: properties: copy: description: Ad copy - example: Et eveniet. + example: Commodi dicta. event_details: description: Extracted event/course details - example: Est eaque ipsam harum nisi nobis. + example: Consequatur non cumque laudantium quod modi voluptas. event_slug: type: string description: Event/course slug (unique within the project) - example: Enim dolorum nobis itaque est enim. + example: Accusamus et provident provident. keywords: description: Keyword list - example: Corporis ut non. + example: Ad non. platforms: type: array items: type: string - example: Praesentium ipsam officiis cum ipsum recusandae. + example: Sed voluptatum laborum. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Ullam pariatur ex voluptas aspernatur. - - Voluptates aliquam vero ducimus. - - Recusandae aut perferendis. + - Quas sunt eos nulla et perferendis qui. + - Aut reiciendis ullam laborum. + - Et quidem nisi quasi. + - Ab deserunt quia magnam temporibus minus et. program_type: type: string description: Funnel context @@ -3542,22 +3543,24 @@ definitions: - membership targeting: description: Targeting recommendation - example: Eius sed qui deserunt perspiciatis nihil. + example: Dolores voluptatibus. url: type: string description: Event/course page URL - example: Pariatur explicabo est totam. + example: Odit iusto ad animi eos doloribus autem. example: - copy: Provident provident. - event_details: Odit rerum quidem accusamus. - event_slug: Tempora minima voluptas quod facere aut. - keywords: Odit iusto ad animi eos doloribus autem. + copy: Quos accusantium fugit. + event_details: Et expedita itaque quos. + event_slug: Consequatur est unde nihil. + keywords: Excepturi saepe sit vel perspiciatis neque. platforms: - - Hic quis facere exercitationem. - - Exercitationem aut eaque. - program_type: membership - targeting: Sed voluptatum laborum. - url: Porro dolor ipsa. + - Qui eveniet laboriosam possimus. + - Facere velit dolores eligendi. + - Ad voluptatem. + - Tempore impedit. + program_type: education + targeting: Qui molestias. + url: Laudantium quod est voluptas sequi voluptatem. required: - program_type - event_slug @@ -3568,45 +3571,45 @@ definitions: brief_id: type: string description: Parent brief - example: Qui molestias. + example: Nihil dolore suscipit reprehenderit et aut animi. campaign_name: type: string description: Campaign name - example: Aut rerum ut blanditiis dolor. + example: Et aut consequatur inventore enim reiciendis. id: type: string description: Campaign UUID - example: Voluptatibus quos accusantium fugit. + example: Aut molestiae exercitationem et impedit at. platform: type: string description: Channel - example: Molestiae minus dolor accusantium. + example: Ullam omnis autem. platform_campaign_id: type: string description: ID returned by the ad platform - example: Cum molestias fuga voluptatibus quis. + example: Id laboriosam nihil ea. project_id: type: string description: Owning project - example: Excepturi saepe sit vel perspiciatis neque. + example: Quisquam perferendis autem ut alias. status: type: string description: Campaign status - example: Nobis aliquid rerum consequatur officiis velit. + example: Neque ut rerum facilis quia molestiae ratione. version: type: integer description: Optimistic-concurrency version - example: 8006615023617839427 + example: 3905678301175813319 format: int64 example: - brief_id: Omnis voluptates quaerat. - campaign_name: Beatae placeat cumque iure veritatis cumque. - id: Assumenda accusantium. - platform: Quos cum porro architecto. - platform_campaign_id: Aperiam doloribus aut. - project_id: Fugiat dolore similique. - status: Ex distinctio ipsum ab assumenda natus. - version: 5157498100002718362 + brief_id: Consequatur qui molestiae velit ratione nesciunt et. + campaign_name: Enim qui officia id necessitatibus mollitia soluta. + id: Provident officia officiis. + platform: Rerum ut necessitatibus illum ratione. + platform_campaign_id: Mollitia atque atque dolores accusantium non dolor. + project_id: Ut mollitia accusantium dignissimos. + status: Nobis labore dicta. + version: 6819175354933615501 required: - id - project_id @@ -3621,12 +3624,12 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Velit dolores eligendi. + example: Sunt totam incidunt sunt id ipsa. platforms: type: array items: type: string - example: reddit-ads + example: google-ads enum: - google-ads - linkedin-ads @@ -3637,17 +3640,15 @@ definitions: - hubspot description: Platforms to create campaigns on (binding selection) example: - - google-ads - linkedin-ads - hubspot - - hubspot + - meta-ads + - meta-ads example: - config: Est et expedita itaque. + config: Voluptatibus aut. platforms: - - reddit-ads - - microsoft-ads + - hubspot - microsoft-ads - - reddit-ads required: - platforms CampaignUpdateInput: @@ -3657,18 +3658,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Est in deserunt. + example: Incidunt qui aut tempora dolor sequi quia. config: description: Campaign configuration snapshot - example: Odio sunt totam. + example: Culpa iste. status: type: string description: Campaign status - example: Omnis explicabo doloremque et sed. + example: Consequatur velit odio. example: - campaign_name: Sunt id ipsa perspiciatis sunt. - config: Impedit at perspiciatis quisquam perferendis. - status: Velit voluptatibus aut mollitia aut molestiae exercitationem. + campaign_name: Sit incidunt. + config: Qui quisquam voluptatibus sint quia. + status: Officiis est. required: - campaign_name - status @@ -3717,13 +3718,13 @@ definitions: message: type: string description: Human-readable detail - example: Accusamus et atque enim. + example: Sunt assumenda. ok: type: boolean description: Whether the credential authenticated against the provider example: true example: - message: Rerum dicta distinctio. + message: Officia eligendi tempore provident dicta temporibus debitis. ok: false required: - ok @@ -3734,31 +3735,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Reiciendis rerum. + example: Est officia et. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Suscipit ut mollitia accusantium dignissimos numquam. + example: Velit in recusandae maiores et voluptatem voluptatem. label: type: string description: Optional friendly name - example: Ratione nesciunt. + example: Ex quo praesentium voluptas. login_customer_id: type: string description: Manager account used for API access - example: Voluptate mollitia. + example: Eos et architecto voluptas. project_id: type: string description: Owning project - example: Qui molestiae. + example: Mollitia omnis doloribus qui consequatur et. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -3767,17 +3768,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6319115309163667798 + example: 5274458285620360301 format: int64 example: - account_id: Quisquam incidunt qui. + account_id: Nihil nihil quae porro qui rem autem. has_credentials: true - id: Atque dolores accusantium non dolor. - label: Nobis labore dicta. - login_customer_id: Quia exercitationem consequatur velit. - project_id: Enim qui officia id necessitatibus mollitia soluta. - status: inactive - version: 2620236536617279883 + id: Vel natus provident. + label: Ut non error aut et fuga. + login_customer_id: Vitae perspiciatis eveniet quibusdam nobis ut asperiores. + project_id: Perspiciatis id. + status: deleted + version: 4918506778223386612 required: - id - project_id @@ -3814,25 +3815,25 @@ definitions: client_id: type: string description: OAuth client id - example: Officiis est. + example: Quis dicta voluptate aut in corporis. client_secret: type: string description: OAuth client secret - example: Qui quisquam voluptatibus sint quia. + example: Nobis soluta. developer_token: type: string description: Google Ads developer token - example: Tempore nemo illum ut maiores. + example: Vitae accusantium excepturi deleniti voluptas. refresh_token: type: string description: OAuth refresh token - example: Quia culpa iste id sit incidunt. + example: Aut enim et. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Sit repudiandae aut aut ducimus dolores vel. - client_secret: Minus voluptatem sed architecto itaque doloribus. - developer_token: Consequatur quis fugiat expedita recusandae qui. - refresh_token: Accusantium enim temporibus dolor ipsam. + client_id: Laboriosam non id temporibus et provident. + client_secret: Neque quis illo minima. + developer_token: Earum eligendi. + refresh_token: Vel quae laudantium amet veritatis rerum itaque. required: - refresh_token - client_id @@ -3845,11 +3846,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Repellat assumenda nesciunt distinctio eaque aliquam. + example: Deserunt repellendus corrupti itaque quo sit. brand_kit: type: string description: Per-project brand kit selector - example: Et voluptatem deserunt consequuntur omnis sed dolore. + example: Perspiciatis porro. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3857,31 +3858,31 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quo veritatis quis delectus est. + example: Blanditiis mollitia dolores illo nostrum magnam. label: type: string description: Optional friendly name - example: Vel voluptate. + example: Omnis nobis. portal_id: type: string description: HubSpot portal/account ID - example: In hic. + example: Eum et ipsum expedita reprehenderit eos. project_id: type: string description: Owning project - example: Et rerum in expedita. + example: Nostrum tempore. sender_email: type: string description: Default sender address - example: Facere ipsa et reprehenderit dignissimos voluptas. + example: Dolorum ut architecto deleniti nostrum. sender_name: type: string description: Default sender name - example: Consequatur dignissimos itaque quia ut aperiam cum. + example: Aperiam et nihil. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -3890,20 +3891,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4147907586526409625 + example: 6605548766358472787 format: int64 example: - account_id: Assumenda dignissimos beatae vitae aut ea dolor. - brand_kit: Eaque voluptate reprehenderit sed voluptatem sed illo. + account_id: Aperiam quos perferendis nisi blanditiis eveniet. + brand_kit: Optio labore omnis. has_credentials: true - id: Voluptatibus quod necessitatibus non iste ad rem. - label: Harum corporis deleniti doloribus. - portal_id: Sit architecto ut unde. - project_id: Sunt qui cupiditate ullam ab suscipit et. - sender_email: Sapiente possimus. - sender_name: Voluptates atque. - status: error - version: 6055913800302101668 + id: Distinctio amet enim. + label: Deserunt quod. + portal_id: Corporis dolorum consequatur eius perferendis. + project_id: Rem error. + sender_email: Omnis vel voluptate necessitatibus enim et et. + sender_name: Sunt omnis mollitia aut rerum quis et. + status: active + version: 7462268971443661923 required: - id - project_id @@ -3918,34 +3919,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Cum nisi numquam. + example: Rem ab corporis. brand_kit: type: string description: Per-project brand kit selector - example: Blanditiis mollitia dolores illo nostrum magnam. + example: Eaque dolor. label: type: string description: Optional friendly name - example: Praesentium tenetur quas at ut necessitatibus dolor. + example: Nihil aut rerum est vel. portal_id: type: string description: HubSpot portal/account ID - example: Id unde veritatis officiis aut fugiat. + example: Non dolorem. sender_email: type: string description: Default sender address - example: Ut commodi et voluptas tenetur nobis facere. + example: Porro et. sender_name: type: string description: Default sender name - example: Quo corporis recusandae dicta quibusdam. + example: Dolor aut assumenda fugiat. example: - account_id: Omnis nobis. - brand_kit: Dolorum ut architecto deleniti nostrum. - label: Nostrum tempore. - portal_id: Deserunt repellendus corrupti itaque quo sit. - sender_email: Rerum explicabo. - sender_name: Eum et ipsum expedita reprehenderit eos. + account_id: Aut quas suscipit eos. + brand_kit: Dolor et corrupti voluptas neque vitae. + label: Inventore alias error aut maxime dicta. + portal_id: Ipsa rerum velit et impedit. + sender_email: Quaerat labore dolor. + sender_name: Velit quam omnis. required: - account_id HubspotCredentials: @@ -3955,10 +3956,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Aperiam et nihil. + example: Omnis autem accusamus. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Perspiciatis porro. + private_app_token: Est assumenda aut. required: - private_app_token InternalServerError: @@ -3987,16 +3988,18 @@ definitions: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Suscipit quas sunt eos nulla. + example: Molestiae minus dolor accusantium. platforms: type: array items: type: string - example: Qui maiores aut reiciendis ullam. + example: Molestias fuga voluptatibus quis adipisci. description: Platforms this job will create on example: - - Et quidem nisi quasi. - - Ab deserunt quia magnam temporibus minus et. + - Ut blanditiis dolor modi nobis aliquid. + - Consequatur officiis velit quasi dolores assumenda. + - Mollitia fugiat dolore similique et. + - Voluptates quaerat molestiae. status: type: string description: Initial status (always 'queued' on create) @@ -4004,12 +4007,11 @@ definitions: enum: - queued example: - job_id: Consequatur non cumque laudantium quod modi voluptas. + job_id: Cum porro architecto doloremque aperiam doloribus aut. platforms: - - Et ad. - - Quia dolores voluptatibus tempora possimus consequatur. - - Unde nihil et. - - Quod est voluptas sequi voluptatem numquam. + - Cumque iure veritatis cumque nisi. + - Distinctio ipsum ab. + - Natus placeat esse est in deserunt aliquid. status: queued required: - job_id @@ -4021,18 +4023,29 @@ definitions: error: type: string description: Terminal error, if any - example: Nihil ea quod et aut. + example: Distinctio voluptas ut ut nisi. job_id: type: string description: Job UUID - example: Ut alias quis nihil dolore suscipit reprehenderit. + example: Tempore nemo illum ut maiores. result: + type: array + items: + $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state - example: Animi laudantium ullam omnis autem et id. + example: + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. status: type: string description: Job status - example: failed + example: partial enum: - queued - running @@ -4040,10 +4053,26 @@ definitions: - partial - failed example: - error: Molestiae ratione officia fugit provident officia. - job_id: Inventore enim reiciendis. - result: Ut rerum facilis. - status: failed + error: Et atque dolor odio labore pariatur. + job_id: Nostrum velit hic excepturi omnis reprehenderit distinctio. + result: + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + status: queued required: - job_id - status @@ -4055,16 +4084,17 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. required: - brief LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: @@ -4075,12 +4105,10 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Est voluptatum enim earum et doloribus. + config: Vitae reiciendis voluptatem. platforms: - - hubspot - - meta-ads - reddit-ads - - twitter-ads + - microsoft-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4091,16 +4119,17 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. required: - brief LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: @@ -4111,9 +4140,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. - config: Error similique. - status: Maxime fugiat illo. + campaign_name: Alias ullam fugiat deserunt sint nihil iusto. + config: Necessitatibus expedita. + status: Voluptas inventore sit. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4130,10 +4159,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - config - credentials @@ -4147,14 +4176,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - config - credentials @@ -4169,10 +4198,10 @@ definitions: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - config - credentials @@ -4187,12 +4216,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - config - credentials @@ -4206,14 +4235,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. required: - config - credentials @@ -4228,11 +4257,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - config - credentials @@ -4247,13 +4276,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - config - credentials @@ -4265,10 +4294,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4279,7 +4308,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4290,7 +4319,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4301,8 +4330,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4313,10 +4342,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4327,9 +4356,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4340,10 +4369,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4367,12 +4396,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4384,7 +4413,7 @@ definitions: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" required: - config @@ -4397,9 +4426,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4410,9 +4439,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4424,7 +4453,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4436,8 +4465,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. required: - config LinkedinAdsConnection: @@ -4447,7 +4476,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Velit in recusandae maiores et voluptatem voluptatem. + example: Aut est. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4455,23 +4484,23 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut ut nisi fuga nostrum velit hic. + example: At odio incidunt distinctio sint qui. label: type: string description: Optional friendly name - example: Atque dolor odio labore pariatur. + example: Cumque saepe sint quidem odio ab. org_id: type: string description: LinkedIn organization URN id - example: Qui consequatur et dignissimos ex. + example: Esse praesentium voluptatibus deserunt aliquam. project_id: type: string description: Owning project - example: Omnis reprehenderit distinctio quos ut unde. + example: Quis quis reprehenderit non quae omnis qui. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -4480,17 +4509,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 342612035894089324 + example: 1342488242351916696 format: int64 example: - account_id: Vel natus provident. + account_id: Necessitatibus magni et molestiae. has_credentials: true - id: Praesentium voluptas beatae. - label: Eos et architecto voluptas. - org_id: Ut non error aut et fuga. - project_id: Officia et sint numquam accusamus. - status: inactive - version: 4235609230431250467 + id: Eos ut et eligendi. + label: Est et eum est. + org_id: Dolorum quas. + project_id: Numquam dolorum consequatur. + status: active + version: 6946177746341876830 required: - id - project_id @@ -4509,14 +4538,14 @@ definitions: label: type: string description: Optional friendly name - example: Nihil nihil quae porro qui rem autem. + example: Nulla fuga fugit repellendus et accusamus sed. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Et nulla officia vitae. + label: Sequi error. org_id: "208777" required: - account_id @@ -4528,10 +4557,10 @@ definitions: access_token: type: string description: OAuth access token - example: Eveniet quibusdam. + example: Quam deleniti et et. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Ut asperiores quo aut. + access_token: Quia aperiam sunt est labore. required: - access_token MetaAdsConnection: @@ -4541,35 +4570,35 @@ definitions: account_id: type: string description: Provider account identifier - example: Laudantium amet veritatis rerum itaque consequatur laboriosam. + example: Delectus voluptatem iste nisi in. app_id: type: string description: Meta app ID - example: Quis illo minima. + example: Iste qui rerum est sed sed similique. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Et sunt quis dicta voluptate aut in. + example: Ut est rerum. label: type: string description: Optional friendly name - example: Excepturi deleniti voluptas aperiam vel. + example: Natus expedita aspernatur consequuntur quod ducimus molestias. page_id: type: string description: Facebook page ID - example: Provident maiores. + example: Dolor occaecati earum iusto rerum sit cupiditate. project_id: type: string description: Owning project - example: Provident nobis soluta culpa vitae. + example: Occaecati et. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -4578,18 +4607,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 206759142589582139 + example: 3681253484013323435 format: int64 example: - account_id: At odio incidunt distinctio sint qui. - app_id: Enim cumque saepe sint quidem odio. + account_id: Qui quidem exercitationem. + app_id: Necessitatibus laudantium est ut. has_credentials: false - id: Earum eligendi. - label: Provident dicta temporibus debitis. - page_id: Non quae omnis. - project_id: Ipsum sunt assumenda ipsa dolor officia eligendi. - status: inactive - version: 1065443246813246267 + id: Ea maiores quidem molestiae deleniti omnis. + label: Nostrum corporis quasi magnam. + page_id: Architecto quas eligendi impedit qui sed. + project_id: Expedita voluptatum commodi fuga ipsa. + status: active + version: 8272760528024179326 required: - id - project_id @@ -4608,20 +4637,20 @@ definitions: app_id: type: string description: Meta app ID - example: Voluptatibus deserunt. + example: Exercitationem illum et quisquam. label: type: string description: Optional friendly name - example: Accusantium aut. + example: Neque facilis est qui possimus eligendi. page_id: type: string description: Facebook page ID - example: Deleniti error pariatur consequatur esse. + example: Possimus et corrupti et nobis voluptas. example: account_id: act_193556282970417 - app_id: Et eum est molestiae necessitatibus magni. - label: Necessitatibus eos. - page_id: Et eligendi et numquam dolorum consequatur in. + app_id: Quia quisquam corrupti distinctio voluptas eius. + label: Est facilis qui. + page_id: Modi ut culpa excepturi blanditiis. required: - account_id MetaAdsCredentials: @@ -4631,15 +4660,15 @@ definitions: access_token: type: string description: Meta access token - example: Molestiae praesentium perferendis deserunt ipsum dolorum. + example: Autem est est distinctio sunt aliquid harum. app_secret: type: string description: Meta app secret - example: Error nulla fuga fugit repellendus et accusamus. + example: Nam rerum eaque eius. description: Meta Ads credential. Write-only; never returned. example: - access_token: Non sequi error assumenda quam deleniti et. - app_secret: Nam quia aperiam sunt est. + access_token: Rerum illo mollitia odio et dolor. + app_secret: Consectetur sint error ipsam maiores. required: - access_token - app_secret @@ -4650,31 +4679,31 @@ definitions: account_id: type: string description: Provider account identifier - example: A necessitatibus molestiae. + example: Et rerum in expedita. customer_id: type: string description: Microsoft Advertising customer ID - example: Dolorem qui explicabo consequuntur repellat non suscipit. + example: Repellat assumenda nesciunt distinctio eaque aliquam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quos hic doloribus. + example: Consequatur dolore unde illum. label: type: string description: Optional friendly name - example: Eum et sint corrupti eos. + example: Quo veritatis quis delectus est. project_id: type: string description: Owning project - example: Neque autem ex eos. + example: Dolores tenetur ut illum. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4683,17 +4712,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 7747776820204091337 + example: 4673192311933251173 format: int64 example: - account_id: Sit est dolores est et. - customer_id: Velit atque laudantium ullam rerum. + account_id: Aperiam cum possimus. + customer_id: Omnis sed dolore dolorem voluptatibus quod. has_credentials: false - id: Sit tempore. - label: Ut quo iure. - project_id: Magnam ut similique ea minima magnam. - status: deleted - version: 7309957715046801903 + id: Veniam consectetur deserunt in hic dolorum facere. + label: Magni consequatur dignissimos itaque quia. + project_id: Et reprehenderit dignissimos. + status: error + version: 3475949958922975875 required: - id - project_id @@ -4708,19 +4737,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Enim accusantium labore esse numquam. + example: Ullam ab suscipit et labore harum. customer_id: type: string description: Microsoft Advertising customer ID - example: Non laudantium sunt minima repudiandae illo harum. + example: Deleniti doloribus debitis assumenda dignissimos. label: type: string description: Optional friendly name - example: Rerum adipisci. + example: Non iste ad rem quidem sunt qui. example: - account_id: Sit dolor sunt eos nihil ipsam. - customer_id: Odio totam cum deleniti placeat fuga. - label: Dolorum deserunt. + account_id: Quisquam quam officiis aut. + customer_id: Architecto ut unde. + label: Vitae aut ea. required: - account_id MicrosoftAdsCredentials: @@ -4730,25 +4759,25 @@ definitions: client_id: type: string description: OAuth client id - example: Saepe voluptatem reiciendis pariatur. + example: Sapiente possimus. client_secret: type: string description: OAuth client secret - example: Et ut quis ut. + example: Voluptates atque. developer_token: type: string description: Microsoft Advertising developer token - example: Quia cum non. + example: Praesentium tenetur quas at ut necessitatibus dolor. refresh_token: type: string description: OAuth refresh token - example: Iusto omnis. + example: Eaque voluptate reprehenderit sed voluptatem sed illo. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Aut autem sint minus voluptatum. - client_secret: Tempore quae. - developer_token: Dolores tenetur ut illum. - refresh_token: Consequatur dolore unde illum. + client_id: Cum nisi numquam. + client_secret: Id unde veritatis officiis aut fugiat. + developer_token: Quo corporis recusandae dicta quibusdam. + refresh_token: Ut commodi et voluptas tenetur nobis facere. required: - client_id - client_secret @@ -4773,6 +4802,34 @@ definitions: required: - code - message + PlatformResult: + title: PlatformResult + type: object + properties: + campaign_id: + type: string + description: Upstream platform campaign id (present when ok) + example: Sed sit repudiandae aut aut. + error: + type: string + description: Failure reason (present when not ok) + example: Dolores vel dolorum minus voluptatem. + ok: + type: boolean + description: Whether the campaign was created (or reused) successfully + example: false + platform: + type: string + description: Platform this result is for + example: Enim temporibus. + example: + campaign_id: Qui culpa deleniti. + error: Et atque enim quis sed. + ok: true + platform: Architecto itaque doloribus voluptatem consequatur quis fugiat. + required: + - platform + - ok PreconditionFailedError: title: PreconditionFailedError type: object @@ -4818,27 +4875,27 @@ definitions: account_id: type: string description: Provider account identifier - example: Quam quis quam dolor occaecati earum iusto. + example: Facilis suscipit. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Libero ut est rerum est occaecati et. + example: Maiores laudantium. label: type: string description: Optional friendly name - example: Delectus voluptatem iste nisi in. + example: Non sint inventore iste iure ut. project_id: type: string description: Owning project - example: Natus expedita aspernatur consequuntur quod ducimus molestias. + example: Perspiciatis deleniti. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -4847,16 +4904,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6933590282461306362 + example: 4582993025544492856 format: int64 example: - account_id: Nostrum corporis quasi magnam. + account_id: Expedita dignissimos non sed omnis officiis et. has_credentials: false - id: Iste qui rerum est sed sed similique. - label: Expedita voluptatum commodi fuga ipsa. - project_id: Ea maiores quidem molestiae deleniti omnis. - status: inactive - version: 6739884703025890394 + id: Ad inventore voluptatum eligendi quasi. + label: Velit dolores omnis placeat unde distinctio ducimus. + project_id: Ipsa et dolore. + status: active + version: 4526728339972318921 required: - id - project_id @@ -4875,10 +4932,10 @@ definitions: label: type: string description: Optional friendly name - example: Sint ipsa quo. + example: Enim repellendus magni repudiandae inventore. example: account_id: t2_gv9wtbfa - label: Architecto quas eligendi impedit qui sed. + label: Corrupti repellat eius ut qui nobis. required: - account_id RedditAdsCredentials: @@ -4888,20 +4945,20 @@ definitions: client_id: type: string description: OAuth client id - example: Necessitatibus laudantium est ut. + example: Delectus quam et eos. client_secret: type: string description: OAuth client secret - example: Neque facilis est qui possimus eligendi. + example: Rem aut fuga. refresh_token: type: string description: OAuth refresh token - example: Possimus et corrupti et nobis voluptas. + example: Est dolor ut corporis. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Exercitationem illum et quisquam. - client_secret: Est facilis qui. - refresh_token: Modi ut culpa excepturi blanditiis. + client_id: Cupiditate ut illo dolor quaerat totam. + client_secret: Illo vitae occaecati omnis. + refresh_token: Pariatur debitis. required: - client_id - client_secret @@ -4913,31 +4970,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Rerum illo mollitia odio et dolor. + example: Eum et sint corrupti eos. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Ipsam maiores et maiores laudantium aut perspiciatis. + example: Qui unde dicta autem dolorem qui explicabo. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quia quisquam corrupti distinctio voluptas eius. + example: Explicabo possimus consequatur. label: type: string description: Optional friendly name - example: Nam rerum eaque eius. + example: Neque autem ex eos. project_id: type: string description: Owning project - example: Autem est est distinctio sunt aliquid harum. + example: Quos hic doloribus. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -4946,17 +5003,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 9024066918837864439 + example: 4374149818121411294 format: int64 example: - account_id: Ad inventore voluptatum eligendi quasi. - funding_instrument_id: Aperiam velit dolores. - has_credentials: true - id: Voluptates non sint inventore iste iure ut. - label: Porro voluptate. - project_id: Facilis suscipit. - status: inactive - version: 358292288538552244 + account_id: Sit est dolores est et. + funding_instrument_id: Velit atque laudantium ullam rerum. + has_credentials: false + id: Repellat non suscipit veritatis sit tempore. + label: Ut quo iure. + project_id: Magnam ut similique ea minima magnam. + status: deleted + version: 7309957715046801903 required: - id - project_id @@ -4975,15 +5032,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Dignissimos non sed omnis officiis et. + example: Enim accusantium labore esse numquam. label: type: string description: Optional friendly name - example: Placeat unde distinctio ducimus qui. + example: Rerum adipisci. example: account_id: 8r7gb - funding_instrument_id: Magni repudiandae. - label: Laboriosam qui id enim. + funding_instrument_id: Dolorum deserunt. + label: Non laudantium sunt minima repudiandae illo harum. required: - account_id TwitterAdsCredentials: @@ -4993,25 +5050,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Eos quaerat rem aut fuga. + example: Saepe voluptatem reiciendis pariatur. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Est dolor ut corporis. + example: Et ut quis ut. consumer_key: type: string description: OAuth 1.0a consumer key - example: Nihil corrupti repellat eius. + example: Sit dolor sunt eos nihil ipsam. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Qui nobis et delectus quam. + example: Odio totam cum deleniti placeat fuga. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Pariatur debitis. - access_token_secret: Explicabo possimus consequatur. - consumer_key: Cupiditate ut illo dolor quaerat totam. - consumer_secret: Illo vitae occaecati omnis. + access_token: Aut autem sint minus voluptatum. + access_token_secret: Tempore quae. + consumer_key: Iusto omnis. + consumer_secret: Quia cum non. required: - consumer_key - consumer_secret diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index 70d86339..819d47c6 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et eum ex doloremque quia."},"example":"Eum itaque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Architecto voluptas ratione delectus ut adipisci.","event_details":"Quas qui mollitia perferendis eveniet voluptas est.","event_slug":"Ullam tenetur quia totam magni sunt repellat.","id":"A quos a sed exercitationem ut.","keywords":"Temporibus aliquam animi unde.","platforms":["Quo eum dignissimos iure.","Ea quis."],"program_type":"Doloremque itaque eius magni autem.","project_id":"Ut minus in nemo perspiciatis et qui.","status":"draft","targeting":"Ut est nobis aspernatur.","url":"Ex tempore.","version":1756394405346388080}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aperiam et ab."},"example":"Tempore vel quia cum."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Recusandae recusandae est et fuga veniam natus."},"example":"Et iusto doloremque odio."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsum expedita animi."},"example":"Ratione est omnis voluptas praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolorum excepturi quibusdam.","event_details":"Enim magnam eius voluptas voluptatibus deleniti.","event_slug":"Hic vero et.","id":"Voluptas et accusamus quia et officiis ipsum.","keywords":"Amet iusto provident sequi est.","platforms":["Aspernatur qui quidem est eligendi.","Non accusantium quis architecto."],"program_type":"Incidunt ipsum est perspiciatis soluta voluptas est.","project_id":"Explicabo cupiditate rerum.","status":"draft","targeting":"Quaerat ea accusantium.","url":"Ut ea alias.","version":4496268214732198365}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Aspernatur voluptatum facilis."},"example":"Laboriosam et."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sapiente alias et error nobis minima."},"example":"Fuga maxime tempora rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Veniam maiores dolorum sit et.","event_details":"Dolor ut.","event_slug":"Et assumenda recusandae.","id":"Saepe pariatur.","keywords":"Porro sed minus illo rerum ut.","platforms":["Id incidunt qui et ratione sit quaerat.","Ipsum quia ad a.","Veritatis omnis excepturi.","Et pariatur molestias autem."],"program_type":"Soluta alias natus aut eligendi ea.","project_id":"Est quaerat id qui repudiandae.","status":"draft","targeting":"Totam sequi.","url":"Sint eveniet dicta numquam doloremque ab cumque.","version":4401871562627166296}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Earum debitis."},"example":"Perspiciatis dolor pariatur quae amet."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Occaecati quam nostrum quis."},"example":"Maxime temporibus earum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Blanditiis et qui est dolorem eos.","event_details":"Modi sed.","event_slug":"Eligendi earum qui est et id laudantium.","id":"Sed ea.","keywords":"Dolorem sed atque.","platforms":["Veritatis harum ab nobis.","Atque inventore fugiat aut laboriosam maxime facere."],"program_type":"Et tempore.","project_id":"Ut nihil quo tenetur doloribus fugiat natus.","status":"archived","targeting":"Provident id quia porro rerum.","url":"Ratione incidunt est saepe.","version":2165165569618896837}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Qui minus sit necessitatibus."},"example":"Aut est et."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Id ducimus eius et laboriosam omnis vitae.","platforms":["Non voluptas ut enim.","Rerum sint optio."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Debitis ea molestiae eum voluptatum."},"example":"Illo eveniet."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur nemo molestiae modi ut non atque."},"example":"Sed commodi voluptatibus."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ut consectetur.","campaign_name":"Est qui molestiae rerum adipisci minima quibusdam.","id":"Hic voluptas debitis error.","platform":"Commodi quam voluptates.","platform_campaign_id":"Optio dolorem omnis.","project_id":"Veniam eum ut libero quibusdam debitis.","status":"Accusantium sunt culpa libero quisquam.","version":6082718548704928320}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Aut molestias aut excepturi cumque."},"example":"Esse voluptate non autem."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut hic distinctio non recusandae et qui."},"example":"Totam unde."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Enim ea.","campaign_name":"Totam sapiente vitae numquam ut nesciunt voluptas.","id":"Necessitatibus expedita.","platform":"Asperiores et.","platform_campaign_id":"Laboriosam quis facere.","project_id":"Beatae autem autem.","status":"Exercitationem consectetur.","version":6868385032394830606}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Ipsum quaerat delectus cupiditate sit et.","has_credentials":true,"id":"Eum dolorum.","label":"Veniam velit sequi sit impedit dolorum voluptas.","login_customer_id":"Sed non.","project_id":"Distinctio vel.","status":"error","version":4111850562907897222}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ut nostrum officiis et accusamus provident."},"example":"Rerum reiciendis similique."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Perspiciatis saepe consequatur doloribus sequi et.","has_credentials":true,"id":"Nulla ut laboriosam.","label":"Omnis suscipit corrupti reiciendis.","login_customer_id":"Nihil quia omnis eaque aperiam eum.","project_id":"Rerum delectus velit.","status":"active","version":3995988906528985875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit ut repellat voluptas."},"example":"Repudiandae odit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Ut laborum nostrum veniam qui rerum.","has_credentials":true,"id":"Aut ratione sunt nostrum tenetur.","label":"Fugit enim et sint consectetur ea minus.","login_customer_id":"Magnam ut et ab.","project_id":"Dolorem cum.","status":"active","version":5799897036572741099}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sapiente ut sit quod.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quo omnis et et molestiae dolorum."},"example":"Consequatur iste eum amet vel impedit et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Deleniti itaque voluptas magnam.","brand_kit":"Dolor id.","has_credentials":false,"id":"Dolorem sapiente.","label":"Sint autem.","portal_id":"Vitae optio ut et consequuntur.","project_id":"Aut natus.","sender_email":"Libero autem ut.","sender_name":"Debitis soluta sed quod dicta aperiam eveniet.","status":"error","version":7443019901611180865}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Architecto ab et libero ea aut."},"example":"Corrupti aut earum rerum ducimus dicta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Qui et.","brand_kit":"Porro ea cum et magni adipisci.","has_credentials":false,"id":"Ad esse neque earum modi.","label":"Ab voluptatem esse.","portal_id":"Aut culpa impedit sit quibusdam nulla adipisci.","project_id":"Quis possimus placeat.","sender_email":"Dolorem molestias natus velit.","sender_name":"Non dolorum odit est.","status":"active","version":8186374755967651666}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et rerum repudiandae et at iusto."},"example":"Voluptas esse qui quisquam quae est magni."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Ut aut.","brand_kit":"Ut voluptas et accusamus natus.","has_credentials":false,"id":"Saepe rerum sunt eum et qui aut.","label":"Voluptas expedita omnis ex.","portal_id":"Minima ut quasi voluptatum officia quod error.","project_id":"Ut quia harum.","sender_email":"Quia inventore est quia enim illo.","sender_name":"Eligendi aperiam.","status":"error","version":9020823344753101103}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Distinctio aut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et officia sequi et quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur sint et vel molestiae."},"example":"Natus pariatur et et sed debitis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ducimus sequi.","has_credentials":true,"id":"Et placeat.","label":"Aut et.","org_id":"Culpa voluptas quia tenetur.","project_id":"Qui esse.","status":"inactive","version":3277300697475451657}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate est illo repellat et cum repellat."},"example":"Facilis repellat eveniet reiciendis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Nobis ipsam.","label":"Velit sapiente qui iusto quis magni et.","org_id":"Officiis deleniti ipsam nam.","project_id":"Aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quaerat iure ipsam."},"example":"Minima adipisci aut quia quisquam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Minus voluptas asperiores debitis labore aut.","has_credentials":true,"id":"Enim consequatur id voluptatem adipisci alias.","label":"Tempora ipsum aut enim harum.","org_id":"Necessitatibus consequatur natus tempora ut.","project_id":"Sequi consequatur dolorum sint voluptatem voluptas omnis.","status":"error","version":7443611122231905788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Nihil ad hic repellendus nobis voluptatem.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Asperiores ipsum quam.","app_id":"Cum rem architecto vel quibusdam vel autem.","has_credentials":false,"id":"Non praesentium voluptas saepe sit.","label":"Reiciendis qui id tenetur exercitationem aperiam incidunt.","page_id":"Qui suscipit rerum quo eligendi tempora.","project_id":"Sed qui.","status":"active","version":5968285761891001183}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia facilis sit."},"example":"Possimus accusantium expedita alias."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ratione quis.","app_id":"Aut assumenda unde occaecati eum tenetur nam.","has_credentials":true,"id":"Voluptatibus qui cupiditate voluptatem.","label":"Ut in possimus quia nulla.","page_id":"Vel consequatur ea deserunt.","project_id":"Et corporis officia sint.","status":"error","version":935673982343451083}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit harum ipsa et."},"example":"Commodi et nihil et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Aliquid ducimus quia.","app_id":"Quas tenetur velit quaerat aut.","has_credentials":true,"id":"Hic delectus.","label":"Quibusdam aliquam consequuntur.","page_id":"Aut odio iste assumenda deleniti earum magni.","project_id":"Maxime ut possimus expedita.","status":"inactive","version":7469982570284737303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Et quo.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Amet qui provident."},"example":"Ut ea."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Ut tempora consequuntur cumque repudiandae omnis ut.","customer_id":"Est aut labore sint natus.","has_credentials":false,"id":"Vero quis consequuntur.","label":"Ut fugiat magnam quia.","project_id":"Quis quo illum cum quod.","status":"active","version":343208040254291221}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Earum laboriosam dignissimos reiciendis et quisquam."},"example":"Deserunt reiciendis dolorem totam voluptatem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Autem aspernatur ea voluptatem.","customer_id":"Accusantium aspernatur facere tempora voluptatem dicta rerum.","has_credentials":true,"id":"Eos explicabo non quidem.","label":"Nam voluptas sed et doloremque reiciendis pariatur.","project_id":"Debitis itaque itaque dolores nihil.","status":"deleted","version":8497111294039610948}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laudantium doloremque aut eligendi perferendis aut."},"example":"Consectetur delectus libero id."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"In expedita.","customer_id":"Magni ducimus nulla suscipit sed minus soluta.","has_credentials":false,"id":"Iste voluptatem et voluptatem ut ut.","label":"Quia sed omnis quaerat aut.","project_id":"Nostrum laborum minima.","status":"error","version":7283482467977491974}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed maiores qui sed exercitationem quam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed ipsam enim esse iure est."},"example":"Aut sunt ex et autem delectus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Ipsam temporibus sint et necessitatibus dolorem ut.","has_credentials":true,"id":"Quidem illo numquam doloremque et.","label":"Fugiat adipisci eos rerum.","project_id":"Perferendis ut quia aut.","status":"active","version":1442766184420227830}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem omnis aspernatur veritatis adipisci."},"example":"Voluptas ipsam iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Asperiores velit enim tempore expedita ut.","has_credentials":false,"id":"Sapiente et et itaque dolores in.","label":"Consequatur nihil explicabo vero commodi est.","project_id":"Rem dolores eligendi ea.","status":"deleted","version":2256150830368172012}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Adipisci omnis veritatis omnis praesentium omnis."},"example":"Natus aliquam aut quas aliquid."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Architecto unde rerum quisquam ut.","has_credentials":true,"id":"Veniam debitis aut similique ullam temporibus qui.","label":"Voluptates neque expedita.","project_id":"Sit iusto.","status":"deleted","version":2250019048790832853}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Repellendus sint.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam voluptatibus nihil."},"example":"Voluptas consequatur iusto nostrum pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Numquam quia.","funding_instrument_id":"Autem provident est.","has_credentials":true,"id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Sit ex commodi sapiente a illum.","project_id":"Pariatur voluptas odit fuga illo.","status":"active","version":4562568070495708080}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Saepe non tempore."},"example":"Tempore qui est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","funding_instrument_id":"Accusamus ratione consequuntur aut et corrupti.","has_credentials":false,"id":"Beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Laborum ut magnam aut illum commodi placeat."},"example":"Voluptas libero pariatur ut qui sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Odio adipisci dolore iste ipsa.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Ipsa sint optio nobis quae corporis."},"example":"Et iste."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Veniam et.","job_id":"Iure modi asperiores ut.","result":"Autem voluptates iste.","status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Eaque ut laudantium nostrum ratione."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non iusto odit consequatur in vero soluta."},"event_details":{"description":"Extracted event/course details","example":"Laboriosam nostrum quos expedita voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Deserunt labore et id aut et adipisci."},"id":{"type":"string","description":"Brief UUID","example":"Et qui ut libero numquam."},"keywords":{"description":"Keyword list","example":"Eius laborum."},"platforms":{"type":"array","items":{"type":"string","example":"Voluptates ut culpa saepe necessitatibus."},"description":"Suggested default platforms","example":["Enim id voluptas aperiam distinctio.","Harum eos eveniet ut."]},"program_type":{"type":"string","description":"Funnel context","example":"Esse voluptate eum laboriosam distinctio non."},"project_id":{"type":"string","description":"Owning project","example":"Ullam facilis ab sapiente voluptatem."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Voluptate itaque fugit rerum cumque."},"url":{"type":"string","description":"Event/course page URL","example":"Ut molestiae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7582961521318439491,"format":"int64"}},"example":{"copy":"Ut ut odio odio sed minus quia.","etag":"Itaque omnis ut.","event_details":"Nihil sunt doloremque.","event_slug":"Porro ut et cupiditate.","id":"Eius dicta.","keywords":"Ea architecto autem iste.","platforms":["Necessitatibus dolorem enim beatae.","Minus vero at ut quis.","Molestiae aut fugit alias.","Qui maiores quia non unde deserunt."],"program_type":"Non assumenda perspiciatis.","project_id":"Ullam distinctio dolore velit.","status":"draft","targeting":"In ipsa tempore incidunt velit provident perspiciatis.","url":"Ea ullam minima voluptatem vel deleniti.","version":1281384136826250351},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quod enim pariatur et occaecati veritatis voluptatem."},"event_details":{"description":"Extracted event/course details","example":"Iure enim dolore est."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil atque."},"id":{"type":"string","description":"Brief UUID","example":"Et optio sed omnis aut voluptatem voluptas."},"keywords":{"description":"Keyword list","example":"Architecto aliquam mollitia labore sapiente dolores tenetur."},"platforms":{"type":"array","items":{"type":"string","example":"Vero ad ex consequatur dolore."},"description":"Suggested default platforms","example":["Beatae eaque quo atque.","Error eligendi incidunt accusamus excepturi inventore.","Est ut voluptas quod.","Dolor qui molestiae id aut."]},"program_type":{"type":"string","description":"Funnel context","example":"Et eum inventore quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Eum omnis est blanditiis maxime et."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Accusamus qui."},"url":{"type":"string","description":"Event/course page URL","example":"Nihil facilis sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1931126915939314041,"format":"int64"}},"example":{"copy":"Necessitatibus sit.","event_details":"Sit dignissimos incidunt voluptas.","event_slug":"Reiciendis enim.","id":"Mollitia ea.","keywords":"Quis aperiam deserunt nostrum consectetur et sed.","platforms":["Nemo nihil dolorum consequatur sed tempora qui.","Hic vel aspernatur at quam est ea."],"program_type":"Ad quae nisi.","project_id":"Et amet sunt.","status":"approved","targeting":"Libero blanditiis.","url":"Cum et ab ipsum.","version":1441686313140477581},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Praesentium et."},"event_details":{"description":"Extracted event/course details","example":"Dolor consectetur eos iste."},"event_slug":{"type":"string","description":"Event/course slug","example":"Dolores laborum sed."},"id":{"type":"string","description":"Brief UUID","example":"Nulla sunt autem eos rerum provident dicta."},"keywords":{"description":"Keyword list","example":"Veniam iusto consequatur quia sed officia eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"Est quis impedit."},"description":"Suggested default platforms","example":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."]},"program_type":{"type":"string","description":"Funnel context","example":"Commodi odio sunt esse mollitia incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem voluptate dolor dolores provident."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Qui impedit."},"url":{"type":"string","description":"Event/course page URL","example":"Veritatis itaque."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1624749011573187666,"format":"int64"}},"example":{"copy":"Amet quaerat modi.","event_details":"Velit quis harum recusandae est ipsum.","event_slug":"Quo necessitatibus necessitatibus.","id":"Minus reprehenderit dignissimos aut velit.","keywords":"Eum totam voluptatem eos.","platforms":["Voluptatem rerum praesentium voluptatem blanditiis non.","Temporibus in repudiandae tenetur.","Saepe vel aut animi sit esse ratione.","Blanditiis laborum est quasi dignissimos."],"program_type":"Repellendus omnis doloribus amet cum.","project_id":"At sint laborum veniam.","status":"approved","targeting":"Sint exercitationem.","url":"Sint dicta.","version":6296331077615132388},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Placeat dolores numquam molestias quibusdam aliquid."},"event_details":{"description":"Extracted event/course details","example":"Et itaque ut dolores in voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Autem quo tempora voluptate fuga."},"id":{"type":"string","description":"Brief UUID","example":"Sit in quia molestiae perspiciatis alias et."},"keywords":{"description":"Keyword list","example":"Fuga est aliquam debitis."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum cum eaque nesciunt est totam inventore."},"description":"Suggested default platforms","example":["Ipsam aut vel.","Eos reiciendis.","Minima non."]},"program_type":{"type":"string","description":"Funnel context","example":"Libero et consequuntur suscipit distinctio pariatur mollitia."},"project_id":{"type":"string","description":"Owning project","example":"Ex molestiae praesentium."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Deleniti est natus sequi beatae consectetur."},"url":{"type":"string","description":"Event/course page URL","example":"Distinctio maiores mollitia aut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7075859053648216976,"format":"int64"}},"example":{"copy":"Distinctio tempore qui velit omnis dolorem est.","event_details":"Voluptatibus nihil nisi.","event_slug":"Est molestiae voluptates ipsum neque sapiente aliquid.","id":"Et quis consequatur dolores repellat nostrum similique.","keywords":"Quia recusandae dignissimos dolore harum totam.","platforms":["Nobis hic eos magni eos voluptatem.","Hic ut sapiente harum aliquam sunt eum.","Eaque occaecati."],"program_type":"Minima aut fugit eos et iure laudantium.","project_id":"Iste aliquid.","status":"draft","targeting":"Vitae illo consequuntur esse.","url":"Velit sunt molestiae eius.","version":7533657070215672415},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Et provident illo non quisquam iure doloremque."},"event_details":{"description":"Extracted event/course details","example":"Est et magni."},"event_slug":{"type":"string","description":"Event/course slug","example":"Voluptatem ipsa."},"id":{"type":"string","description":"Brief UUID","example":"Ut ullam aliquam dolore iure consequatur."},"keywords":{"description":"Keyword list","example":"Ut aliquid."},"platforms":{"type":"array","items":{"type":"string","example":"Tempora est eveniet sequi ea."},"description":"Suggested default platforms","example":["Consequatur possimus.","Assumenda sit delectus veniam."]},"program_type":{"type":"string","description":"Funnel context","example":"Quia labore non ut dolores et."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum iste nemo fugiat sunt deleniti officia."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Repellendus eveniet veritatis impedit aut iste earum."},"url":{"type":"string","description":"Event/course page URL","example":"Assumenda excepturi."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2088061558739708952,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Quis odio enim nam id voluptatem.","id":"Accusamus pariatur saepe.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Eaque suscipit harum sint neque quia fuga.","Veniam itaque optio consequatur nulla sint."],"program_type":"Laboriosam sunt quis omnis animi.","project_id":"Qui et.","status":"approved","targeting":"Cupiditate aut.","url":"Vero alias temporibus illum.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Optio labore omnis."},"event_details":{"description":"Extracted event/course details","example":"Sunt omnis mollitia aut rerum quis et."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Amet enim non rem."},"keywords":{"description":"Keyword list","example":"Nihil aut rerum est vel."},"platforms":{"type":"array","items":{"type":"string","example":"Quos perferendis nisi blanditiis eveniet quasi ea."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Corporis dolorum consequatur eius perferendis.","Omnis vel voluptate necessitatibus enim et et."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Rem ab corporis."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas deserunt quod officiis."}},"example":{"copy":"Vitae vel omnis autem accusamus mollitia.","event_details":"Corrupti voluptas.","event_slug":"Dolorem repellendus porro et distinctio.","keywords":"Assumenda aut harum eligendi rerum numquam amet.","platforms":["Error aut maxime dicta qui.","Quas suscipit eos nam ipsa.","Velit et impedit facilis quaerat.","Dolor ut velit quam omnis et dolor."],"program_type":"education","targeting":"Rem quia vel ipsam dolores.","url":"Aut assumenda fugiat quia eaque dolor porro."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Facere qui omnis."},"campaign_name":{"type":"string","description":"Campaign name","example":"Dolores natus a sint quod sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa non."},"id":{"type":"string","description":"Campaign UUID","example":"Et itaque rem eos et deleniti dolores."},"platform":{"type":"string","description":"Channel","example":"Enim vitae officia dolorem odio."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Beatae quia qui excepturi minima."},"project_id":{"type":"string","description":"Owning project","example":"Facilis qui libero."},"status":{"type":"string","description":"Campaign status","example":"Et nesciunt iure quis in ut mollitia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9203456138223090094,"format":"int64"}},"example":{"brief_id":"Dolores sit.","campaign_name":"Amet omnis.","etag":"Sit cupiditate non.","id":"Necessitatibus quibusdam.","platform":"Exercitationem accusantium nihil.","platform_campaign_id":"Quod alias ipsum voluptates pariatur magni.","project_id":"Est accusantium laudantium nostrum.","status":"At fugit dolor.","version":6873369027351486557},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quaerat et eius culpa magni illum consequatur."},"campaign_name":{"type":"string","description":"Campaign name","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"id":{"type":"string","description":"Campaign UUID","example":"Minima iure quos enim occaecati beatae."},"platform":{"type":"string","description":"Channel","example":"Soluta dolore vitae."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"In commodi et asperiores et."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Campaign status","example":"Assumenda voluptatem aut debitis vitae."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":529135087014785401,"format":"int64"}},"example":{"brief_id":"Et et itaque qui repudiandae magnam.","campaign_name":"Quaerat molestias.","id":"Eos eius.","platform":"Ullam qui rerum numquam quo.","platform_campaign_id":"A quia magnam culpa ipsam totam.","project_id":"Odit rerum commodi ea et.","status":"Sequi aut veniam ratione.","version":4528974556497386277},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Quo et enim totam et minima dolorem."},"campaign_name":{"type":"string","description":"Campaign name","example":"In praesentium cumque."},"id":{"type":"string","description":"Campaign UUID","example":"Omnis ad voluptas esse voluptates."},"platform":{"type":"string","description":"Channel","example":"Est tempora qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Voluptas necessitatibus cumque non porro qui molestias."},"project_id":{"type":"string","description":"Owning project","example":"Cumque mollitia."},"status":{"type":"string","description":"Campaign status","example":"Pariatur odio molestias voluptatum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7642665711405677689,"format":"int64"}},"example":{"brief_id":"Qui omnis nesciunt qui consequuntur.","campaign_name":"Odit provident sed quo aperiam.","id":"Perferendis possimus deserunt iure et.","platform":"Fuga atque.","platform_campaign_id":"Sequi culpa.","project_id":"Ea quidem ducimus tempora ea molestias.","status":"Aspernatur nihil et incidunt dolorem dolor sed.","version":7197986407230546835},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Voluptatum veniam molestiae."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","twitter-ads"]}},"example":{"config":"Aspernatur voluptatem nobis.","platforms":["google-ads","meta-ads","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Modi possimus consequatur."},"config":{"description":"Campaign configuration snapshot","example":"Voluptatibus aspernatur."},"status":{"type":"string","description":"Campaign status","example":"Eveniet esse officia explicabo dolor deserunt."}},"example":{"campaign_name":"Accusamus nam cupiditate.","config":"Earum minus autem omnis qui debitis eum.","status":"Hic vel ut."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Veniam dolores quidem necessitatibus."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Sit reiciendis et vel beatae molestiae.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Et incidunt pariatur quod.","event_details":"Molestiae inventore voluptas.","event_slug":"Voluptas corporis velit et.","keywords":"Placeat velit ullam enim voluptatem cupiditate voluptas.","platforms":["Molestiae saepe qui.","Commodi voluptatem expedita."],"program_type":"membership","targeting":"Facilis iste.","url":"Quia ut atque."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Est voluptatum enim earum et doloribus.","platforms":["hubspot","meta-ads","reddit-ads","twitter-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."},"credentials":{"private_app_token":"Distinctio aut."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"},"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."},"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."},"credentials":{"client_id":"Laborum voluptatem dignissimos necessitatibus consequuntur aliquam.","client_secret":"Fugit dignissimos ipsum voluptatem et quam beatae.","developer_token":"Ipsam aut quis qui laudantium.","refresh_token":"Omnis eveniet esse aut et rem suscipit."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."},"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."},"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic est quia pariatur odit ullam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Sed quo perferendis nemo ut quisquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Quod impedit accusamus incidunt minus veritatis enim."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Repellendus quos magnam."},"project_id":{"type":"string","description":"Owning project","example":"Vel inventore aliquid aut non eligendi accusamus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2175885598856983154,"format":"int64"}},"example":{"account_id":"Quae qui inventore dolorem deserunt.","etag":"Rerum sint.","has_credentials":true,"id":"In id voluptatem nihil quaerat.","label":"Hic rerum accusamus velit error.","login_customer_id":"Magnam adipisci architecto deserunt.","project_id":"Pariatur repellat vel.","status":"active","version":1017420418363680400},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem maxime hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Harum voluptates sit est corporis."},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus ut necessitatibus in."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Amet hic est."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem repellat expedita inventore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7828959688196597051,"format":"int64"}},"example":{"account_id":"Libero autem quod saepe ullam ipsum.","has_credentials":false,"id":"Quaerat occaecati rerum.","label":"Aspernatur quos est magnam voluptates.","login_customer_id":"Dolore sed.","project_id":"Quae esse mollitia et dolorum.","status":"error","version":3252068377050447352},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est ipsam sint autem repudiandae asperiores et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sunt accusantium totam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi qui."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Nulla dolore quibusdam ducimus voluptas soluta."},"project_id":{"type":"string","description":"Owning project","example":"Accusantium debitis adipisci qui iste explicabo."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7019802315342385433,"format":"int64"}},"example":{"account_id":"Ex est modi cupiditate.","has_credentials":true,"id":"Qui at fugiat est omnis inventore.","label":"Consequatur quisquam explicabo.","login_customer_id":"Consequatur molestias et et deleniti sint.","project_id":"Ab totam laboriosam quos omnis deserunt.","status":"error","version":765646658236151796},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam et asperiores quae voluptatem velit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit eos."},"label":{"type":"string","description":"Optional friendly name","example":"Hic quam impedit placeat consequatur."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Enim voluptas numquam."},"project_id":{"type":"string","description":"Owning project","example":"Quidem est."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5408757854107547795,"format":"int64"}},"example":{"account_id":"Officia dolorem.","has_credentials":true,"id":"Et iusto eius dolor magnam necessitatibus.","label":"Tempora voluptatem rem fugit accusantium est necessitatibus.","login_customer_id":"Aut soluta quae et est et corporis.","project_id":"Mollitia earum aut qui sit rerum.","status":"inactive","version":758133864872776679},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sed corrupti sit."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Labore quia esse consectetur tenetur eum."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Aut ut sit nisi architecto."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Natus vitae consequatur eos sit aut ut."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Praesentium voluptate.","client_secret":"Qui impedit temporibus eveniet eos omnis cumque.","developer_token":"Ipsam ut sed natus et unde.","refresh_token":"Rerum et recusandae possimus quis."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia omnis commodi aspernatur pariatur nostrum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quia omnis in qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Perferendis est ipsum aut voluptas molestias."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor ea iusto eveniet velit sint odit."},"label":{"type":"string","description":"Optional friendly name","example":"Quis quae quam enim."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Fuga voluptas ut vero autem consequuntur."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa eos nemo cupiditate et esse voluptate."},"sender_email":{"type":"string","description":"Default sender address","example":"Omnis a pariatur omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit dolorem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1005353535355254376,"format":"int64"}},"example":{"account_id":"Veniam molestias.","brand_kit":"Hic magni.","etag":"Commodi recusandae.","has_credentials":false,"id":"Nihil ut.","label":"Minus voluptatem ab delectus porro.","portal_id":"Cumque rerum.","project_id":"Mollitia nulla.","sender_email":"Modi esse voluptatibus.","sender_name":"Fugit dolorum nulla quo veritatis id.","status":"error","version":3871826656092488452},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Atque qui dignissimos aut eaque eveniet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Odit numquam quia."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Aut dolores."},"sender_name":{"type":"string","description":"Default sender name","example":"Voluptatem beatae quis dignissimos voluptatem et labore."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Modi vel aut rerum.","brand_kit":"Dolor eum et consequatur.","has_credentials":false,"id":"Ut unde dolore id.","label":"Ad optio magnam sequi esse.","portal_id":"Assumenda cum nemo esse nobis.","project_id":"Necessitatibus fuga ducimus dolorem ut aspernatur.","sender_email":"Aut dolorem ea veniam.","sender_name":"Quae adipisci doloribus ullam.","status":"deleted","version":9002316743787506494},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"At magnam saepe incidunt nisi est."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Deleniti non in iure dolores et quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio enim nisi doloremque rerum sed consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus non aliquid qui."},"project_id":{"type":"string","description":"Owning project","example":"Quia amet vero dolorum incidunt officia nihil."},"sender_email":{"type":"string","description":"Default sender address","example":"Neque sed alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Id ducimus excepturi est et est."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6047270410556243251,"format":"int64"}},"example":{"account_id":"Corrupti sint molestiae occaecati est.","brand_kit":"Nesciunt sed magnam sed vero nulla.","has_credentials":true,"id":"Recusandae similique assumenda ut quia.","label":"Nam eius nulla suscipit ullam.","portal_id":"Ratione nobis ut occaecati tenetur minima veritatis.","project_id":"Nesciunt minus natus non.","sender_email":"Impedit laborum quaerat qui ut ut qui.","sender_name":"Explicabo dolorem totam non.","status":"error","version":9169545032565251193},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sunt labore voluptate."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Beatae non et excepturi sit minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel et et iure tempora."},"label":{"type":"string","description":"Optional friendly name","example":"Eum ut."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Possimus saepe quam culpa qui."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatum perspiciatis autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Ipsa molestias."},"sender_name":{"type":"string","description":"Default sender name","example":"Nam debitis hic qui consequatur laborum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2692133725202625638,"format":"int64"}},"example":{"account_id":"Aspernatur ipsam consequatur qui illo totam fuga.","brand_kit":"Libero quia quam harum molestiae cupiditate.","has_credentials":true,"id":"Et quisquam dicta.","label":"Aut tempora dolorem neque assumenda sed.","portal_id":"Consequatur sint.","project_id":"Eaque enim est libero enim quo.","sender_email":"Non illum expedita commodi in dolores nemo.","sender_name":"Eaque autem impedit tenetur voluptatibus.","status":"inactive","version":6362542183217834869},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Qui et assumenda quas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium libero."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quisquam animi."},"sender_email":{"type":"string","description":"Default sender address","example":"Delectus blanditiis magnam sed iure amet."},"sender_name":{"type":"string","description":"Default sender name","example":"Repudiandae facilis blanditiis libero nam."}},"example":{"account_id":"Molestiae omnis doloremque.","brand_kit":"Aliquid explicabo eaque ab aut voluptas.","label":"Deserunt et quidem sapiente.","portal_id":"Perspiciatis modi dicta quae sed ut.","sender_email":"Et atque.","sender_name":"Impedit velit omnis incidunt."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Nulla eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Recusandae totam soluta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Odit odio praesentium."},"platforms":{"type":"array","items":{"type":"string","example":"Sint voluptatibus quam dicta voluptate consequuntur."},"description":"Platforms this job will create on","example":["Qui temporibus quis iste eaque.","Debitis nam.","Delectus ex aut quia."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Consequatur dolore dolor corporis consequatur voluptatem voluptates.","platforms":["Repudiandae sit qui aut aut.","Magnam quisquam et consequuntur ut sunt.","Et velit fuga quos est."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Fugiat aut dicta libero."},"job_id":{"type":"string","description":"Job UUID","example":"Officiis beatae sed aut."},"result":{"description":"Per-platform results, written once when the job reaches a terminal state","example":"Est quia qui fugiat est itaque."},"status":{"type":"string","description":"Job status","example":"succeeded","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Beatae harum similique corporis id eum.","job_id":"Culpa est possimus dolores dignissimos.","result":"Laudantium error eum et aut.","status":"partial"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Omnis corrupti facere eum aliquid est repellat."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt mollitia non sed hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ex ipsa nihil esse voluptate in consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Sed voluptatum et impedit quod rem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Est distinctio accusamus a perferendis."},"project_id":{"type":"string","description":"Owning project","example":"Culpa quaerat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6865823349289112261,"format":"int64"}},"example":{"account_id":"Velit quis.","etag":"Vel architecto quae error dolor placeat.","has_credentials":true,"id":"Voluptatem nostrum.","label":"Ut nobis.","org_id":"Minus et.","project_id":"Deleniti voluptas quo nostrum quia.","status":"inactive","version":7197135224651925465},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ex dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Vitae qui explicabo tempora accusantium aut."},"project_id":{"type":"string","description":"Owning project","example":"Aut explicabo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2969272646168040903,"format":"int64"}},"example":{"account_id":"Autem eaque eaque dicta ut magni.","has_credentials":true,"id":"In vel.","label":"Et vel dolorum aut inventore consequatur.","org_id":"Molestiae qui nobis culpa.","project_id":"Nobis qui sunt laboriosam ipsa.","status":"inactive","version":32502071618905206},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolores dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Temporibus dolorem cumque quis accusantium quia enim."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsum et et laudantium."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Sit est atque qui quaerat qui vitae."},"project_id":{"type":"string","description":"Owning project","example":"Asperiores velit aut alias quod minima."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1323696837483058057,"format":"int64"}},"example":{"account_id":"Consequatur aut vero.","has_credentials":true,"id":"Optio non.","label":"Ipsam eligendi est dolore.","org_id":"Est saepe doloribus unde id.","project_id":"Optio in ratione accusamus quasi.","status":"active","version":4544790407326456577},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptas est consequatur rerum neque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Perspiciatis perferendis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Ea nam aut aut dolores."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Optio quia similique vero est impedit quo."},"project_id":{"type":"string","description":"Owning project","example":"Sapiente sit totam ut et ullam."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5284871868291627638,"format":"int64"}},"example":{"account_id":"Eos deserunt quia expedita sed velit distinctio.","has_credentials":false,"id":"Nihil at.","label":"Sit soluta quia qui.","org_id":"Natus veniam amet.","project_id":"Libero officia et quia.","status":"inactive","version":1537409143960626181},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sint est sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Voluptas dolorem necessitatibus illum.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Ducimus distinctio deserunt quia magni."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Nisi est."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quia doloremque commodi rerum."},"app_id":{"type":"string","description":"Meta app ID","example":"Error sit nihil iure officiis nemo."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos non molestias laudantium quia iusto maxime."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Totam hic quibusdam eveniet."},"label":{"type":"string","description":"Optional friendly name","example":"Veniam et ducimus quos amet."},"page_id":{"type":"string","description":"Facebook page ID","example":"Illum accusamus debitis explicabo praesentium sint."},"project_id":{"type":"string","description":"Owning project","example":"Doloribus voluptas mollitia doloremque totam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4075428576386055706,"format":"int64"}},"example":{"account_id":"Corporis dolorem laborum maiores est ea ducimus.","app_id":"Tenetur ut.","etag":"Quo ullam ad iusto quos.","has_credentials":false,"id":"Molestias ducimus id.","label":"Ex et alias ea asperiores quas.","page_id":"Est placeat explicabo aliquid.","project_id":"Eius aut quo et.","status":"inactive","version":7062935514847310019},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Iure aut tenetur ipsum ea ad ducimus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam voluptatem fuga quia qui."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum vel molestiae id quae vero aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et et."},"project_id":{"type":"string","description":"Owning project","example":"Aut provident suscipit incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8554261525276101559,"format":"int64"}},"example":{"account_id":"Necessitatibus non eum ipsum eveniet quam.","app_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Aut temporibus.","label":"Eligendi non.","page_id":"Voluptatum magnam.","project_id":"Laborum ipsum accusantium voluptatem libero.","status":"error","version":8043832967599792035},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Odit illo ut ut."},"app_id":{"type":"string","description":"Meta app ID","example":"Perspiciatis debitis atque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"In iure molestiae quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"page_id":{"type":"string","description":"Facebook page ID","example":"Assumenda alias."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam aperiam et totam in."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8618836083038100083,"format":"int64"}},"example":{"account_id":"Aliquam est autem vel eos minima.","app_id":"Ea voluptatum pariatur non.","has_credentials":true,"id":"Unde facilis.","label":"Voluptatem optio.","page_id":"Maiores consequatur.","project_id":"Ut quas officiis mollitia ducimus sunt repellendus.","status":"inactive","version":2884566362507518761},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam recusandae nesciunt et."},"app_id":{"type":"string","description":"Meta app ID","example":"Perferendis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo ullam."},"label":{"type":"string","description":"Optional friendly name","example":"Facilis dolor consectetur sed."},"page_id":{"type":"string","description":"Facebook page ID","example":"Ut ea sequi quos qui quo et."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati hic ut magnam facilis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8315950268383046552,"format":"int64"}},"example":{"account_id":"Non consequuntur qui qui impedit assumenda voluptas.","app_id":"Et nemo dicta illum omnis.","has_credentials":true,"id":"Beatae facilis dolor quod nihil quia.","label":"Recusandae consequatur nulla.","page_id":"Vel ut.","project_id":"Sed voluptas fuga officia nulla.","status":"error","version":8342264622249142271},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Occaecati id ea sunt dolorem necessitatibus neque."},"label":{"type":"string","description":"Optional friendly name","example":"Consequatur hic voluptatem."},"page_id":{"type":"string","description":"Facebook page ID","example":"Omnis quidem dolor ipsum voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Ab quasi tempora dolor.","label":"Occaecati earum unde ut.","page_id":"Non eum expedita non voluptas sit voluptatem."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"app_secret":{"type":"string","description":"Meta app secret","example":"Et dolorem quod."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Iusto fugit non asperiores quidem natus.","app_secret":"Nostrum atque illum nesciunt adipisci odit corrupti."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sequi non et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus voluptatem vero dolorem qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Aut est voluptatibus placeat.","customer_id":"Deleniti placeat rerum.","etag":"Expedita et velit accusamus.","has_credentials":false,"id":"Vero vel.","label":"Necessitatibus quaerat minima a voluptatem ipsa et.","project_id":"Quibusdam repellendus qui numquam.","status":"inactive","version":7624219269087359761},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","customer_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","customer_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"In autem neque nihil laborum omnis."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."}},"example":{"account_id":"Est porro eos ipsa quia.","customer_id":"Quo repudiandae.","label":"Delectus enim quas id porro."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Doloremque dicta."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ratione impedit recusandae dolor consequatur."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Voluptatem beatae repellat veritatis perferendis veritatis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Vel temporibus sunt nulla esse sed."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Facere sed ea qui pariatur adipisci.","client_secret":"Enim esse dolores.","developer_token":"Est perferendis eos et cumque nulla.","refresh_token":"Iste exercitationem voluptate quia esse nihil sed."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Rerum eveniet nam sunt.","etag":"Voluptatem quia ab recusandae praesentium nisi.","has_credentials":true,"id":"Hic quos inventore.","label":"Ad dolorem et.","project_id":"Id vel iusto optio repellendus.","status":"deleted","version":4971099885577230620},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium eligendi ut et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Est dolor velit et voluptatem mollitia placeat."},"project_id":{"type":"string","description":"Owning project","example":"Nemo cum delectus laudantium."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7301828793581898625,"format":"int64"}},"example":{"account_id":"Necessitatibus quia facere vitae aperiam velit corrupti.","has_credentials":true,"id":"Iste iusto reiciendis ipsa ut saepe beatae.","label":"Voluptas doloremque nobis consectetur voluptas voluptas.","project_id":"Temporibus in qui provident corrupti ut similique.","status":"deleted","version":8091372322961997197},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus dolore expedita commodi sit omnis et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Deserunt minima quis impedit."},"label":{"type":"string","description":"Optional friendly name","example":"Aut et ut dolorem tempore."},"project_id":{"type":"string","description":"Owning project","example":"In voluptate debitis earum voluptates repellat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4154692188906674111,"format":"int64"}},"example":{"account_id":"Pariatur esse.","has_credentials":false,"id":"Quo porro.","label":"Molestias reprehenderit.","project_id":"Accusantium est.","status":"error","version":1321629448594002998},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facere ut voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ab ea pariatur deserunt."},"label":{"type":"string","description":"Optional friendly name","example":"Repellat sequi sed qui dolor."},"project_id":{"type":"string","description":"Owning project","example":"Rem molestiae assumenda ea incidunt."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8862716294143227386,"format":"int64"}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","has_credentials":false,"id":"Rerum maiores in alias est laboriosam saepe.","label":"Eaque magni omnis dolorem.","project_id":"Perferendis placeat earum occaecati et.","status":"inactive","version":7088601354925466349},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Et neque soluta."}},"example":{"account_id":"t2_gv9wtbfa","label":"Voluptas aliquid libero sapiente aspernatur fugit eum."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quo vel iste aut cum voluptatem."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et et aperiam."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas quis nihil tempora rem asperiores."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Vero natus voluptatem.","client_secret":"Et minima.","refresh_token":"Quas qui aut rerum illum vero."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Ut voluptatum consequatur quos atque voluptates.","client_secret":"Sit nostrum dolor.","developer_token":"Ipsa dolorum est aut blanditiis.","refresh_token":"Unde omnis facere quam sed rem quia."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Distinctio aut."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Quis et maxime ipsam voluptatem repudiandae laudantium."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Quo sint dolorum vel.","app_secret":"Consequatur omnis quidem est non tenetur."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Totam rem harum.","client_secret":"Provident quia laboriosam magnam unde.","refresh_token":"Et sed nobis blanditiis."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Aperiam et ipsam vitae.","access_token_secret":"Velit est quis aliquid aliquam.","consumer_key":"Consequatur iste sed illo adipisci sunt.","consumer_secret":"Soluta consectetur porro quo quia incidunt."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dicta qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur voluptate dolorum id ut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Id adipisci."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"project_id":{"type":"string","description":"Owning project","example":"Minima vitae illo cumque optio impedit."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6671950557225375758,"format":"int64"}},"example":{"account_id":"Vitae nemo sint et consequatur vel quisquam.","etag":"Sint possimus.","funding_instrument_id":"Dolorem neque hic voluptatem ad similique sunt.","has_credentials":true,"id":"Aut rerum non assumenda molestiae modi.","label":"Voluptatibus assumenda mollitia molestias eos.","project_id":"Vitae molestiae itaque autem.","status":"error","version":3850958169697422368},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam numquam et natus possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Provident molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Quas quia quam voluptate nam iste.","funding_instrument_id":"Temporibus aut numquam.","has_credentials":true,"id":"Non laudantium quis ab non sunt.","label":"Beatae totam.","project_id":"Quo est.","status":"active","version":1807846651493588341},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed dolorum cupiditate quia qui dicta."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quae totam et voluptates atque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Accusantium ut vitae dolor soluta beatae."},"label":{"type":"string","description":"Optional friendly name","example":"Molestiae veniam exercitationem blanditiis ratione non."},"project_id":{"type":"string","description":"Owning project","example":"Enim velit voluptates officiis tempora possimus rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2489572558350094249,"format":"int64"}},"example":{"account_id":"Adipisci minus et vero.","funding_instrument_id":"Occaecati incidunt deleniti sunt dolorem ea.","has_credentials":false,"id":"Voluptates ab quos provident magni et.","label":"Et culpa culpa veritatis.","project_id":"Reprehenderit officiis modi quae consequatur.","status":"inactive","version":8208341011850859357},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Cumque perspiciatis quam."},"label":{"type":"string","description":"Optional friendly name","example":"Iste numquam optio possimus velit."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Eveniet quia voluptatem impedit cumque doloribus.","label":"Possimus ipsam perspiciatis enim id."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Ullam consequatur ut eveniet tempore est."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Iusto fugiat ad et."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Magni odio aut omnis vel."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Iure ducimus voluptatem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Necessitatibus tempore rem quo.","access_token_secret":"Accusantium voluptas ratione dignissimos esse et labore.","consumer_key":"Magnam cum veritatis mollitia vel velit.","consumer_secret":"Eum perferendis qui qui soluta repudiandae quae."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Reiciendis architecto atque maxime soluta dolorem ducimus.","config":"Error similique.","status":"Maxime fugiat illo."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Et et veritatis voluptas nobis.","brand_kit":"Consequuntur omnis a dignissimos voluptate.","label":"Non sint praesentium quia.","portal_id":"Doloremque architecto ea et.","sender_email":"Asperiores facere et exercitationem soluta possimus.","sender_name":"Aliquid et in."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Tempora error rerum quae nihil.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Vel blanditiis sunt ut facere.","label":"Vero et voluptas accusamus sunt.","page_id":"Rerum cupiditate."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Fugiat maxime labore illo.","customer_id":"Provident quas repudiandae voluptatem vitae iste maxime.","label":"Necessitatibus et autem doloribus."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Provident quia distinctio."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Amet et eaque.","label":"Aut sed quibusdam reiciendis qui vel."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Ut temporibus aliquam animi unde.","event_details":"Et architecto voluptas ratione delectus ut.","event_slug":"Magni autem.","id":"Laboriosam tempore vero voluptatum a quos.","keywords":"Ut est nobis aspernatur.","platforms":["Tempore nihil quos.","Eum dignissimos iure praesentium ea.","Quis quas qui mollitia perferendis eveniet voluptas."],"program_type":"Nemo perspiciatis et qui aliquam doloremque itaque.","project_id":"Sed exercitationem ut totam ut minus.","status":"draft","targeting":"Fugit qui tempora commodi reiciendis sit alias.","url":"Ullam tenetur quia totam magni sunt repellat.","version":958049424855577225}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sit ut repellat voluptas."},"example":"Eligendi consequatur officia labore eos."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Quaerat ea accusantium.","event_details":"Amet iusto provident sequi est.","event_slug":"Ut ea alias.","id":"Explicabo cupiditate rerum.","keywords":"Voluptatem iure vero.","platforms":["Accusantium quis architecto.","Enim magnam eius voluptas voluptatibus deleniti.","Dolorum excepturi quibusdam."],"program_type":"Hic vero et.","project_id":"Incidunt ipsum est perspiciatis soluta voluptas est.","status":"draft","targeting":"Consequatur neque tempore voluptatibus quo quod nesciunt.","url":"Nam aspernatur qui quidem est eligendi.","version":7881322722259816896}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Exercitationem officia corrupti tempora ea."},"example":"Totam unde."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa sint optio nobis quae corporis."},"example":"Voluptas ut nostrum officiis et accusamus provident."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Rerum ut culpa totam sequi sit.","event_details":"Sit et quod porro sed minus.","event_slug":"Et ratione sit.","id":"Et assumenda recusandae.","keywords":"Excepturi dolor labore.","platforms":["Omnis veritatis omnis.","Officia et pariatur molestias autem ratione.","Ut et veniam maiores."],"program_type":"Totam id incidunt.","project_id":"Sint eveniet dicta numquam doloremque ab cumque.","status":"draft","targeting":"Iusto dolores.","url":"Sed ipsum quia.","version":7723389563281978281}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Odio eos earum fuga non est."},"example":"Rerum reiciendis similique."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Sint qui praesentium ea praesentium magni.","event_details":"Consequuntur neque mollitia quia.","event_slug":"Tempora veritatis harum ab nobis fuga atque.","id":"Et tempore.","keywords":"Iure dolore et et aut nam.","platforms":["Blanditiis et qui est dolorem eos.","Dolorem sed atque.","Provident id quia porro rerum.","Quo aliquid nobis."],"program_type":"Ratione incidunt est saepe.","project_id":"Eligendi earum qui est et id laudantium.","status":"archived","targeting":"Voluptates odit consequatur quis.","url":"Fugiat aut laboriosam maxime facere culpa modi.","version":317664992246136086}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Repudiandae odit."},"example":"Cupiditate est illo repellat et cum repellat."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Rerum sint optio.","platforms":["Quos tempora dolorem dolor fugiat quia.","Exercitationem rerum iste ducimus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Temporibus ipsum necessitatibus ratione possimus."},"example":"Facilis repellat eveniet reiciendis."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur sint et vel molestiae."},"example":"Non placeat."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Est qui molestiae rerum adipisci minima quibusdam.","campaign_name":"Harum distinctio reiciendis architecto atque maxime soluta.","id":"Commodi quam voluptates.","platform":"Accusantium sunt culpa libero quisquam.","platform_campaign_id":"Rerum amet aut tempora recusandae aspernatur.","project_id":"Optio dolorem omnis.","status":"Ducimus porro maxime.","version":5829797402937558935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Minima adipisci aut quia quisquam."},"example":"Quia facilis sit."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Magnam nihil qui doloremque nam magnam aliquid."},"example":"Possimus accusantium expedita alias."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Exercitationem consectetur.","campaign_name":"Modi asperiores ut libero vel.","id":"Laboriosam quis facere.","platform":"Nesciunt necessitatibus ex ea ullam corrupti sunt.","platform_campaign_id":"Omnis accusantium ad.","project_id":"Totam sapiente vitae numquam ut nesciunt voluptas.","status":"Voluptates iste autem veniam et enim unde.","version":1765361339666375563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis sapiente ut sit quod.","has_credentials":true,"id":"Ea minus enim ut.","label":"Magnam ut et ab.","login_customer_id":"Quae nihil magni.","project_id":"Nostrum veniam qui rerum ipsum eum fugit.","status":"error","version":7243034772713915274}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Magni et rerum sed voluptatum.","has_credentials":false,"id":"Veniam velit sequi sit impedit dolorum voluptas.","label":"Enim est occaecati sed non dolorem distinctio.","login_customer_id":"Nostrum tenetur repellendus.","project_id":"Ipsum quaerat delectus cupiditate sit et.","status":"deleted","version":5181448788196437025}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut sunt ex et autem delectus."},"example":"Occaecati placeat et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Laudantium expedita ut ipsum id commodi nobis.","label":"Velit sapiente qui iusto quis magni et.","login_customer_id":"Officiis deleniti ipsam nam.","project_id":"Vitae aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aut id molestiae sit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem quia."},"example":"Adipisci consectetur ut modi quo et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non ut voluptas et accusamus natus id.","brand_kit":"Eos voluptatibus.","has_credentials":true,"id":"Sit similique ut minima ut.","label":"Quia enim illo et eligendi.","portal_id":"Et quam architecto vero.","project_id":"Voluptatum officia quod error amet quia inventore.","sender_email":"Vero labore laudantium maiores.","sender_name":"Reiciendis dignissimos consequatur iste qui minima.","status":"deleted","version":4350724330275405551}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure ut."},"example":"Minus id deleniti."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Debitis soluta sed quod dicta aperiam eveniet.","brand_kit":"Voluptas expedita omnis ex.","has_credentials":true,"id":"Deleniti itaque voluptas magnam.","label":"Consequuntur sit libero autem ut.","portal_id":"Accusantium sequi modi corrupti esse mollitia.","project_id":"Voluptatem modi velit vitae optio ut.","sender_email":"Saepe rerum sunt eum et qui aut.","sender_name":"Ut quia harum.","status":"error","version":6360555217771164808}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum autem quia quis soluta nostrum cumque."},"example":"Quia velit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Autem recusandae totam.","brand_kit":"Similique deserunt iusto.","has_credentials":true,"id":"Ex delectus.","label":"Officia quidem non qui voluptates natus cum.","portal_id":"Odit necessitatibus veritatis amet ut rerum quidem.","project_id":"Voluptas ullam dolores rem.","sender_email":"Iusto velit quo voluptatibus modi reiciendis aliquam.","sender_name":"Quidem explicabo expedita sunt.","status":"active","version":3951189417473657674}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aspernatur possimus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore qui est."},"example":"Provident saepe aliquam architecto non vero."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Accusamus vero et voluptas accusamus sunt.","has_credentials":true,"id":"Minus voluptas asperiores debitis labore aut.","label":"Distinctio ipsa nihil ad hic repellendus nobis.","org_id":"Vel blanditiis sunt ut facere.","project_id":"Porro ab id necessitatibus consequatur natus tempora.","status":"error","version":4876542408988375571}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus aliquam aut quas aliquid."},"example":"Praesentium beatae quis ut eius."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Facere harum enim consequatur id voluptatem.","has_credentials":true,"id":"Ducimus sequi.","label":"Quia tenetur ducimus.","org_id":"Consequatur dolorum sint voluptatem voluptas omnis est.","project_id":"Autem ab voluptas culpa.","status":"active","version":4064850428710517856}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas consequatur iusto nostrum pariatur."},"example":"Quidem minus pariatur praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Et corporis officia sint.","has_credentials":false,"id":"Consequatur omnis quidem est non tenetur.","label":"Voluptatibus qui cupiditate voluptatem.","org_id":"Quia nulla autem ratione.","project_id":"Deleniti dolores commodi.","status":"error","version":874315130556833044}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Qui esse."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Mollitia a magni vel consequatur ea deserunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Deserunt reiciendis dolorem totam voluptatem."},"example":"Repudiandae molestias est consectetur porro quo pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Aut et.","app_id":"Quia laboriosam magnam unde hic.","has_credentials":false,"id":"Facilis facilis aut suscipit aut odio iste.","label":"Tenetur velit quaerat aut.","page_id":"Distinctio ea totam rem harum provident.","project_id":"Deleniti earum magni quibusdam.","status":"deleted","version":5896744453366252956}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas libero pariatur ut qui sint."},"example":"Quasi esse corporis molestiae excepturi suscipit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quibusdam vel autem modi id facere.","app_id":"Possimus expedita qui.","has_credentials":true,"id":"Eius voluptatem molestiae qui suscipit rerum.","label":"Rem architecto.","page_id":"Et maxime.","project_id":"Eligendi tempora quos.","status":"deleted","version":8688592599556109682}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut ea."},"example":"Aliquam eum molestiae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Vero commodi est qui asperiores velit enim.","app_id":"Architecto dicta.","has_credentials":true,"id":"Atque rerum et officiis sapiente et et.","label":"Eligendi ea vel consequatur nihil.","page_id":"Ut est recusandae aspernatur eum fugit voluptas.","project_id":"Dolores in hic rem.","status":"deleted","version":2446786767075191046}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Numquam doloremque et qui perferendis ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis iusto molestias itaque."},"example":"Fugit et soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Doloremque architecto ea et.","customer_id":"Exercitationem soluta possimus a.","has_credentials":false,"id":"Sed maiores qui sed exercitationem quam.","label":"Et et veritatis voluptas nobis.","project_id":"Non sint praesentium quia.","status":"active","version":2312965176389631300}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem labore laboriosam repellat harum."},"example":"Aut eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Quia sed omnis quaerat aut.","customer_id":"Magnam cumque quasi magni ducimus.","has_credentials":true,"id":"Ducimus debitis nesciunt quas quibusdam occaecati cum.","label":"Nostrum laborum minima.","project_id":"Iste voluptatem et voluptatem ut ut.","status":"error","version":3654633208585641813}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et qui officiis repudiandae qui iste accusantium."},"example":"Consequatur provident ea sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Quis possimus placeat.","customer_id":"Et qui et.","has_credentials":true,"id":"Dignissimos voluptate iste.","label":"Ad esse neque earum modi.","project_id":"Aut qui est iste.","status":"active","version":280885210133145304}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quo quae aut culpa.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Corrupti aut earum rerum ducimus dicta."},"example":"Perspiciatis a aut quas delectus a."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Incidunt aut aperiam et ipsam.","has_credentials":true,"id":"Pariatur consequatur iste sed illo.","label":"Consectetur porro quo.","project_id":"Sunt ipsa.","status":"error","version":6549464945762782488}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur delectus libero id."},"example":"Aut sit iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Neque ipsum nihil cumque repellendus.","has_credentials":true,"id":"Sit iusto.","label":"Architecto unde rerum quisquam ut.","project_id":"Voluptates neque expedita.","status":"inactive","version":3464454785938965677}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur iste eum amet vel impedit et."},"example":"Adipisci et laboriosam veritatis saepe numquam rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","has_credentials":false,"id":"Recusandae beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ratione consequuntur aut et corrupti.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam sunt rem non doloribus."},"example":"Corrupti ipsum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Dignissimos necessitatibus consequuntur.","funding_instrument_id":"Ipsum voluptatem et quam beatae laborum omnis.","has_credentials":true,"id":"Error necessitatibus et autem doloribus est.","label":"Repudiandae voluptatem vitae iste maxime modi laborum.","project_id":"Maxime labore illo maxime provident.","status":"error","version":1380295609570133746}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas esse qui quisquam quae est magni."},"example":"Quibusdam accusamus possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequuntur quia et saepe aperiam."},"example":"Accusamus ipsa qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Nobis nam.","funding_instrument_id":"Reiciendis pariatur quisquam.","has_credentials":true,"id":"Aut quis qui laudantium dolore.","label":"Non quidem doloribus debitis itaque itaque dolores.","project_id":"Possimus nihil qui enim ratione voluptatem eos.","status":"error","version":7616558197057713508}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ea voluptatem eum voluptas eveniet.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Sit harum ipsa et."},"example":"Dignissimos fugiat voluptatibus natus."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Reiciendis et perspiciatis saepe consequatur doloribus.","job_id":"Velit minus.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Odit odio praesentium."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eaque ratione debitis nam blanditiis."},"event_details":{"description":"Extracted event/course details","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil sunt doloremque."},"id":{"type":"string","description":"Brief UUID","example":"Vero at ut quis."},"keywords":{"description":"Keyword list","example":"Eveniet sint voluptatibus quam dicta."},"platforms":{"type":"array","items":{"type":"string","example":"Ea architecto autem iste."},"description":"Suggested default platforms","example":["Ipsa tempore incidunt velit provident.","Magni tempore sunt itaque omnis.","Ex sunt sit beatae.","Modi voluptatum veniam molestiae quibusdam."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui maiores quia non unde deserunt."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae aut fugit alias."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Consequuntur voluptatem est qui."},"url":{"type":"string","description":"Event/course page URL","example":"Ut ut odio odio sed minus quia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6644792324746576285,"format":"int64"}},"example":{"copy":"Iure culpa est possimus dolores dignissimos.","etag":"Id eum aut et itaque.","event_details":"Itaque est fugiat aut dicta.","event_slug":"Magnam quisquam et consequuntur ut sunt.","id":"Ex aut quia distinctio consequatur.","keywords":"Velit laudantium error.","platforms":["Beatae sed aut quia nihil est.","Qui fugiat."],"program_type":"Provident repudiandae sit qui aut aut.","project_id":"Dolor corporis consequatur voluptatem voluptates sed.","status":"draft","targeting":"Et aut quia beatae.","url":"Et velit fuga quos est.","version":9139670973455309725},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut aperiam voluptate voluptates."},"event_details":{"description":"Extracted event/course details","example":"Eum necessitatibus alias."},"event_slug":{"type":"string","description":"Event/course slug","example":"Provident dicta tenetur voluptatem voluptate dolor."},"id":{"type":"string","description":"Brief UUID","example":"Ad quis aperiam deserunt nostrum."},"keywords":{"description":"Keyword list","example":"Sapiente molestiae dolorum repellat expedita ut."},"platforms":{"type":"array","items":{"type":"string","example":"Odio sunt esse mollitia incidunt."},"description":"Suggested default platforms","example":["Laborum sed molestias veritatis itaque.","Est quis impedit.","Illo harum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui minima in nulla sunt autem eos."},"project_id":{"type":"string","description":"Owning project","example":"Et sed praesentium libero."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Dolor quam dolor consectetur eos iste."},"url":{"type":"string","description":"Event/course page URL","example":"Provident porro."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":709937816203366628,"format":"int64"}},"example":{"copy":"Animi sit esse ratione aliquid.","event_details":"Repudiandae tenetur aperiam saepe vel.","event_slug":"Alias minus reprehenderit dignissimos aut velit.","id":"Quis veniam iusto consequatur quia.","keywords":"Laborum est quasi dignissimos.","platforms":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."],"program_type":"Impedit dolores.","project_id":"Officia eligendi alias.","status":"draft","targeting":"Velit quis harum recusandae est ipsum.","url":"At sint laborum veniam.","version":285293330655778463},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Reiciendis sit minima."},"event_details":{"description":"Extracted event/course details","example":"Eligendi ipsam aut vel atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Perspiciatis alias et amet ex molestiae."},"id":{"type":"string","description":"Brief UUID","example":"Modi repellat eum."},"keywords":{"description":"Keyword list","example":"Unde et."},"platforms":{"type":"array","items":{"type":"string","example":"Pariatur mollitia incidunt autem."},"description":"Suggested default platforms","example":["Voluptate fuga ea distinctio maiores mollitia aut.","Rerum cum eaque nesciunt est totam inventore."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi magni quidem sit in quia."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem eos doloribus sint."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut dolores in voluptas."},"url":{"type":"string","description":"Event/course page URL","example":"Minus libero et consequuntur suscipit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"copy":"Sapiente harum aliquam sunt eum rerum eaque.","event_details":"Voluptatem sint hic.","event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","keywords":"Facere voluptatibus.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","targeting":"Nisi repudiandae.","url":"Nostrum similique omnis iste.","version":7605661861379582739},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Delectus veniam vel est et magni."},"event_details":{"description":"Extracted event/course details","example":"Vero consequatur possimus aut assumenda."},"event_slug":{"type":"string","description":"Event/course slug","example":"Recusandae ut ullam aliquam dolore iure."},"id":{"type":"string","description":"Brief UUID","example":"Velit omnis dolorem est aut."},"keywords":{"description":"Keyword list","example":"Et provident illo non quisquam iure doloremque."},"platforms":{"type":"array","items":{"type":"string","example":"Officia natus quia labore."},"description":"Suggested default platforms","example":["Dolores et incidunt voluptatem ipsa.","Assumenda excepturi.","Tempora est eveniet sequi ea."]},"program_type":{"type":"string","description":"Funnel context","example":"Consequuntur esse culpa."},"project_id":{"type":"string","description":"Owning project","example":"Recusandae dignissimos dolore harum totam tempora vitae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut aliquid."},"url":{"type":"string","description":"Event/course page URL","example":"Minus nostrum iste nemo fugiat sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1796419171074064120,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Ab laboriosam sunt quis omnis.","id":"Veritatis impedit aut.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Alias temporibus illum impedit ullam.","Suscipit harum.","Neque quia.","Et veniam itaque optio consequatur nulla sint."],"program_type":"Exercitationem accusamus pariatur saepe ab qui.","project_id":"Earum doloribus.","status":"approved","targeting":"Cupiditate aut.","url":"Sunt quis odio enim nam id voluptatem.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui rerum numquam quo omnis a quia."},"event_details":{"description":"Extracted event/course details","example":"Itaque qui repudiandae magnam atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Soluta dolore vitae."},"id":{"type":"string","description":"Brief UUID","example":"Minima iure quos enim occaecati beatae."},"keywords":{"description":"Keyword list","example":"Culpa ipsam totam nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"description":"Suggested default platforms","example":["Voluptatem aut debitis vitae unde velit eos.","Accusantium odit rerum commodi ea.","Consequatur et."]},"program_type":{"type":"string","description":"Funnel context","example":"Quaerat et eius culpa magni illum consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestias sint sequi."},"url":{"type":"string","description":"Event/course page URL","example":"In commodi et asperiores et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":122602759626083426,"format":"int64"}},"example":{"copy":"Fuga atque.","event_details":"Qui omnis nesciunt qui consequuntur.","event_slug":"Minima dolorem sit est tempora qui.","id":"Placeat perferendis omnis ad voluptas.","keywords":"Sequi culpa.","platforms":["Praesentium cumque illum pariatur odio molestias voluptatum.","Nulla perferendis possimus deserunt iure et.","Ea quidem ducimus tempora ea molestias."],"program_type":"Enim totam.","project_id":"Voluptates laboriosam cumque mollitia quidem quo.","status":"draft","targeting":"Odit provident sed quo aperiam.","url":"Voluptas necessitatibus cumque non porro qui molestias.","version":4353559979947303924},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Voluptas aperiam."},"event_details":{"description":"Extracted event/course details","example":"Dolores enim."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Rerum numquam amet deserunt rem quia."},"keywords":{"description":"Keyword list","example":"Assumenda harum eos eveniet ut et laboriosam."},"platforms":{"type":"array","items":{"type":"string","example":"Numquam omnis ullam facilis ab sapiente."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Esse voluptate eum laboriosam distinctio non.","Deserunt labore et id aut et adipisci.","Ut molestiae.","Voluptates ut culpa saepe necessitatibus."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Quos expedita voluptas qui eaque."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsam dolores et et qui ut."}},"example":{"copy":"Porro ut et cupiditate.","event_details":"Non assumenda perspiciatis.","event_slug":"Nostrum ratione id.","keywords":"Ea ullam minima voluptatem vel deleniti.","platforms":["Quae molestiae suscipit non iusto.","Consequatur in vero soluta.","Eius dicta.","Ullam distinctio dolore velit."],"program_type":"education","targeting":"Repudiandae necessitatibus dolorem enim beatae quia.","url":"Laborum aspernatur voluptate itaque fugit."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Aut ut."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut ut sit nisi architecto."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptate enim qui impedit temporibus."},"id":{"type":"string","description":"Campaign UUID","example":"Et vel beatae molestiae fuga."},"platform":{"type":"string","description":"Channel","example":"Sed corrupti sit."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Labore quia esse consectetur tenetur eum."},"project_id":{"type":"string","description":"Owning project","example":"Vitae consequatur eos."},"status":{"type":"string","description":"Campaign status","example":"Rerum et recusandae possimus quis."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9161333083936888105,"format":"int64"}},"example":{"brief_id":"Explicabo repudiandae aut reiciendis recusandae molestias.","campaign_name":"Hic est quia pariatur odit ullam.","etag":"Quisquam nisi repellendus quos magnam aut.","id":"Eos omnis cumque nemo ipsam ut.","platform":"Vel inventore aliquid aut non eligendi accusamus.","platform_campaign_id":"Quod impedit accusamus incidunt minus veritatis enim.","project_id":"Natus et unde.","status":"Ex id corrupti sed quo perferendis.","version":7863921121752869750},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptates sit est corporis molestiae voluptatem."},"campaign_name":{"type":"string","description":"Campaign name","example":"Ratione ipsum."},"id":{"type":"string","description":"Campaign UUID","example":"Et incidunt."},"platform":{"type":"string","description":"Channel","example":"Expedita inventore qui necessitatibus ut necessitatibus in."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Autem maxime hic."},"project_id":{"type":"string","description":"Owning project","example":"Dolor sed excepturi delectus."},"status":{"type":"string","description":"Campaign status","example":"Amet hic est."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":906675377577277444,"format":"int64"}},"example":{"brief_id":"Magnam voluptates molestiae libero autem quod.","campaign_name":"Sunt accusantium totam quia.","id":"Occaecati rerum reiciendis.","platform":"Ullam ipsum.","platform_campaign_id":"Dolores dolore id dolore sed.","project_id":"Esse mollitia et dolorum accusantium aspernatur quos.","status":"Accusantium debitis adipisci qui iste explicabo.","version":9006499932988805057},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Dolor quia consectetur non nulla dolore."},"campaign_name":{"type":"string","description":"Campaign name","example":"Quos omnis."},"id":{"type":"string","description":"Campaign UUID","example":"Qui quia."},"platform":{"type":"string","description":"Channel","example":"Ducimus voluptas soluta quod qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Fugiat est omnis inventore voluptatum ab totam."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam sint autem repudiandae asperiores."},"status":{"type":"string","description":"Campaign status","example":"Libero consequatur."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3986034538934721868,"format":"int64"}},"example":{"brief_id":"Reiciendis odit eos et quidem.","campaign_name":"Quae voluptatem velit mollitia dolorem ea.","id":"Sapiente ex est modi cupiditate possimus ducimus.","platform":"Atque hic quam impedit placeat.","platform_campaign_id":"Voluptatibus aliquam et.","project_id":"Modi consequatur molestias et et deleniti.","status":"Enim voluptas numquam.","version":616047483519279742},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Qui libero natus."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["microsoft-ads","meta-ads","twitter-ads","hubspot"]}},"example":{"config":"Vitae officia dolorem.","platforms":["meta-ads","twitter-ads","hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Id voluptatem nihil quaerat asperiores."},"config":{"description":"Campaign configuration snapshot","example":"Error perferendis quae qui inventore dolorem."},"status":{"type":"string","description":"Campaign status","example":"Repellat vel veritatis hic rerum accusamus."}},"example":{"campaign_name":"Quasi in aut nam rerum.","config":"Architecto deserunt vero ducimus distinctio.","status":"Distinctio magnam."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Magni aut nisi est sit sint."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Et voluptas dolorem necessitatibus illum quisquam.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit quis."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel architecto quae error dolor placeat."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem nostrum."},"label":{"type":"string","description":"Optional friendly name","example":"Ut nobis."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Minus et."},"project_id":{"type":"string","description":"Owning project","example":"Deleniti voluptas quo nostrum quia."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7197135224651925465,"format":"int64"}},"example":{"account_id":"Nostrum atque illum nesciunt adipisci odit corrupti.","etag":"Voluptas omnis quidem dolor ipsum voluptas sed.","has_credentials":true,"id":"Fugiat aliquid aspernatur voluptatem in cupiditate.","label":"Iusto fugit non asperiores quidem natus.","login_customer_id":"Id ea.","project_id":"Et dolorem quod.","status":"deleted","version":8604742619872904748},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rem fugit accusantium est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto eius dolor magnam necessitatibus amet."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum tempore tempora."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dolorem asperiores autem aut aut soluta."},"project_id":{"type":"string","description":"Owning project","example":"Earum aut qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6983147448769937945,"format":"int64"}},"example":{"account_id":"Officia dolores et reprehenderit.","has_credentials":false,"id":"Et est et corporis.","label":"Aut explicabo.","login_customer_id":"Rerum rem.","project_id":"Voluptate est reprehenderit consectetur accusamus eaque inventore.","status":"deleted","version":8504196254053832609},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et vel dolorum aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vitae qui explicabo tempora accusantium aut."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis qui sunt laboriosam ipsa."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dicta ut."},"project_id":{"type":"string","description":"Owning project","example":"In vel."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5579476471615779331,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","has_credentials":true,"id":"Beatae error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","login_customer_id":"Iure dolores dolores dolorem sit nihil.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsam eligendi est dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sit est atque qui quaerat qui vitae."},"label":{"type":"string","description":"Optional friendly name","example":"Optio in ratione accusamus quasi."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quos excepturi natus est est."},"project_id":{"type":"string","description":"Owning project","example":"Optio non."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6617602369183761406,"format":"int64"}},"example":{"account_id":"Quibusdam ea nam aut.","has_credentials":false,"id":"Doloribus unde id aut perspiciatis.","label":"Sit totam ut et.","login_customer_id":"Est consequatur rerum neque velit nulla modi.","project_id":"Adipisci ut.","status":"active","version":926393304108038988},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"In consectetur et culpa quaerat vel sed."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et impedit quod."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Magni omnis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Ipsa nihil esse."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit id incidunt.","client_secret":"Non sed hic minima est distinctio.","developer_token":"A perferendis.","refresh_token":"Facere eum aliquid est repellat assumenda."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Error eligendi incidunt accusamus excepturi inventore."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut architecto aliquam mollitia labore sapiente."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quod minima dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nihil facilis sunt."},"label":{"type":"string","description":"Optional friendly name","example":"Ut beatae eaque quo atque."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Molestiae id aut debitis iure."},"project_id":{"type":"string","description":"Owning project","example":"Vero ad ex consequatur dolore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolore est dolorem quod enim pariatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Occaecati veritatis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7262698057225531796,"format":"int64"}},"example":{"account_id":"Ad quae nisi.","brand_kit":"Incidunt voluptas non necessitatibus.","etag":"Cum et ab ipsum.","has_credentials":true,"id":"Tenetur non accusamus qui ex.","label":"Ex et amet sunt.","portal_id":"Qui nemo nihil dolorum consequatur.","project_id":"Quia mollitia.","sender_email":"Tempora qui eum hic vel aspernatur at.","sender_name":"Est ea sed sit.","status":"deleted","version":7589133128297342291},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non in iure dolores et quis id."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Accusamus corrupti sint molestiae occaecati est quos."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sint consequuntur omnis distinctio possimus non aliquid."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi est et est totam."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quia sed nesciunt minus."},"project_id":{"type":"string","description":"Owning project","example":"Facilis neque sed alias dolore id."},"sender_email":{"type":"string","description":"Default sender address","example":"Non doloribus nam."},"sender_name":{"type":"string","description":"Default sender name","example":"Nulla suscipit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1661229305097180791,"format":"int64"}},"example":{"account_id":"Totam non qui.","brand_kit":"Sunt labore voluptate.","has_credentials":true,"id":"Est ut ratione nobis.","label":"Qui ut ut qui sed explicabo.","portal_id":"Vero nulla laboriosam vel et et iure.","project_id":"Occaecati tenetur minima veritatis sed impedit laborum.","sender_email":"Exercitationem voluptatum perspiciatis autem.","sender_name":"Eum ut.","status":"active","version":5481070480011205228},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur laborum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut tempora dolorem neque assumenda sed."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Cum ipsum quo possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Excepturi sit minus."},"project_id":{"type":"string","description":"Owning project","example":"Quam culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Et quisquam dicta."},"sender_name":{"type":"string","description":"Default sender name","example":"Eaque enim est libero enim quo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2473646846997850541,"format":"int64"}},"example":{"account_id":"Similique eaque autem impedit tenetur voluptatibus.","brand_kit":"Et fuga veniam.","has_credentials":true,"id":"Aspernatur ipsam consequatur qui illo totam fuga.","label":"Qui non illum expedita commodi in dolores.","portal_id":"Harum molestiae cupiditate ab et eum ex.","project_id":"In tempore quo consequatur.","sender_email":"Quia velit adipisci.","sender_name":"Aliquid eum itaque qui recusandae recusandae.","status":"deleted","version":5418486313404831501},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Praesentium eos aspernatur voluptatum facilis laboriosam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ab earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ea et iusto doloremque odio pariatur."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aliquid ratione est omnis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Alias et error nobis minima fuga reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Expedita animi ut velit at."},"sender_email":{"type":"string","description":"Default sender address","example":"Impedit qui suscipit ipsa."},"sender_name":{"type":"string","description":"Default sender name","example":"Animi fuga maxime tempora."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2736756583759126082,"format":"int64"}},"example":{"account_id":"Ab itaque tempore vel quia cum quas.","brand_kit":"Sed commodi voluptatibus.","has_credentials":true,"id":"Rerum perspiciatis dolor pariatur.","label":"Quo soluta maxime temporibus earum et aperiam.","portal_id":"Ipsa aut est et est debitis ea.","project_id":"Amet officia occaecati quam nostrum quis voluptas.","sender_email":"Eum voluptatum accusamus illo eveniet eum.","sender_name":"Nemo molestiae modi ut non atque.","status":"deleted","version":5960975059584485019},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Minus voluptatem ab delectus porro."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi esse voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Mollitia nulla."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Veniam molestias."},"sender_email":{"type":"string","description":"Default sender address","example":"Accusamus quia velit commodi."},"sender_name":{"type":"string","description":"Default sender name","example":"Tenetur cumque rerum."}},"example":{"account_id":"Hic magni.","brand_kit":"Nihil atque.","label":"Fugit dolorum nulla quo veritatis id.","portal_id":"Et optio sed omnis aut voluptatem voluptas.","sender_email":"Eum omnis est blanditiis maxime et.","sender_name":"Et eum inventore quisquam."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Quia omnis in qui."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Nihil ut."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Ut beatae quia."},"platforms":{"type":"array","items":{"type":"string","example":"Minima illo dolores natus a sint."},"description":"Platforms this job will create on","example":["Quae et nesciunt iure quis in.","Mollitia nihil ducimus."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Non quo necessitatibus.","platforms":["Accusantium laudantium nostrum earum dolores.","Eos exercitationem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Hic vel ut."},"job_id":{"type":"string","description":"Job UUID","example":"Illo accusamus."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dolores quidem necessitatibus voluptatem consequatur sit.","job_id":"Earum minus autem omnis qui debitis eum.","result":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}],"status":"running"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae illum accusamus debitis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Doloribus voluptas mollitia doloremque totam."},"label":{"type":"string","description":"Optional friendly name","example":"Quia doloremque commodi rerum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Praesentium sint laudantium error."},"project_id":{"type":"string","description":"Owning project","example":"Veniam et ducimus quos amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6150421422111226538,"format":"int64"}},"example":{"account_id":"Quas quis corporis.","etag":"Ea ducimus ipsum dolorem dignissimos.","has_credentials":true,"id":"Nihil iure officiis nemo quia.","label":"Et quia ex et alias ea.","org_id":"Quo ullam ad iusto quos.","project_id":"Ducimus id sint eius aut.","status":"inactive","version":2540282771582052941},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit soluta quia qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio quia similique vero est impedit quo."},"label":{"type":"string","description":"Optional friendly name","example":"Libero officia et quia."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil at."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1438953144952054594,"format":"int64"}},"example":{"account_id":"Optio rerum vel molestiae id.","has_credentials":false,"id":"Necessitatibus eos rerum.","label":"Qui quas aut provident suscipit.","org_id":"Reiciendis excepturi.","project_id":"Veniam amet et quisquam voluptatem fuga.","status":"active","version":8349066598252210000},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut temporibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut tenetur."},"label":{"type":"string","description":"Optional friendly name","example":"Iure aut tenetur ipsum ea ad ducimus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Voluptatem libero."},"project_id":{"type":"string","description":"Owning project","example":"Et et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8572511867951081487,"format":"int64"}},"example":{"account_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Eligendi non.","label":"Aut amet aut voluptatum magnam.","org_id":"Quisquam perspiciatis ipsam aperiam et totam in.","project_id":"Necessitatibus non eum ipsum eveniet quam.","status":"error","version":786757177338717877},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Debitis atque laboriosam unde facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"label":{"type":"string","description":"Optional friendly name","example":"Nam modi nostrum assumenda alias sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Mollitia ducimus sunt."},"project_id":{"type":"string","description":"Owning project","example":"Odit illo ut ut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4721820161303114412,"format":"int64"}},"example":{"account_id":"Est deserunt maiores consequatur.","has_credentials":true,"id":"Aliquam voluptatem.","label":"Eos minima sunt.","org_id":"Non ratione quo ullam dolores occaecati.","project_id":"Dolore aliquam est autem.","status":"deleted","version":2899021755311679849},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sit voluptatem ad ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Tempora dolor quis totam hic quibusdam eveniet.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Dolorem necessitatibus neque consectetur occaecati earum."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut sint non eum expedita non."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Id vel iusto optio repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"page_id":{"type":"string","description":"Facebook page ID","example":"Hic quos inventore."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Nisi est magni odio aut.","app_id":"Et ipsa magnam cum.","etag":"Ducimus voluptatem doloremque ullam consequatur.","has_credentials":false,"id":"Ad dolorem et.","label":"Inventore impedit unde voluptatem quia ab recusandae.","page_id":"Eveniet tempore est omnis iusto fugiat.","project_id":"Rerum eveniet nam sunt.","status":"inactive","version":8514774147978099222},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos qui quo et."},"app_id":{"type":"string","description":"Meta app ID","example":"Sed voluptas fuga officia nulla."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut magnam facilis non facilis dolor consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"A debitis ut ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Beatae facilis dolor quod nihil quia."},"project_id":{"type":"string","description":"Owning project","example":"Error quisquam recusandae nesciunt et itaque."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2532070289670969642,"format":"int64"}},"example":{"account_id":"Et nemo dicta illum omnis.","app_id":"Minus est dolor.","has_credentials":false,"id":"Recusandae consequatur nulla.","label":"Consequuntur provident nostrum vel ut.","page_id":"Deleniti magnam nemo cum delectus.","project_id":"Non consequuntur qui qui impedit assumenda voluptas.","status":"error","version":1382848930967937507},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsa ut saepe beatae quasi."},"app_id":{"type":"string","description":"Meta app ID","example":"Neque voluptas doloremque nobis consectetur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et voluptatem mollitia placeat aut laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Nam sequi iste iusto."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corrupti ut."},"project_id":{"type":"string","description":"Owning project","example":"Ut et laborum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2992056059874429339,"format":"int64"}},"example":{"account_id":"Quis impedit.","app_id":"Tempore qui repellendus.","has_credentials":false,"id":"Voluptas voluptatem.","label":"Corrupti dicta pariatur totam quas deserunt.","page_id":"Earum voluptates repellat ipsam aut et ut.","project_id":"Quia facere vitae aperiam.","status":"active","version":5857417550509828993},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Accusantium est."},"app_id":{"type":"string","description":"Meta app ID","example":"Dolorem similique sapiente."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Expedita commodi sit."},"label":{"type":"string","description":"Optional friendly name","example":"Quo porro."},"page_id":{"type":"string","description":"Facebook page ID","example":"Pariatur esse."},"project_id":{"type":"string","description":"Owning project","example":"Et porro saepe eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8954046891574288398,"format":"int64"}},"example":{"account_id":"Sed qui dolor illo facere ut voluptatem.","app_id":"Perferendis placeat earum occaecati et.","has_credentials":false,"id":"Ea pariatur.","label":"Nam repellat.","page_id":"Rerum maiores in alias est laboriosam saepe.","project_id":"Aut rem molestiae assumenda ea.","status":"deleted","version":8862716294143227386},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Et minima."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas quis nihil tempora rem asperiores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vero natus voluptatem."}},"example":{"account_id":"act_193556282970417","app_id":"Voluptas aliquid libero sapiente aspernatur fugit eum.","label":"Quas qui aut rerum illum vero.","page_id":"Et neque soluta."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Est placeat explicabo aliquid."},"app_secret":{"type":"string","description":"Meta app secret","example":"Tenetur ut."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Quo vel iste aut cum voluptatem.","app_secret":"Et et aperiam."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor ea iusto eveniet velit sint odit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quam enim odio quia."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate et esse voluptate optio quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et atque."},"label":{"type":"string","description":"Optional friendly name","example":"Aliquid explicabo eaque ab aut voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Impedit velit omnis incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8220727981299951228,"format":"int64"}},"example":{"account_id":"Unde fuga voluptas ut vero.","customer_id":"Velit dolorem.","etag":"A pariatur omnis.","has_credentials":true,"id":"Commodi aspernatur.","label":"Velit perferendis est ipsum aut voluptas.","project_id":"Nostrum numquam illo.","status":"active","version":5290138330966618163},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Odit numquam quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Ut unde dolore id.","customer_id":"Dolorem ut aspernatur et ad.","has_credentials":false,"id":"Aut dolores.","label":"Atque qui dignissimos aut eaque eveniet.","project_id":"Voluptatem beatae quis dignissimos voluptatem et labore.","status":"active","version":412346224570068154},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut dolorem ea veniam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ullam dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Magnam sequi esse at."},"label":{"type":"string","description":"Optional friendly name","example":"Assumenda cum nemo esse nobis."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut rerum voluptatem ad minus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6107904235260429813,"format":"int64"}},"example":{"account_id":"Nihil deleniti dolores dignissimos perferendis tempore eum.","customer_id":"Magnam saepe incidunt nisi.","has_credentials":true,"id":"Eum et consequatur quis.","label":"Consequatur dolor quia amet vero dolorum incidunt.","project_id":"Enim nisi doloremque rerum.","status":"deleted","version":9143198940358453773},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Repudiandae facilis blanditiis libero nam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus blanditiis magnam sed iure amet."}},"example":{"account_id":"Molestiae omnis doloremque.","customer_id":"Perspiciatis modi dicta quae sed ut.","label":"Deserunt et quidem sapiente."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Aut est voluptatibus placeat."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Pariatur perferendis explicabo expedita et velit accusamus."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Nulla eos."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Deleniti placeat rerum."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","developer_token":"Quisquam animi.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Magni atque amet omnis doloremque at."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolor et natus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Nihil neque quod alias ipsum."}},"example":{"campaign_id":"Consequatur non eveniet esse officia explicabo dolor.","error":"Aspernatur voluptatibus.","ok":true,"platform":"Cupiditate non exercitationem."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Rerum non assumenda molestiae modi impedit.","etag":"Aliquam voluptatibus assumenda mollitia molestias eos nobis.","has_credentials":false,"id":"Earum id consequatur.","label":"Adipisci ipsa.","project_id":"Dolorum id ut molestias.","status":"deleted","version":948876280422508983},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et natus possimus cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque magni omnis dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Quae et perspiciatis numquam."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda quam possimus aut ipsa."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6695567399746083998,"format":"int64"}},"example":{"account_id":"Amet itaque aut.","has_credentials":true,"id":"Atque delectus ut.","label":"Unde adipisci aut quisquam.","project_id":"Eum non ut itaque.","status":"inactive","version":8672712817511304757},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quas quia quam voluptate nam iste."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et doloremque porro non."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores quo est ratione beatae totam."},"project_id":{"type":"string","description":"Owning project","example":"Quis ab non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1807846651493588341,"format":"int64"}},"example":{"account_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Temporibus aut numquam.","label":"Enim velit voluptates officiis tempora possimus rerum.","project_id":"Accusantium ut vitae dolor soluta beatae.","status":"active","version":8042484860326151968},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Incidunt deleniti.","has_credentials":false,"id":"Officiis modi quae consequatur voluptatem et.","label":"Vero eum ea perspiciatis rerum.","project_id":"Culpa veritatis ut adipisci minus.","status":"active","version":6279401977493721745},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Numquam optio possimus velit quod."}},"example":{"account_id":"t2_gv9wtbfa","label":"Perspiciatis quam iste possimus ipsam."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Mollitia vel."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ea eum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Qui qui."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Repudiandae quae aut.","client_secret":"Tempore rem quo fuga accusantium voluptas ratione.","refresh_token":"Esse et labore earum."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo repudiandae."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel aut aliquam rerum et quidem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim voluptatem inventore quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est porro eos ipsa quia."},"project_id":{"type":"string","description":"Owning project","example":"Delectus enim quas id porro."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1500674714869504232,"format":"int64"}},"example":{"account_id":"Sequi non et.","etag":"Quibusdam repellendus qui numquam.","funding_instrument_id":"Necessitatibus quaerat minima a voluptatem ipsa et.","has_credentials":true,"id":"Aut omnis itaque ut vero voluptatibus.","label":"Vero dolorem qui.","project_id":"Eum provident velit voluptatibus.","status":"active","version":3990374454753155356},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","funding_instrument_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","funding_instrument_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est perferendis eos et cumque nulla."},"label":{"type":"string","description":"Optional friendly name","example":"Iste exercitationem voluptate quia esse nihil sed."}},"example":{"account_id":"8r7gb","funding_instrument_id":"In autem neque nihil laborum omnis.","label":"Neque maiores quo aliquam in rem."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Hic voluptatem ad similique sunt ratione."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Dicta et ratione impedit recusandae dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nemo sint et consequatur vel quisquam libero."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Eum et sint possimus omnis dolorem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Facere sed ea qui pariatur adipisci.","access_token_secret":"Enim esse dolores.","consumer_key":"Mollitia vel temporibus sunt nulla esse.","consumer_secret":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 6ea9eca3..0ae17c6a 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -32,16 +32,17 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. responses: "201": description: Created response. @@ -51,27 +52,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et eum ex doloremque quia. - example: Eum itaque. + example: Nobis est fugit ratione consectetur exercitationem. + example: Aperiam quia doloribus omnis. content: application/json: schema: $ref: '#/components/schemas/Brief2' example: - copy: Architecto voluptas ratione delectus ut adipisci. - event_details: Quas qui mollitia perferendis eveniet voluptas est. - event_slug: Ullam tenetur quia totam magni sunt repellat. - id: A quos a sed exercitationem ut. - keywords: Temporibus aliquam animi unde. + copy: Ut temporibus aliquam animi unde. + event_details: Et architecto voluptas ratione delectus ut. + event_slug: Magni autem. + id: Laboriosam tempore vero voluptatum a quos. + keywords: Ut est nobis aspernatur. platforms: - - Quo eum dignissimos iure. - - Ea quis. - program_type: Doloremque itaque eius magni autem. - project_id: Ut minus in nemo perspiciatis et qui. + - Tempore nihil quos. + - Eum dignissimos iure praesentium ea. + - Quis quas qui mollitia perferendis eveniet voluptas. + program_type: Nemo perspiciatis et qui aliquam doloremque itaque. + project_id: Sed exercitationem ut totam ut minus. status: draft - targeting: Ut est nobis aspernatur. - url: Ex tempore. - version: 1756394405346388080 + targeting: Fugit qui tempora commodi reiciendis sit alias. + url: Ullam tenetur quia totam magni sunt repellat. + version: 958049424855577225 "400": description: 'BadRequest: Bad request' content: @@ -143,8 +145,8 @@ paths: schema: type: string description: Brief UUID - example: Aperiam et ab. - example: Tempore vel quia cum. + example: Sit ut repellat voluptas. + example: Eligendi consequatur officia labore eos. responses: "204": description: No Content response. @@ -218,8 +220,8 @@ paths: schema: type: string description: Brief UUID - example: Recusandae recusandae est et fuga veniam natus. - example: Et iusto doloremque odio. + example: Excepturi fugit. + example: Aut quia voluptates voluptates nisi. responses: "200": description: OK response. @@ -229,27 +231,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ipsum expedita animi. - example: Ratione est omnis voluptas praesentium. + example: Aut molestias aut excepturi cumque. + example: Ut hic distinctio non recusandae et qui. content: application/json: schema: $ref: '#/components/schemas/Brief3' example: - copy: Dolorum excepturi quibusdam. - event_details: Enim magnam eius voluptas voluptatibus deleniti. - event_slug: Hic vero et. - id: Voluptas et accusamus quia et officiis ipsum. - keywords: Amet iusto provident sequi est. + copy: Quaerat ea accusantium. + event_details: Amet iusto provident sequi est. + event_slug: Ut ea alias. + id: Explicabo cupiditate rerum. + keywords: Voluptatem iure vero. platforms: - - Aspernatur qui quidem est eligendi. - - Non accusantium quis architecto. - program_type: Incidunt ipsum est perspiciatis soluta voluptas est. - project_id: Explicabo cupiditate rerum. + - Accusantium quis architecto. + - Enim magnam eius voluptas voluptatibus deleniti. + - Dolorum excepturi quibusdam. + program_type: Hic vero et. + project_id: Incidunt ipsum est perspiciatis soluta voluptas est. status: draft - targeting: Quaerat ea accusantium. - url: Ut ea alias. - version: 4496268214732198365 + targeting: Consequatur neque tempore voluptatibus quo quod nesciunt. + url: Nam aspernatur qui quidem est eligendi. + version: 7881322722259816896 "400": description: 'BadRequest: Bad request' content: @@ -320,8 +323,8 @@ paths: schema: type: string description: Brief UUID - example: Aspernatur voluptatum facilis. - example: Laboriosam et. + example: Exercitationem officia corrupti tempora ea. + example: Totam unde. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -339,16 +342,17 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. responses: "200": description: OK response. @@ -358,29 +362,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sapiente alias et error nobis minima. - example: Fuga maxime tempora rem. + example: Ipsa sint optio nobis quae corporis. + example: Voluptas ut nostrum officiis et accusamus provident. content: application/json: schema: $ref: '#/components/schemas/Brief4' example: - copy: Veniam maiores dolorum sit et. - event_details: Dolor ut. - event_slug: Et assumenda recusandae. - id: Saepe pariatur. - keywords: Porro sed minus illo rerum ut. + copy: Rerum ut culpa totam sequi sit. + event_details: Sit et quod porro sed minus. + event_slug: Et ratione sit. + id: Et assumenda recusandae. + keywords: Excepturi dolor labore. platforms: - - Id incidunt qui et ratione sit quaerat. - - Ipsum quia ad a. - - Veritatis omnis excepturi. - - Et pariatur molestias autem. - program_type: Soluta alias natus aut eligendi ea. - project_id: Est quaerat id qui repudiandae. + - Omnis veritatis omnis. + - Officia et pariatur molestias autem ratione. + - Ut et veniam maiores. + program_type: Totam id incidunt. + project_id: Sint eveniet dicta numquam doloremque ab cumque. status: draft - targeting: Totam sequi. - url: Sint eveniet dicta numquam doloremque ab cumque. - version: 4401871562627166296 + targeting: Iusto dolores. + url: Sed ipsum quia. + version: 7723389563281978281 "400": description: 'BadRequest: Bad request' content: @@ -470,8 +473,8 @@ paths: schema: type: string description: Brief UUID - example: Earum debitis. - example: Perspiciatis dolor pariatur quae amet. + example: Odio eos earum fuga non est. + example: Rerum reiciendis similique. responses: "200": description: OK response. @@ -481,27 +484,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Occaecati quam nostrum quis. - example: Maxime temporibus earum. + example: Tempora qui incidunt tempora. + example: Vero voluptates soluta. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Blanditiis et qui est dolorem eos. - event_details: Modi sed. - event_slug: Eligendi earum qui est et id laudantium. - id: Sed ea. - keywords: Dolorem sed atque. + copy: Sint qui praesentium ea praesentium magni. + event_details: Consequuntur neque mollitia quia. + event_slug: Tempora veritatis harum ab nobis fuga atque. + id: Et tempore. + keywords: Iure dolore et et aut nam. platforms: - - Veritatis harum ab nobis. - - Atque inventore fugiat aut laboriosam maxime facere. - program_type: Et tempore. - project_id: Ut nihil quo tenetur doloribus fugiat natus. + - Blanditiis et qui est dolorem eos. + - Dolorem sed atque. + - Provident id quia porro rerum. + - Quo aliquid nobis. + program_type: Ratione incidunt est saepe. + project_id: Eligendi earum qui est et id laudantium. status: archived - targeting: Provident id quia porro rerum. - url: Ratione incidunt est saepe. - version: 2165165569618896837 + targeting: Voluptates odit consequatur quis. + url: Fugiat aut laboriosam maxime facere culpa modi. + version: 317664992246136086 "400": description: 'BadRequest: Bad request' content: @@ -573,8 +578,8 @@ paths: schema: type: string description: Brief UUID - example: Qui minus sit necessitatibus. - example: Aut est et. + example: Repudiandae odit. + example: Cupiditate est illo repellat et cum repellat. requestBody: required: true content: @@ -583,12 +588,10 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Est voluptatum enim earum et doloribus. + config: Vitae reiciendis voluptatem. platforms: - - hubspot - - meta-ads - reddit-ads - - twitter-ads + - microsoft-ads responses: "202": description: Accepted response. @@ -597,10 +600,10 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Id ducimus eius et laboriosam omnis vitae. + job_id: Rerum sint optio. platforms: - - Non voluptas ut enim. - - Rerum sint optio. + - Quos tempora dolorem dolor fugiat quia. + - Exercitationem rerum iste ducimus. status: queued "400": description: 'BadRequest: Bad request' @@ -673,8 +676,8 @@ paths: schema: type: string description: Brief UUID - example: Debitis ea molestiae eum voluptatum. - example: Illo eveniet. + example: Temporibus ipsum necessitatibus ratione possimus. + example: Facilis repellat eveniet reiciendis. - name: campaign_id in: path description: Campaign UUID @@ -682,8 +685,8 @@ paths: schema: type: string description: Campaign UUID - example: Consequatur nemo molestiae modi ut non atque. - example: Sed commodi voluptatibus. + example: Consequatur sint et vel molestiae. + example: Non placeat. responses: "200": description: OK response. @@ -693,21 +696,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Nobis est fugit ratione consectetur exercitationem. - example: Aperiam quia doloribus omnis. + example: Natus pariatur et et sed debitis. + example: Necessitatibus reprehenderit illum. content: application/json: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Ut consectetur. - campaign_name: Est qui molestiae rerum adipisci minima quibusdam. - id: Hic voluptas debitis error. - platform: Commodi quam voluptates. - platform_campaign_id: Optio dolorem omnis. - project_id: Veniam eum ut libero quibusdam debitis. - status: Accusantium sunt culpa libero quisquam. - version: 6082718548704928320 + brief_id: Est qui molestiae rerum adipisci minima quibusdam. + campaign_name: Harum distinctio reiciendis architecto atque maxime soluta. + id: Commodi quam voluptates. + platform: Accusantium sunt culpa libero quisquam. + platform_campaign_id: Rerum amet aut tempora recusandae aspernatur. + project_id: Optio dolorem omnis. + status: Ducimus porro maxime. + version: 5829797402937558935 "400": description: 'BadRequest: Bad request' content: @@ -778,8 +781,8 @@ paths: schema: type: string description: Brief UUID - example: Excepturi fugit. - example: Aut quia voluptates voluptates nisi. + example: Minima adipisci aut quia quisquam. + example: Quia facilis sit. - name: campaign_id in: path description: Campaign UUID @@ -787,8 +790,8 @@ paths: schema: type: string description: Campaign UUID - example: Aut molestias aut excepturi cumque. - example: Esse voluptate non autem. + example: Magnam nihil qui doloremque nam magnam aliquid. + example: Possimus accusantium expedita alias. - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -806,9 +809,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. - config: Error similique. - status: Maxime fugiat illo. + campaign_name: Alias ullam fugiat deserunt sint nihil iusto. + config: Necessitatibus expedita. + status: Voluptas inventore sit. responses: "200": description: OK response. @@ -818,21 +821,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ut hic distinctio non recusandae et qui. - example: Totam unde. + example: Incidunt sit. + example: Totam tempora quod expedita. content: application/json: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Enim ea. - campaign_name: Totam sapiente vitae numquam ut nesciunt voluptas. - id: Necessitatibus expedita. - platform: Asperiores et. - platform_campaign_id: Laboriosam quis facere. - project_id: Beatae autem autem. - status: Exercitationem consectetur. - version: 6868385032394830606 + brief_id: Exercitationem consectetur. + campaign_name: Modi asperiores ut libero vel. + id: Laboriosam quis facere. + platform: Nesciunt necessitatibus ex ea ullam corrupti sunt. + platform_campaign_id: Omnis accusantium ad. + project_id: Totam sapiente vitae numquam ut nesciunt voluptas. + status: Voluptates iste autem veniam et enim unde. + version: 1765361339666375563 "400": description: 'BadRequest: Bad request' content: @@ -972,21 +975,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempora qui incidunt tempora. - example: Vero voluptates soluta. + example: Voluptas ipsam iste. + example: Delectus libero necessitatibus quis. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Ipsum quaerat delectus cupiditate sit et. + account_id: Quis sapiente ut sit quod. has_credentials: true - id: Eum dolorum. - label: Veniam velit sequi sit impedit dolorum voluptas. - login_customer_id: Sed non. - project_id: Distinctio vel. + id: Ea minus enim ut. + label: Magnam ut et ab. + login_customer_id: Quae nihil magni. + project_id: Nostrum veniam qui rerum ipsum eum fugit. status: error - version: 4111850562907897222 + version: 7243034772713915274 "404": description: 'NotFound: Resource not found' content: @@ -1044,10 +1047,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. responses: "201": description: Created response. @@ -1057,21 +1060,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas ut nostrum officiis et accusamus provident. - example: Rerum reiciendis similique. + example: Commodi et nihil et. + example: Repellendus adipisci sit et enim quasi ut. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Perspiciatis saepe consequatur doloribus sequi et. - has_credentials: true - id: Nulla ut laboriosam. - label: Omnis suscipit corrupti reiciendis. - login_customer_id: Nihil quia omnis eaque aperiam eum. - project_id: Rerum delectus velit. - status: active - version: 3995988906528985875 + account_id: Magni et rerum sed voluptatum. + has_credentials: false + id: Veniam velit sequi sit impedit dolorum voluptas. + label: Enim est occaecati sed non dolorem distinctio. + login_customer_id: Nostrum tenetur repellendus. + project_id: Ipsum quaerat delectus cupiditate sit et. + status: deleted + version: 5181448788196437025 "400": description: 'BadRequest: Bad request' content: @@ -1155,21 +1158,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit ut repellat voluptas. - example: Repudiandae odit. + example: Aut sunt ex et autem delectus. + example: Occaecati placeat et. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Ut laborum nostrum veniam qui rerum. + account_id: Deserunt magni voluptas odio assumenda totam. has_credentials: true - id: Aut ratione sunt nostrum tenetur. - label: Fugit enim et sint consectetur ea minus. - login_customer_id: Magnam ut et ab. - project_id: Dolorem cum. - status: active - version: 5799897036572741099 + id: Laudantium expedita ut ipsum id commodi nobis. + label: Velit sapiente qui iusto quis magni et. + login_customer_id: Officiis deleniti ipsam nam. + project_id: Vitae aut voluptatem inventore ab. + status: deleted + version: 6633489521806040497 "400": description: 'BadRequest: Bad request' content: @@ -1251,10 +1254,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. responses: "204": description: No Content response. @@ -1321,8 +1324,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sapiente ut sit quod. - ok: true + message: Aut id molestiae sit. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1426,24 +1429,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quo omnis et et molestiae dolorum. - example: Consequatur iste eum amet vel impedit et. + example: Dolorem quia. + example: Adipisci consectetur ut modi quo et. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Deleniti itaque voluptas magnam. - brand_kit: Dolor id. - has_credentials: false - id: Dolorem sapiente. - label: Sint autem. - portal_id: Vitae optio ut et consequuntur. - project_id: Aut natus. - sender_email: Libero autem ut. - sender_name: Debitis soluta sed quod dicta aperiam eveniet. - status: error - version: 7443019901611180865 + account_id: Non ut voluptas et accusamus natus id. + brand_kit: Eos voluptatibus. + has_credentials: true + id: Sit similique ut minima ut. + label: Quia enim illo et eligendi. + portal_id: Et quam architecto vero. + project_id: Voluptatum officia quod error amet quia inventore. + sender_email: Vero labore laudantium maiores. + sender_name: Reiciendis dignissimos consequatur iste qui minima. + status: deleted + version: 4350724330275405551 "404": description: 'NotFound: Resource not found' content: @@ -1497,14 +1500,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. responses: "201": description: Created response. @@ -1514,24 +1517,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Architecto ab et libero ea aut. - example: Corrupti aut earum rerum ducimus dicta. + example: Iure ut. + example: Minus id deleniti. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Qui et. - brand_kit: Porro ea cum et magni adipisci. - has_credentials: false - id: Ad esse neque earum modi. - label: Ab voluptatem esse. - portal_id: Aut culpa impedit sit quibusdam nulla adipisci. - project_id: Quis possimus placeat. - sender_email: Dolorem molestias natus velit. - sender_name: Non dolorum odit est. - status: active - version: 8186374755967651666 + account_id: Debitis soluta sed quod dicta aperiam eveniet. + brand_kit: Voluptas expedita omnis ex. + has_credentials: true + id: Deleniti itaque voluptas magnam. + label: Consequuntur sit libero autem ut. + portal_id: Accusantium sequi modi corrupti esse mollitia. + project_id: Voluptatem modi velit vitae optio ut. + sender_email: Saepe rerum sunt eum et qui aut. + sender_name: Ut quia harum. + status: error + version: 6360555217771164808 "400": description: 'BadRequest: Bad request' content: @@ -1603,12 +1606,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. responses: "200": description: OK response. @@ -1618,24 +1621,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et rerum repudiandae et at iusto. - example: Voluptas esse qui quisquam quae est magni. + example: Eum autem quia quis soluta nostrum cumque. + example: Quia velit. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Ut aut. - brand_kit: Ut voluptas et accusamus natus. - has_credentials: false - id: Saepe rerum sunt eum et qui aut. - label: Voluptas expedita omnis ex. - portal_id: Minima ut quasi voluptatum officia quod error. - project_id: Ut quia harum. - sender_email: Quia inventore est quia enim illo. - sender_name: Eligendi aperiam. - status: error - version: 9020823344753101103 + account_id: Autem recusandae totam. + brand_kit: Similique deserunt iusto. + has_credentials: true + id: Ex delectus. + label: Officia quidem non qui voluptates natus cum. + portal_id: Odit necessitatibus veritatis amet ut rerum quidem. + project_id: Voluptas ullam dolores rem. + sender_email: Iusto velit quo voluptatibus modi reiciendis aliquam. + sender_name: Quidem explicabo expedita sunt. + status: active + version: 3951189417473657674 "400": description: 'BadRequest: Bad request' content: @@ -1717,7 +1720,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. responses: "204": description: No Content response. @@ -1784,7 +1787,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Et officia sequi et quam. + message: Aspernatur possimus. ok: true "404": description: 'NotFound: Resource not found' @@ -1889,21 +1892,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur sint et vel molestiae. - example: Natus pariatur et et sed debitis. + example: Tempore qui est. + example: Provident saepe aliquam architecto non vero. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Ducimus sequi. + account_id: Accusamus vero et voluptas accusamus sunt. has_credentials: true - id: Et placeat. - label: Aut et. - org_id: Culpa voluptas quia tenetur. - project_id: Qui esse. - status: inactive - version: 3277300697475451657 + id: Minus voluptas asperiores debitis labore aut. + label: Distinctio ipsa nihil ad hic repellendus nobis. + org_id: Vel blanditiis sunt ut facere. + project_id: Porro ab id necessitatibus consequatur natus tempora. + status: error + version: 4876542408988375571 "404": description: 'NotFound: Resource not found' content: @@ -1958,10 +1961,10 @@ paths: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. responses: "201": description: Created response. @@ -1971,21 +1974,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Cupiditate est illo repellat et cum repellat. - example: Facilis repellat eveniet reiciendis. + example: Natus aliquam aut quas aliquid. + example: Praesentium beatae quis ut eius. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Deserunt magni voluptas odio assumenda totam. + account_id: Facere harum enim consequatur id voluptatem. has_credentials: true - id: Nobis ipsam. - label: Velit sapiente qui iusto quis magni et. - org_id: Officiis deleniti ipsam nam. - project_id: Aut voluptatem inventore ab. - status: deleted - version: 6633489521806040497 + id: Ducimus sequi. + label: Quia tenetur ducimus. + org_id: Consequatur dolorum sint voluptatem voluptas omnis est. + project_id: Autem ab voluptas culpa. + status: active + version: 4064850428710517856 "400": description: 'BadRequest: Bad request' content: @@ -2058,7 +2061,7 @@ paths: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" responses: "200": @@ -2069,21 +2072,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quaerat iure ipsam. - example: Minima adipisci aut quia quisquam. + example: Voluptas consequatur iusto nostrum pariatur. + example: Quidem minus pariatur praesentium. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Minus voluptas asperiores debitis labore aut. - has_credentials: true - id: Enim consequatur id voluptatem adipisci alias. - label: Tempora ipsum aut enim harum. - org_id: Necessitatibus consequatur natus tempora ut. - project_id: Sequi consequatur dolorum sint voluptatem voluptas omnis. + account_id: Et corporis officia sint. + has_credentials: false + id: Consequatur omnis quidem est non tenetur. + label: Voluptatibus qui cupiditate voluptatem. + org_id: Quia nulla autem ratione. + project_id: Deleniti dolores commodi. status: error - version: 7443611122231905788 + version: 874315130556833044 "400": description: 'BadRequest: Bad request' content: @@ -2165,7 +2168,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. responses: "204": description: No Content response. @@ -2232,8 +2235,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Nihil ad hic repellendus nobis voluptatem. - ok: true + message: Mollitia a magni vel consequatur ea deserunt. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2337,22 +2340,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Incidunt sit. - example: Totam tempora quod expedita. + example: Deserunt reiciendis dolorem totam voluptatem. + example: Repudiandae molestias est consectetur porro quo pariatur. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Asperiores ipsum quam. - app_id: Cum rem architecto vel quibusdam vel autem. + account_id: Aut et. + app_id: Quia laboriosam magnam unde hic. has_credentials: false - id: Non praesentium voluptas saepe sit. - label: Reiciendis qui id tenetur exercitationem aperiam incidunt. - page_id: Qui suscipit rerum quo eligendi tempora. - project_id: Sed qui. - status: active - version: 5968285761891001183 + id: Facilis facilis aut suscipit aut odio iste. + label: Tenetur velit quaerat aut. + page_id: Distinctio ea totam rem harum provident. + project_id: Deleniti earum magni quibusdam. + status: deleted + version: 5896744453366252956 "404": description: 'NotFound: Resource not found' content: @@ -2407,12 +2410,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. responses: "201": description: Created response. @@ -2422,22 +2425,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quia facilis sit. - example: Possimus accusantium expedita alias. + example: Voluptas libero pariatur ut qui sint. + example: Quasi esse corporis molestiae excepturi suscipit. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Ratione quis. - app_id: Aut assumenda unde occaecati eum tenetur nam. + account_id: Quibusdam vel autem modi id facere. + app_id: Possimus expedita qui. has_credentials: true - id: Voluptatibus qui cupiditate voluptatem. - label: Ut in possimus quia nulla. - page_id: Vel consequatur ea deserunt. - project_id: Et corporis officia sint. - status: error - version: 935673982343451083 + id: Eius voluptatem molestiae qui suscipit rerum. + label: Rem architecto. + page_id: Et maxime. + project_id: Eligendi tempora quos. + status: deleted + version: 8688592599556109682 "400": description: 'BadRequest: Bad request' content: @@ -2510,9 +2513,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. responses: "200": description: OK response. @@ -2522,22 +2525,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit harum ipsa et. - example: Commodi et nihil et. + example: Ut ea. + example: Aliquam eum molestiae. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Aliquid ducimus quia. - app_id: Quas tenetur velit quaerat aut. + account_id: Vero commodi est qui asperiores velit enim. + app_id: Architecto dicta. has_credentials: true - id: Hic delectus. - label: Quibusdam aliquam consequuntur. - page_id: Aut odio iste assumenda deleniti earum magni. - project_id: Maxime ut possimus expedita. - status: inactive - version: 7469982570284737303 + id: Atque rerum et officiis sapiente et et. + label: Eligendi ea vel consequatur nihil. + page_id: Ut est recusandae aspernatur eum fugit voluptas. + project_id: Dolores in hic rem. + status: deleted + version: 2446786767075191046 "400": description: 'BadRequest: Bad request' content: @@ -2619,8 +2622,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. responses: "204": description: No Content response. @@ -2687,8 +2690,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Et quo. - ok: false + message: Numquam doloremque et qui perferendis ut. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -2792,21 +2795,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Amet qui provident. - example: Ut ea. + example: Debitis iusto molestias itaque. + example: Fugit et soluta. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Ut tempora consequuntur cumque repudiandae omnis ut. - customer_id: Est aut labore sint natus. + account_id: Doloremque architecto ea et. + customer_id: Exercitationem soluta possimus a. has_credentials: false - id: Vero quis consequuntur. - label: Ut fugiat magnam quia. - project_id: Quis quo illum cum quod. + id: Sed maiores qui sed exercitationem quam. + label: Et et veritatis voluptas nobis. + project_id: Non sint praesentium quia. status: active - version: 343208040254291221 + version: 2312965176389631300 "404": description: 'NotFound: Resource not found' content: @@ -2860,14 +2863,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. responses: "201": description: Created response. @@ -2877,21 +2880,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Earum laboriosam dignissimos reiciendis et quisquam. - example: Deserunt reiciendis dolorem totam voluptatem. + example: Dolorem labore laboriosam repellat harum. + example: Aut eos. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Autem aspernatur ea voluptatem. - customer_id: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Quia sed omnis quaerat aut. + customer_id: Magnam cumque quasi magni ducimus. has_credentials: true - id: Eos explicabo non quidem. - label: Nam voluptas sed et doloremque reiciendis pariatur. - project_id: Debitis itaque itaque dolores nihil. - status: deleted - version: 8497111294039610948 + id: Ducimus debitis nesciunt quas quibusdam occaecati cum. + label: Nostrum laborum minima. + project_id: Iste voluptatem et voluptatem ut ut. + status: error + version: 3654633208585641813 "400": description: 'BadRequest: Bad request' content: @@ -2963,9 +2966,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. responses: "200": description: OK response. @@ -2975,21 +2978,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Laudantium doloremque aut eligendi perferendis aut. - example: Consectetur delectus libero id. + example: Et qui officiis repudiandae qui iste accusantium. + example: Consequatur provident ea sint. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: In expedita. - customer_id: Magni ducimus nulla suscipit sed minus soluta. - has_credentials: false - id: Iste voluptatem et voluptatem ut ut. - label: Quia sed omnis quaerat aut. - project_id: Nostrum laborum minima. - status: error - version: 7283482467977491974 + account_id: Quis possimus placeat. + customer_id: Et qui et. + has_credentials: true + id: Dignissimos voluptate iste. + label: Ad esse neque earum modi. + project_id: Aut qui est iste. + status: active + version: 280885210133145304 "400": description: 'BadRequest: Bad request' content: @@ -3071,10 +3074,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. responses: "204": description: No Content response. @@ -3141,8 +3144,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sed maiores qui sed exercitationem quam. - ok: true + message: Quo quae aut culpa. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -3246,20 +3249,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sed ipsam enim esse iure est. - example: Aut sunt ex et autem delectus. + example: Corrupti aut earum rerum ducimus dicta. + example: Perspiciatis a aut quas delectus a. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Ipsam temporibus sint et necessitatibus dolorem ut. + account_id: Incidunt aut aperiam et ipsam. has_credentials: true - id: Quidem illo numquam doloremque et. - label: Fugiat adipisci eos rerum. - project_id: Perferendis ut quia aut. - status: active - version: 1442766184420227830 + id: Pariatur consequatur iste sed illo. + label: Consectetur porro quo. + project_id: Sunt ipsa. + status: error + version: 6549464945762782488 "404": description: 'NotFound: Resource not found' content: @@ -3314,11 +3317,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. responses: "201": description: Created response. @@ -3328,20 +3331,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dolorem omnis aspernatur veritatis adipisci. - example: Voluptas ipsam iste. + example: Consectetur delectus libero id. + example: Aut sit iste. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Asperiores velit enim tempore expedita ut. - has_credentials: false - id: Sapiente et et itaque dolores in. - label: Consequatur nihil explicabo vero commodi est. - project_id: Rem dolores eligendi ea. - status: deleted - version: 2256150830368172012 + account_id: Neque ipsum nihil cumque repellendus. + has_credentials: true + id: Sit iusto. + label: Architecto unde rerum quisquam ut. + project_id: Voluptates neque expedita. + status: inactive + version: 3464454785938965677 "400": description: 'BadRequest: Bad request' content: @@ -3414,7 +3417,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. responses: "200": description: OK response. @@ -3424,20 +3427,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Adipisci omnis veritatis omnis praesentium omnis. - example: Natus aliquam aut quas aliquid. + example: Consequatur iste eum amet vel impedit et. + example: Adipisci et laboriosam veritatis saepe numquam rem. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Architecto unde rerum quisquam ut. - has_credentials: true - id: Veniam debitis aut similique ullam temporibus qui. - label: Voluptates neque expedita. - project_id: Sit iusto. - status: deleted - version: 2250019048790832853 + account_id: Est consequatur eveniet in fuga ut. + has_credentials: false + id: Recusandae beatae aliquam quia officiis hic ea. + label: Vitae quae debitis sunt aperiam ex voluptatibus. + project_id: Ut dolor velit. + status: active + version: 2352400902970282412 "400": description: 'BadRequest: Bad request' content: @@ -3519,9 +3522,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. responses: "204": description: No Content response. @@ -3588,8 +3591,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Repellendus sint. - ok: true + message: Ratione consequuntur aut et corrupti. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -3693,21 +3696,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ullam voluptatibus nihil. - example: Voluptas consequatur iusto nostrum pariatur. + example: Ullam sunt rem non doloribus. + example: Corrupti ipsum. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Numquam quia. - funding_instrument_id: Autem provident est. + account_id: Dignissimos necessitatibus consequuntur. + funding_instrument_id: Ipsum voluptatem et quam beatae laborum omnis. has_credentials: true - id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Sit ex commodi sapiente a illum. - project_id: Pariatur voluptas odit fuga illo. - status: active - version: 4562568070495708080 + id: Error necessitatibus et autem doloribus est. + label: Repudiandae voluptatem vitae iste maxime modi laborum. + project_id: Maxime labore illo maxime provident. + status: error + version: 1380295609570133746 "404": description: 'NotFound: Resource not found' content: @@ -3762,13 +3765,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. responses: "201": description: Created response. @@ -3778,21 +3781,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Saepe non tempore. - example: Tempore qui est. + example: Voluptas esse qui quisquam quae est magni. + example: Quibusdam accusamus possimus. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Est consequatur eveniet in fuga ut. - funding_instrument_id: Accusamus ratione consequuntur aut et corrupti. - has_credentials: false - id: Beatae aliquam quia officiis hic ea. - label: Vitae quae debitis sunt aperiam ex voluptatibus. - project_id: Ut dolor velit. - status: active - version: 2352400902970282412 + account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + funding_instrument_id: Eaque animi molestias error laudantium. + has_credentials: true + id: Quis et odio tenetur optio. + label: Iste eveniet laudantium rerum. + project_id: Ut sint. + status: error + version: 7980949958307848867 "400": description: 'BadRequest: Bad request' content: @@ -3865,8 +3868,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. responses: "200": description: OK response. @@ -3876,21 +3879,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Laborum ut magnam aut illum commodi placeat. - example: Voluptas libero pariatur ut qui sint. + example: Consequuntur quia et saepe aperiam. + example: Accusamus ipsa qui. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - funding_instrument_id: Eaque animi molestias error laudantium. + account_id: Nobis nam. + funding_instrument_id: Reiciendis pariatur quisquam. has_credentials: true - id: Quis et odio tenetur optio. - label: Iste eveniet laudantium rerum. - project_id: Ut sint. + id: Aut quis qui laudantium dolore. + label: Non quidem doloribus debitis itaque itaque dolores. + project_id: Possimus nihil qui enim ratione voluptatem eos. status: error - version: 7980949958307848867 + version: 7616558197057713508 "400": description: 'BadRequest: Bad request' content: @@ -3972,10 +3975,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. responses: "204": description: No Content response. @@ -4042,8 +4045,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Odio adipisci dolore iste ipsa. - ok: true + message: Ea voluptatem eum voluptas eveniet. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -4097,8 +4100,8 @@ paths: schema: type: string description: Job UUID - example: Ipsa sint optio nobis quae corporis. - example: Et iste. + example: Sit harum ipsa et. + example: Dignissimos fugiat voluptatibus natus. responses: "200": description: OK response. @@ -4107,9 +4110,21 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Veniam et. - job_id: Iure modi asperiores ut. - result: Autem voluptates iste. + error: Reiciendis et perspiciatis saepe consequatur doloribus. + job_id: Velit minus. + result: + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. + - campaign_id: Quidem qui iusto sed quaerat vel fuga. + error: Odio nulla ut laboriosam vel rerum. + ok: false + platform: Dolor molestias ipsa dolorum est. status: running "400": description: 'BadRequest: Bad request' @@ -4182,80 +4197,80 @@ components: properties: copy: description: Ad copy - example: Eaque ut laudantium nostrum ratione. + example: Odit odio praesentium. etag: type: string description: ETag header value (mirrors version) - example: Non iusto odit consequatur in vero soluta. + example: Eaque ratione debitis nam blanditiis. event_details: description: Extracted event/course details - example: Laboriosam nostrum quos expedita voluptas. + example: Dolorem fugiat et aspernatur voluptatem nobis. event_slug: type: string description: Event/course slug - example: Deserunt labore et id aut et adipisci. + example: Nihil sunt doloremque. id: type: string description: Brief UUID - example: Et qui ut libero numquam. + example: Vero at ut quis. keywords: description: Keyword list - example: Eius laborum. + example: Eveniet sint voluptatibus quam dicta. platforms: type: array items: type: string - example: Voluptates ut culpa saepe necessitatibus. + example: Ea architecto autem iste. description: Suggested default platforms example: - - Enim id voluptas aperiam distinctio. - - Harum eos eveniet ut. + - Ipsa tempore incidunt velit provident. + - Magni tempore sunt itaque omnis. + - Ex sunt sit beatae. + - Modi voluptatum veniam molestiae quibusdam. program_type: type: string description: Funnel context - example: Esse voluptate eum laboriosam distinctio non. + example: Qui maiores quia non unde deserunt. project_id: type: string description: Owning project - example: Ullam facilis ab sapiente voluptatem. + example: Molestiae aut fugit alias. status: type: string description: Lifecycle status - example: approved + example: draft enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Voluptate itaque fugit rerum cumque. + example: Consequuntur voluptatem est qui. url: type: string description: Event/course page URL - example: Ut molestiae. + example: Ut ut odio odio sed minus quia. version: type: integer description: Optimistic-concurrency version - example: 7582961521318439491 + example: 6644792324746576285 format: int64 example: - copy: Ut ut odio odio sed minus quia. - etag: Itaque omnis ut. - event_details: Nihil sunt doloremque. - event_slug: Porro ut et cupiditate. - id: Eius dicta. - keywords: Ea architecto autem iste. + copy: Iure culpa est possimus dolores dignissimos. + etag: Id eum aut et itaque. + event_details: Itaque est fugiat aut dicta. + event_slug: Magnam quisquam et consequuntur ut sunt. + id: Ex aut quia distinctio consequatur. + keywords: Velit laudantium error. platforms: - - Necessitatibus dolorem enim beatae. - - Minus vero at ut quis. - - Molestiae aut fugit alias. - - Qui maiores quia non unde deserunt. - program_type: Non assumenda perspiciatis. - project_id: Ullam distinctio dolore velit. + - Beatae sed aut quia nihil est. + - Qui fugiat. + program_type: Provident repudiandae sit qui aut aut. + project_id: Dolor corporis consequatur voluptatem voluptates sed. status: draft - targeting: In ipsa tempore incidunt velit provident perspiciatis. - url: Ea ullam minima voluptatem vel deleniti. - version: 1281384136826250351 + targeting: Et aut quia beatae. + url: Et velit fuga quos est. + version: 9139670973455309725 required: - id - project_id @@ -4268,40 +4283,39 @@ components: properties: copy: description: Ad copy - example: Quod enim pariatur et occaecati veritatis voluptatem. + example: Ut aperiam voluptate voluptates. event_details: description: Extracted event/course details - example: Iure enim dolore est. + example: Eum necessitatibus alias. event_slug: type: string description: Event/course slug - example: Nihil atque. + example: Provident dicta tenetur voluptatem voluptate dolor. id: type: string description: Brief UUID - example: Et optio sed omnis aut voluptatem voluptas. + example: Ad quis aperiam deserunt nostrum. keywords: description: Keyword list - example: Architecto aliquam mollitia labore sapiente dolores tenetur. + example: Sapiente molestiae dolorum repellat expedita ut. platforms: type: array items: type: string - example: Vero ad ex consequatur dolore. + example: Odio sunt esse mollitia incidunt. description: Suggested default platforms example: - - Beatae eaque quo atque. - - Error eligendi incidunt accusamus excepturi inventore. - - Est ut voluptas quod. - - Dolor qui molestiae id aut. + - Laborum sed molestias veritatis itaque. + - Est quis impedit. + - Illo harum et consequatur. program_type: type: string description: Funnel context - example: Et eum inventore quisquam. + example: Qui minima in nulla sunt autem eos. project_id: type: string description: Owning project - example: Eum omnis est blanditiis maxime et. + example: Et sed praesentium libero. status: type: string description: Lifecycle status @@ -4312,31 +4326,33 @@ components: - archived targeting: description: Targeting recommendation - example: Accusamus qui. + example: Dolor quam dolor consectetur eos iste. url: type: string description: Event/course page URL - example: Nihil facilis sunt. + example: Provident porro. version: type: integer description: Optimistic-concurrency version - example: 1931126915939314041 + example: 709937816203366628 format: int64 example: - copy: Necessitatibus sit. - event_details: Sit dignissimos incidunt voluptas. - event_slug: Reiciendis enim. - id: Mollitia ea. - keywords: Quis aperiam deserunt nostrum consectetur et sed. + copy: Animi sit esse ratione aliquid. + event_details: Repudiandae tenetur aperiam saepe vel. + event_slug: Alias minus reprehenderit dignissimos aut velit. + id: Quis veniam iusto consequatur quia. + keywords: Laborum est quasi dignissimos. platforms: - - Nemo nihil dolorum consequatur sed tempora qui. - - Hic vel aspernatur at quam est ea. - program_type: Ad quae nisi. - project_id: Et amet sunt. - status: approved - targeting: Libero blanditiis. - url: Cum et ab ipsum. - version: 1441686313140477581 + - Omnis doloribus. + - Cum ut quo. + - Necessitatibus id sint dicta assumenda omnis voluptatem. + - Praesentium voluptatem blanditiis non totam temporibus. + program_type: Impedit dolores. + project_id: Officia eligendi alias. + status: draft + targeting: Velit quis harum recusandae est ipsum. + url: At sint laborum veniam. + version: 285293330655778463 required: - id - project_id @@ -4349,77 +4365,75 @@ components: properties: copy: description: Ad copy - example: Praesentium et. + example: Reiciendis sit minima. event_details: description: Extracted event/course details - example: Dolor consectetur eos iste. + example: Eligendi ipsam aut vel atque. event_slug: type: string description: Event/course slug - example: Dolores laborum sed. + example: Perspiciatis alias et amet ex molestiae. id: type: string description: Brief UUID - example: Nulla sunt autem eos rerum provident dicta. + example: Modi repellat eum. keywords: description: Keyword list - example: Veniam iusto consequatur quia sed officia eligendi. + example: Unde et. platforms: type: array items: type: string - example: Est quis impedit. + example: Pariatur mollitia incidunt autem. description: Suggested default platforms example: - - Harum et consequatur eligendi eum necessitatibus. - - Magnam ut. - - Voluptate voluptates corrupti sapiente. - - Dolorum repellat expedita ut recusandae dolor. + - Voluptate fuga ea distinctio maiores mollitia aut. + - Rerum cum eaque nesciunt est totam inventore. program_type: type: string description: Funnel context - example: Commodi odio sunt esse mollitia incidunt. + example: Eligendi magni quidem sit in quia. project_id: type: string description: Owning project - example: Voluptatem voluptate dolor dolores provident. + example: Voluptatem eos doloribus sint. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Qui impedit. + example: Ut dolores in voluptas. url: type: string description: Event/course page URL - example: Veritatis itaque. + example: Minus libero et consequuntur suscipit. version: type: integer description: Optimistic-concurrency version - example: 1624749011573187666 + example: 3896136867528920326 format: int64 example: - copy: Amet quaerat modi. - event_details: Velit quis harum recusandae est ipsum. - event_slug: Quo necessitatibus necessitatibus. - id: Minus reprehenderit dignissimos aut velit. - keywords: Eum totam voluptatem eos. + copy: Sapiente harum aliquam sunt eum rerum eaque. + event_details: Voluptatem sint hic. + event_slug: Aut omnis labore et quis consequatur dolores. + id: Numquam molestias quibusdam aliquid deleniti. + keywords: Facere voluptatibus. platforms: - - Voluptatem rerum praesentium voluptatem blanditiis non. - - Temporibus in repudiandae tenetur. - - Saepe vel aut animi sit esse ratione. - - Blanditiis laborum est quasi dignissimos. - program_type: Repellendus omnis doloribus amet cum. - project_id: At sint laborum veniam. + - Minima aut fugit eos et iure laudantium. + - Est molestiae voluptates ipsum neque sapiente aliquid. + - Velit sunt molestiae eius. + - Reprehenderit nobis hic eos magni. + program_type: Est natus sequi beatae. + project_id: Est aliquam debitis natus. status: approved - targeting: Sint exercitationem. - url: Sint dicta. - version: 6296331077615132388 + targeting: Nisi repudiandae. + url: Nostrum similique omnis iste. + version: 7605661861379582739 required: - id - project_id @@ -4432,39 +4446,39 @@ components: properties: copy: description: Ad copy - example: Placeat dolores numquam molestias quibusdam aliquid. + example: Delectus veniam vel est et magni. event_details: description: Extracted event/course details - example: Et itaque ut dolores in voluptas. + example: Vero consequatur possimus aut assumenda. event_slug: type: string description: Event/course slug - example: Autem quo tempora voluptate fuga. + example: Recusandae ut ullam aliquam dolore iure. id: type: string description: Brief UUID - example: Sit in quia molestiae perspiciatis alias et. + example: Velit omnis dolorem est aut. keywords: description: Keyword list - example: Fuga est aliquam debitis. + example: Et provident illo non quisquam iure doloremque. platforms: type: array items: type: string - example: Rerum cum eaque nesciunt est totam inventore. + example: Officia natus quia labore. description: Suggested default platforms example: - - Ipsam aut vel. - - Eos reiciendis. - - Minima non. + - Dolores et incidunt voluptatem ipsa. + - Assumenda excepturi. + - Tempora est eveniet sequi ea. program_type: type: string description: Funnel context - example: Libero et consequuntur suscipit distinctio pariatur mollitia. + example: Consequuntur esse culpa. project_id: type: string description: Owning project - example: Ex molestiae praesentium. + example: Recusandae dignissimos dolore harum totam tempora vitae. status: type: string description: Lifecycle status @@ -4475,32 +4489,33 @@ components: - archived targeting: description: Targeting recommendation - example: Deleniti est natus sequi beatae consectetur. + example: Ut aliquid. url: type: string description: Event/course page URL - example: Distinctio maiores mollitia aut. + example: Minus nostrum iste nemo fugiat sunt. version: type: integer description: Optimistic-concurrency version - example: 7075859053648216976 + example: 1796419171074064120 format: int64 example: - copy: Distinctio tempore qui velit omnis dolorem est. - event_details: Voluptatibus nihil nisi. - event_slug: Est molestiae voluptates ipsum neque sapiente aliquid. - id: Et quis consequatur dolores repellat nostrum similique. - keywords: Quia recusandae dignissimos dolore harum totam. + copy: Commodi qui mollitia et eum veniam. + event_details: Alias voluptatem ut consequatur ut recusandae. + event_slug: Ab laboriosam sunt quis omnis. + id: Veritatis impedit aut. + keywords: Aliquam eaque voluptatem omnis. platforms: - - Nobis hic eos magni eos voluptatem. - - Hic ut sapiente harum aliquam sunt eum. - - Eaque occaecati. - program_type: Minima aut fugit eos et iure laudantium. - project_id: Iste aliquid. - status: draft - targeting: Vitae illo consequuntur esse. - url: Velit sunt molestiae eius. - version: 7533657070215672415 + - Alias temporibus illum impedit ullam. + - Suscipit harum. + - Neque quia. + - Et veniam itaque optio consequatur nulla sint. + program_type: Exercitationem accusamus pariatur saepe ab qui. + project_id: Earum doloribus. + status: approved + targeting: Cupiditate aut. + url: Sunt quis odio enim nam id voluptatem. + version: 232152934679383541 required: - id - project_id @@ -4513,73 +4528,75 @@ components: properties: copy: description: Ad copy - example: Et provident illo non quisquam iure doloremque. + example: Qui rerum numquam quo omnis a quia. event_details: description: Extracted event/course details - example: Est et magni. + example: Itaque qui repudiandae magnam atque. event_slug: type: string description: Event/course slug - example: Voluptatem ipsa. + example: Soluta dolore vitae. id: type: string description: Brief UUID - example: Ut ullam aliquam dolore iure consequatur. + example: Minima iure quos enim occaecati beatae. keywords: description: Keyword list - example: Ut aliquid. + example: Culpa ipsam totam nulla. platforms: type: array items: type: string - example: Tempora est eveniet sequi ea. + example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. description: Suggested default platforms example: - - Consequatur possimus. - - Assumenda sit delectus veniam. + - Voluptatem aut debitis vitae unde velit eos. + - Accusantium odit rerum commodi ea. + - Consequatur et. program_type: type: string description: Funnel context - example: Quia labore non ut dolores et. + example: Quaerat et eius culpa magni illum consequatur. project_id: type: string description: Owning project - example: Nostrum iste nemo fugiat sunt deleniti officia. + example: Molestiae ad voluptatum ducimus accusantium et. status: type: string description: Lifecycle status - example: archived + example: approved enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Repellendus eveniet veritatis impedit aut iste earum. + example: Molestias sint sequi. url: type: string description: Event/course page URL - example: Assumenda excepturi. + example: In commodi et asperiores et. version: type: integer description: Optimistic-concurrency version - example: 2088061558739708952 + example: 122602759626083426 format: int64 example: - copy: Commodi qui mollitia et eum veniam. - event_details: Alias voluptatem ut consequatur ut recusandae. - event_slug: Quis odio enim nam id voluptatem. - id: Accusamus pariatur saepe. - keywords: Aliquam eaque voluptatem omnis. + copy: Fuga atque. + event_details: Qui omnis nesciunt qui consequuntur. + event_slug: Minima dolorem sit est tempora qui. + id: Placeat perferendis omnis ad voluptas. + keywords: Sequi culpa. platforms: - - Eaque suscipit harum sint neque quia fuga. - - Veniam itaque optio consequatur nulla sint. - program_type: Laboriosam sunt quis omnis animi. - project_id: Qui et. - status: approved - targeting: Cupiditate aut. - url: Vero alias temporibus illum. - version: 232152934679383541 + - Praesentium cumque illum pariatur odio molestias voluptatum. + - Nulla perferendis possimus deserunt iure et. + - Ea quidem ducimus tempora ea molestias. + program_type: Enim totam. + project_id: Voluptates laboriosam cumque mollitia quidem quo. + status: draft + targeting: Odit provident sed quo aperiam. + url: Voluptas necessitatibus cumque non porro qui molestias. + version: 4353559979947303924 required: - id - project_id @@ -4592,54 +4609,56 @@ components: properties: copy: description: Ad copy - example: Optio labore omnis. + example: Voluptas aperiam. event_details: description: Extracted event/course details - example: Sunt omnis mollitia aut rerum quis et. + example: Dolores enim. event_slug: type: string description: Event/course slug (unique within the project) - example: Amet enim non rem. + example: Rerum numquam amet deserunt rem quia. keywords: description: Keyword list - example: Nihil aut rerum est vel. + example: Assumenda harum eos eveniet ut et laboriosam. platforms: type: array items: type: string - example: Quos perferendis nisi blanditiis eveniet quasi ea. + example: Numquam omnis ullam facilis ab sapiente. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Corporis dolorum consequatur eius perferendis. - - Omnis vel voluptate necessitatibus enim et et. + - Esse voluptate eum laboriosam distinctio non. + - Deserunt labore et id aut et adipisci. + - Ut molestiae. + - Voluptates ut culpa saepe necessitatibus. program_type: type: string description: Funnel context - example: membership + example: education enum: - events - education - membership targeting: description: Targeting recommendation - example: Rem ab corporis. + example: Quos expedita voluptas qui eaque. url: type: string description: Event/course page URL - example: Voluptas deserunt quod officiis. + example: Ipsam dolores et et qui ut. example: - copy: Vitae vel omnis autem accusamus mollitia. - event_details: Corrupti voluptas. - event_slug: Dolorem repellendus porro et distinctio. - keywords: Assumenda aut harum eligendi rerum numquam amet. + copy: Porro ut et cupiditate. + event_details: Non assumenda perspiciatis. + event_slug: Nostrum ratione id. + keywords: Ea ullam minima voluptatem vel deleniti. platforms: - - Error aut maxime dicta qui. - - Quas suscipit eos nam ipsa. - - Velit et impedit facilis quaerat. - - Dolor ut velit quam omnis et dolor. + - Quae molestiae suscipit non iusto. + - Consequatur in vero soluta. + - Eius dicta. + - Ullam distinctio dolore velit. program_type: education - targeting: Rem quia vel ipsam dolores. - url: Aut assumenda fugiat quia eaque dolor porro. + targeting: Repudiandae necessitatibus dolorem enim beatae quia. + url: Laborum aspernatur voluptate itaque fugit. required: - program_type - event_slug @@ -4649,50 +4668,50 @@ components: brief_id: type: string description: Parent brief - example: Facere qui omnis. + example: Aut ut. campaign_name: type: string description: Campaign name - example: Dolores natus a sint quod sunt. + example: Aut ut sit nisi architecto. etag: type: string description: ETag header value (mirrors version) - example: Ipsa non. + example: Voluptate enim qui impedit temporibus. id: type: string description: Campaign UUID - example: Et itaque rem eos et deleniti dolores. + example: Et vel beatae molestiae fuga. platform: type: string description: Channel - example: Enim vitae officia dolorem odio. + example: Sed corrupti sit. platform_campaign_id: type: string description: ID returned by the ad platform - example: Beatae quia qui excepturi minima. + example: Labore quia esse consectetur tenetur eum. project_id: type: string description: Owning project - example: Facilis qui libero. + example: Vitae consequatur eos. status: type: string description: Campaign status - example: Et nesciunt iure quis in ut mollitia. + example: Rerum et recusandae possimus quis. version: type: integer description: Optimistic-concurrency version - example: 9203456138223090094 + example: 9161333083936888105 format: int64 example: - brief_id: Dolores sit. - campaign_name: Amet omnis. - etag: Sit cupiditate non. - id: Necessitatibus quibusdam. - platform: Exercitationem accusantium nihil. - platform_campaign_id: Quod alias ipsum voluptates pariatur magni. - project_id: Est accusantium laudantium nostrum. - status: At fugit dolor. - version: 6873369027351486557 + brief_id: Explicabo repudiandae aut reiciendis recusandae molestias. + campaign_name: Hic est quia pariatur odit ullam. + etag: Quisquam nisi repellendus quos magnam aut. + id: Eos omnis cumque nemo ipsam ut. + platform: Vel inventore aliquid aut non eligendi accusamus. + platform_campaign_id: Quod impedit accusamus incidunt minus veritatis enim. + project_id: Natus et unde. + status: Ex id corrupti sed quo perferendis. + version: 7863921121752869750 required: - id - project_id @@ -4707,45 +4726,45 @@ components: brief_id: type: string description: Parent brief - example: Quaerat et eius culpa magni illum consequatur. + example: Voluptates sit est corporis molestiae voluptatem. campaign_name: type: string description: Campaign name - example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. + example: Ratione ipsum. id: type: string description: Campaign UUID - example: Minima iure quos enim occaecati beatae. + example: Et incidunt. platform: type: string description: Channel - example: Soluta dolore vitae. + example: Expedita inventore qui necessitatibus ut necessitatibus in. platform_campaign_id: type: string description: ID returned by the ad platform - example: In commodi et asperiores et. + example: Autem maxime hic. project_id: type: string description: Owning project - example: Molestiae ad voluptatum ducimus accusantium et. + example: Dolor sed excepturi delectus. status: type: string description: Campaign status - example: Assumenda voluptatem aut debitis vitae. + example: Amet hic est. version: type: integer description: Optimistic-concurrency version - example: 529135087014785401 + example: 906675377577277444 format: int64 example: - brief_id: Et et itaque qui repudiandae magnam. - campaign_name: Quaerat molestias. - id: Eos eius. - platform: Ullam qui rerum numquam quo. - platform_campaign_id: A quia magnam culpa ipsam totam. - project_id: Odit rerum commodi ea et. - status: Sequi aut veniam ratione. - version: 4528974556497386277 + brief_id: Magnam voluptates molestiae libero autem quod. + campaign_name: Sunt accusantium totam quia. + id: Occaecati rerum reiciendis. + platform: Ullam ipsum. + platform_campaign_id: Dolores dolore id dolore sed. + project_id: Esse mollitia et dolorum accusantium aspernatur quos. + status: Accusantium debitis adipisci qui iste explicabo. + version: 9006499932988805057 required: - id - project_id @@ -4760,45 +4779,45 @@ components: brief_id: type: string description: Parent brief - example: Quo et enim totam et minima dolorem. + example: Dolor quia consectetur non nulla dolore. campaign_name: type: string description: Campaign name - example: In praesentium cumque. + example: Quos omnis. id: type: string description: Campaign UUID - example: Omnis ad voluptas esse voluptates. + example: Qui quia. platform: type: string description: Channel - example: Est tempora qui. + example: Ducimus voluptas soluta quod qui. platform_campaign_id: type: string description: ID returned by the ad platform - example: Voluptas necessitatibus cumque non porro qui molestias. + example: Fugiat est omnis inventore voluptatum ab totam. project_id: type: string description: Owning project - example: Cumque mollitia. + example: Ipsam sint autem repudiandae asperiores. status: type: string description: Campaign status - example: Pariatur odio molestias voluptatum. + example: Libero consequatur. version: type: integer description: Optimistic-concurrency version - example: 7642665711405677689 + example: 3986034538934721868 format: int64 example: - brief_id: Qui omnis nesciunt qui consequuntur. - campaign_name: Odit provident sed quo aperiam. - id: Perferendis possimus deserunt iure et. - platform: Fuga atque. - platform_campaign_id: Sequi culpa. - project_id: Ea quidem ducimus tempora ea molestias. - status: Aspernatur nihil et incidunt dolorem dolor sed. - version: 7197986407230546835 + brief_id: Reiciendis odit eos et quidem. + campaign_name: Quae voluptatem velit mollitia dolorem ea. + id: Sapiente ex est modi cupiditate possimus ducimus. + platform: Atque hic quam impedit placeat. + platform_campaign_id: Voluptatibus aliquam et. + project_id: Modi consequatur molestias et et deleniti. + status: Enim voluptas numquam. + version: 616047483519279742 required: - id - project_id @@ -4812,12 +4831,12 @@ components: properties: config: description: Per-platform campaign configuration - example: Voluptatum veniam molestiae. + example: Qui libero natus. platforms: type: array items: type: string - example: google-ads + example: twitter-ads enum: - google-ads - linkedin-ads @@ -4828,15 +4847,16 @@ components: - hubspot description: Platforms to create campaigns on (binding selection) example: + - microsoft-ads - meta-ads - - google-ads - twitter-ads + - hubspot example: - config: Aspernatur voluptatem nobis. + config: Vitae officia dolorem. platforms: - - google-ads - meta-ads - - microsoft-ads + - twitter-ads + - hubspot required: - platforms CampaignUpdateInput: @@ -4845,18 +4865,18 @@ components: campaign_name: type: string description: Campaign name - example: Modi possimus consequatur. + example: Id voluptatem nihil quaerat asperiores. config: description: Campaign configuration snapshot - example: Voluptatibus aspernatur. + example: Error perferendis quae qui inventore dolorem. status: type: string description: Campaign status - example: Eveniet esse officia explicabo dolor deserunt. + example: Repellat vel veritatis hic rerum accusamus. example: - campaign_name: Accusamus nam cupiditate. - config: Earum minus autem omnis qui debitis eum. - status: Hic vel ut. + campaign_name: Quasi in aut nam rerum. + config: Architecto deserunt vero ducimus distinctio. + status: Distinctio magnam. required: - campaign_name - status @@ -4900,14 +4920,14 @@ components: message: type: string description: Human-readable detail - example: Veniam dolores quidem necessitatibus. + example: Magni aut nisi est sit sint. ok: type: boolean description: Whether the credential authenticated against the provider example: false example: - message: Sit reiciendis et vel beatae molestiae. - ok: false + message: Et voluptas dolorem necessitatibus illum quisquam. + ok: true required: - ok CreateBriefRequestBody: @@ -4917,16 +4937,17 @@ components: $ref: '#/components/schemas/BriefInput' example: brief: - copy: Et incidunt pariatur quod. - event_details: Molestiae inventore voluptas. - event_slug: Voluptas corporis velit et. - keywords: Placeat velit ullam enim voluptatem cupiditate voluptas. + copy: Expedita unde molestiae. + event_details: Mollitia molestiae saepe qui ex commodi. + event_slug: Nesciunt unde ullam occaecati maxime. + keywords: Voluptas dolor et incidunt pariatur quod odit. platforms: - - Molestiae saepe qui. - - Commodi voluptatem expedita. - program_type: membership - targeting: Facilis iste. - url: Quia ut atque. + - Ut expedita voluptatum sit. + - Quasi voluptas corporis velit et. + - Quia ut atque. + program_type: education + targeting: Velit ullam. + url: Similique vel nobis non molestias. required: - brief CreateCampaignsRequestBody: @@ -4936,12 +4957,10 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Est voluptatum enim earum et doloribus. + config: Vitae reiciendis voluptatem. platforms: - - hubspot - - meta-ads - reddit-ads - - twitter-ads + - microsoft-ads required: - input CreateGoogleAdsRequestBody: @@ -4957,10 +4976,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - config - credentials @@ -4973,14 +4992,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - config - credentials @@ -4994,10 +5013,10 @@ components: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - config - credentials @@ -5011,12 +5030,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - config - credentials @@ -5029,14 +5048,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. credentials: - client_id: Laborum voluptatem dignissimos necessitatibus consequuntur aliquam. - client_secret: Fugit dignissimos ipsum voluptatem et quam beatae. - developer_token: Ipsam aut quis qui laudantium. - refresh_token: Omnis eveniet esse aut et rem suscipit. + client_id: Quis quo illum cum quod. + client_secret: Ut fugiat magnam quia. + developer_token: Distinctio beatae. + refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. required: - config - credentials @@ -5050,11 +5069,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - config - credentials @@ -5068,13 +5087,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - config - credentials @@ -5084,11 +5103,11 @@ components: account_id: type: string description: Provider account identifier - example: Hic est quia pariatur odit ullam. + example: Velit quis. etag: type: string description: ETag header value (mirrors version) - example: Sed quo perferendis nemo ut quisquam. + example: Vel architecto quae error dolor placeat. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5096,23 +5115,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Explicabo repudiandae aut reiciendis recusandae molestias. + example: Voluptatem nostrum. label: type: string description: Optional friendly name - example: Quod impedit accusamus incidunt minus veritatis enim. + example: Ut nobis. login_customer_id: type: string description: Manager account used for API access - example: Repellendus quos magnam. + example: Minus et. project_id: type: string description: Owning project - example: Vel inventore aliquid aut non eligendi accusamus. + example: Deleniti voluptas quo nostrum quia. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5121,18 +5140,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2175885598856983154 + example: 7197135224651925465 format: int64 example: - account_id: Quae qui inventore dolorem deserunt. - etag: Rerum sint. + account_id: Nostrum atque illum nesciunt adipisci odit corrupti. + etag: Voluptas omnis quidem dolor ipsum voluptas sed. has_credentials: true - id: In id voluptatem nihil quaerat. - label: Hic rerum accusamus velit error. - login_customer_id: Magnam adipisci architecto deserunt. - project_id: Pariatur repellat vel. - status: active - version: 1017420418363680400 + id: Fugiat aliquid aspernatur voluptatem in cupiditate. + label: Iusto fugit non asperiores quidem natus. + login_customer_id: Id ea. + project_id: Et dolorem quod. + status: deleted + version: 8604742619872904748 required: - id - project_id @@ -5147,31 +5166,31 @@ components: account_id: type: string description: Provider account identifier - example: Autem maxime hic. + example: Rem fugit accusantium est. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Harum voluptates sit est corporis. + example: Iusto eius dolor magnam necessitatibus amet. label: type: string description: Optional friendly name - example: Necessitatibus ut necessitatibus in. + example: Rerum tempore tempora. login_customer_id: type: string description: Manager account used for API access - example: Amet hic est. + example: Dolorem asperiores autem aut aut soluta. project_id: type: string description: Owning project - example: Voluptatem repellat expedita inventore. + example: Earum aut qui. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5180,17 +5199,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7828959688196597051 + example: 6983147448769937945 format: int64 example: - account_id: Libero autem quod saepe ullam ipsum. + account_id: Officia dolores et reprehenderit. has_credentials: false - id: Quaerat occaecati rerum. - label: Aspernatur quos est magnam voluptates. - login_customer_id: Dolore sed. - project_id: Quae esse mollitia et dolorum. - status: error - version: 3252068377050447352 + id: Et est et corporis. + label: Aut explicabo. + login_customer_id: Rerum rem. + project_id: Voluptate est reprehenderit consectetur accusamus eaque inventore. + status: deleted + version: 8504196254053832609 required: - id - project_id @@ -5204,27 +5223,27 @@ components: account_id: type: string description: Provider account identifier - example: Est ipsam sint autem repudiandae asperiores et. + example: Et vel dolorum aut inventore consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Sunt accusantium totam quia. + example: Vitae qui explicabo tempora accusantium aut. label: type: string description: Optional friendly name - example: Commodi qui. + example: Nobis qui sunt laboriosam ipsa. login_customer_id: type: string description: Manager account used for API access - example: Nulla dolore quibusdam ducimus voluptas soluta. + example: Dicta ut. project_id: type: string description: Owning project - example: Accusantium debitis adipisci qui iste explicabo. + example: In vel. status: type: string description: Connection status @@ -5237,17 +5256,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7019802315342385433 + example: 5579476471615779331 format: int64 example: - account_id: Ex est modi cupiditate. + account_id: Alias quod minima blanditiis. has_credentials: true - id: Qui at fugiat est omnis inventore. - label: Consequatur quisquam explicabo. - login_customer_id: Consequatur molestias et et deleniti sint. - project_id: Ab totam laboriosam quos omnis deserunt. - status: error - version: 765646658236151796 + id: Beatae error deleniti vitae molestiae qui nobis. + label: Quia enim non asperiores velit. + login_customer_id: Iure dolores dolores dolorem sit nihil. + project_id: Aut temporibus dolorem cumque quis. + status: inactive + version: 4548596825330631938 required: - id - project_id @@ -5261,7 +5280,7 @@ components: account_id: type: string description: Provider account identifier - example: Aliquam et asperiores quae voluptatem velit. + example: Ipsam eligendi est dolore. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5269,19 +5288,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Odit eos. + example: Sit est atque qui quaerat qui vitae. label: type: string description: Optional friendly name - example: Hic quam impedit placeat consequatur. + example: Optio in ratione accusamus quasi. login_customer_id: type: string description: Manager account used for API access - example: Enim voluptas numquam. + example: Quos excepturi natus est est. project_id: type: string description: Owning project - example: Quidem est. + example: Optio non. status: type: string description: Connection status @@ -5294,17 +5313,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5408757854107547795 + example: 6617602369183761406 format: int64 example: - account_id: Officia dolorem. - has_credentials: true - id: Et iusto eius dolor magnam necessitatibus. - label: Tempora voluptatem rem fugit accusantium est necessitatibus. - login_customer_id: Aut soluta quae et est et corporis. - project_id: Mollitia earum aut qui sit rerum. - status: inactive - version: 758133864872776679 + account_id: Quibusdam ea nam aut. + has_credentials: false + id: Doloribus unde id aut perspiciatis. + label: Sit totam ut et. + login_customer_id: Est consequatur rerum neque velit nulla modi. + project_id: Adipisci ut. + status: active + version: 926393304108038988 required: - id - project_id @@ -5339,25 +5358,25 @@ components: client_id: type: string description: OAuth client id - example: Sed corrupti sit. + example: In consectetur et culpa quaerat vel sed. client_secret: type: string description: OAuth client secret - example: Labore quia esse consectetur tenetur eum. + example: Et impedit quod. developer_token: type: string description: Google Ads developer token - example: Aut ut sit nisi architecto. + example: Magni omnis. refresh_token: type: string description: OAuth refresh token - example: Natus vitae consequatur eos sit aut ut. + example: Ipsa nihil esse. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Praesentium voluptate. - client_secret: Qui impedit temporibus eveniet eos omnis cumque. - developer_token: Ipsam ut sed natus et unde. - refresh_token: Rerum et recusandae possimus quis. + client_id: Sit id incidunt. + client_secret: Non sed hic minima est distinctio. + developer_token: A perferendis. + refresh_token: Facere eum aliquid est repellat assumenda. required: - refresh_token - client_id @@ -5369,47 +5388,47 @@ components: account_id: type: string description: Provider account identifier - example: Quia omnis commodi aspernatur pariatur nostrum. + example: Error eligendi incidunt accusamus excepturi inventore. brand_kit: type: string description: Per-project brand kit selector - example: Quia omnis in qui. + example: Aut architecto aliquam mollitia labore sapiente. etag: type: string description: ETag header value (mirrors version) - example: Perferendis est ipsum aut voluptas molestias. + example: Quod minima dolor. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolor ea iusto eveniet velit sint odit. + example: Nihil facilis sunt. label: type: string description: Optional friendly name - example: Quis quae quam enim. + example: Ut beatae eaque quo atque. portal_id: type: string description: HubSpot portal/account ID - example: Fuga voluptas ut vero autem consequuntur. + example: Molestiae id aut debitis iure. project_id: type: string description: Owning project - example: Ipsa eos nemo cupiditate et esse voluptate. + example: Vero ad ex consequatur dolore. sender_email: type: string description: Default sender address - example: Omnis a pariatur omnis. + example: Dolore est dolorem quod enim pariatur. sender_name: type: string description: Default sender name - example: Velit dolorem. + example: Occaecati veritatis. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -5418,21 +5437,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1005353535355254376 + example: 7262698057225531796 format: int64 example: - account_id: Veniam molestias. - brand_kit: Hic magni. - etag: Commodi recusandae. - has_credentials: false - id: Nihil ut. - label: Minus voluptatem ab delectus porro. - portal_id: Cumque rerum. - project_id: Mollitia nulla. - sender_email: Modi esse voluptatibus. - sender_name: Fugit dolorum nulla quo veritatis id. - status: error - version: 3871826656092488452 + account_id: Ad quae nisi. + brand_kit: Incidunt voluptas non necessitatibus. + etag: Cum et ab ipsum. + has_credentials: true + id: Tenetur non accusamus qui ex. + label: Ex et amet sunt. + portal_id: Qui nemo nihil dolorum consequatur. + project_id: Quia mollitia. + sender_email: Tempora qui eum hic vel aspernatur at. + sender_name: Est ea sed sit. + status: deleted + version: 7589133128297342291 required: - id - project_id @@ -5447,11 +5466,11 @@ components: account_id: type: string description: Provider account identifier - example: Itaque iure soluta autem. + example: Non in iure dolores et quis id. brand_kit: type: string description: Per-project brand kit selector - example: Atque qui dignissimos aut eaque eveniet. + example: Accusamus corrupti sint molestiae occaecati est quos. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5459,31 +5478,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Est eum ut ut amet et molestiae. + example: Sint consequuntur omnis distinctio possimus non aliquid. label: type: string description: Optional friendly name - example: Qui quae qui optio. + example: Excepturi est et est totam. portal_id: type: string description: HubSpot portal/account ID - example: Odit numquam quia. + example: Quia sed nesciunt minus. project_id: type: string description: Owning project - example: Nihil dolor exercitationem eum placeat dolores culpa. + example: Facilis neque sed alias dolore id. sender_email: type: string description: Default sender address - example: Aut dolores. + example: Non doloribus nam. sender_name: type: string description: Default sender name - example: Voluptatem beatae quis dignissimos voluptatem et labore. + example: Nulla suscipit. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5492,20 +5511,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3577746410602694753 + example: 1661229305097180791 format: int64 example: - account_id: Modi vel aut rerum. - brand_kit: Dolor eum et consequatur. - has_credentials: false - id: Ut unde dolore id. - label: Ad optio magnam sequi esse. - portal_id: Assumenda cum nemo esse nobis. - project_id: Necessitatibus fuga ducimus dolorem ut aspernatur. - sender_email: Aut dolorem ea veniam. - sender_name: Quae adipisci doloribus ullam. - status: deleted - version: 9002316743787506494 + account_id: Totam non qui. + brand_kit: Sunt labore voluptate. + has_credentials: true + id: Est ut ratione nobis. + label: Qui ut ut qui sed explicabo. + portal_id: Vero nulla laboriosam vel et et iure. + project_id: Occaecati tenetur minima veritatis sed impedit laborum. + sender_email: Exercitationem voluptatum perspiciatis autem. + sender_name: Eum ut. + status: active + version: 5481070480011205228 required: - id - project_id @@ -5519,11 +5538,11 @@ components: account_id: type: string description: Provider account identifier - example: At magnam saepe incidunt nisi est. + example: Consequatur laborum. brand_kit: type: string description: Per-project brand kit selector - example: Deleniti non in iure dolores et quis. + example: Aut tempora dolorem neque assumenda sed. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5531,31 +5550,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Optio enim nisi doloremque rerum sed consequatur. + example: Cum ipsum quo possimus. label: type: string description: Optional friendly name - example: Dolores dignissimos perferendis tempore eum laboriosam iure. + example: Cum ipsa molestias voluptatibus nam debitis hic. portal_id: type: string description: HubSpot portal/account ID - example: Possimus non aliquid qui. + example: Excepturi sit minus. project_id: type: string description: Owning project - example: Quia amet vero dolorum incidunt officia nihil. + example: Quam culpa. sender_email: type: string description: Default sender address - example: Neque sed alias. + example: Et quisquam dicta. sender_name: type: string description: Default sender name - example: Id ducimus excepturi est et est. + example: Eaque enim est libero enim quo. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5564,20 +5583,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6047270410556243251 + example: 2473646846997850541 format: int64 example: - account_id: Corrupti sint molestiae occaecati est. - brand_kit: Nesciunt sed magnam sed vero nulla. + account_id: Similique eaque autem impedit tenetur voluptatibus. + brand_kit: Et fuga veniam. has_credentials: true - id: Recusandae similique assumenda ut quia. - label: Nam eius nulla suscipit ullam. - portal_id: Ratione nobis ut occaecati tenetur minima veritatis. - project_id: Nesciunt minus natus non. - sender_email: Impedit laborum quaerat qui ut ut qui. - sender_name: Explicabo dolorem totam non. - status: error - version: 9169545032565251193 + id: Aspernatur ipsam consequatur qui illo totam fuga. + label: Qui non illum expedita commodi in dolores. + portal_id: Harum molestiae cupiditate ab et eum ex. + project_id: In tempore quo consequatur. + sender_email: Quia velit adipisci. + sender_name: Aliquid eum itaque qui recusandae recusandae. + status: deleted + version: 5418486313404831501 required: - id - project_id @@ -5591,39 +5610,39 @@ components: account_id: type: string description: Provider account identifier - example: Sunt labore voluptate. + example: Praesentium eos aspernatur voluptatum facilis laboriosam. brand_kit: type: string description: Per-project brand kit selector - example: Beatae non et excepturi sit minus. + example: Ab earum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Vel et et iure tempora. + example: Ea et iusto doloremque odio pariatur. label: type: string description: Optional friendly name - example: Eum ut. + example: Autem aliquid ratione est omnis. portal_id: type: string description: HubSpot portal/account ID - example: Possimus saepe quam culpa qui. + example: Alias et error nobis minima fuga reprehenderit. project_id: type: string description: Owning project - example: Voluptatum perspiciatis autem. + example: Expedita animi ut velit at. sender_email: type: string description: Default sender address - example: Ipsa molestias. + example: Impedit qui suscipit ipsa. sender_name: type: string description: Default sender name - example: Nam debitis hic qui consequatur laborum. + example: Animi fuga maxime tempora. status: type: string description: Connection status @@ -5636,20 +5655,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2692133725202625638 + example: 2736756583759126082 format: int64 example: - account_id: Aspernatur ipsam consequatur qui illo totam fuga. - brand_kit: Libero quia quam harum molestiae cupiditate. + account_id: Ab itaque tempore vel quia cum quas. + brand_kit: Sed commodi voluptatibus. has_credentials: true - id: Et quisquam dicta. - label: Aut tempora dolorem neque assumenda sed. - portal_id: Consequatur sint. - project_id: Eaque enim est libero enim quo. - sender_email: Non illum expedita commodi in dolores nemo. - sender_name: Eaque autem impedit tenetur voluptatibus. - status: inactive - version: 6362542183217834869 + id: Rerum perspiciatis dolor pariatur. + label: Quo soluta maxime temporibus earum et aperiam. + portal_id: Ipsa aut est et est debitis ea. + project_id: Amet officia occaecati quam nostrum quis voluptas. + sender_email: Eum voluptatum accusamus illo eveniet eum. + sender_name: Nemo molestiae modi ut non atque. + status: deleted + version: 5960975059584485019 required: - id - project_id @@ -5663,34 +5682,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Qui et assumenda quas. + example: Minus voluptatem ab delectus porro. brand_kit: type: string description: Per-project brand kit selector - example: Qui sed voluptatibus quam quia. + example: Modi esse voluptatibus. label: type: string description: Optional friendly name - example: Praesentium libero. + example: Mollitia nulla. portal_id: type: string description: HubSpot portal/account ID - example: Quisquam animi. + example: Veniam molestias. sender_email: type: string description: Default sender address - example: Delectus blanditiis magnam sed iure amet. + example: Accusamus quia velit commodi. sender_name: type: string description: Default sender name - example: Repudiandae facilis blanditiis libero nam. + example: Tenetur cumque rerum. example: - account_id: Molestiae omnis doloremque. - brand_kit: Aliquid explicabo eaque ab aut voluptas. - label: Deserunt et quidem sapiente. - portal_id: Perspiciatis modi dicta quae sed ut. - sender_email: Et atque. - sender_name: Impedit velit omnis incidunt. + account_id: Hic magni. + brand_kit: Nihil atque. + label: Fugit dolorum nulla quo veritatis id. + portal_id: Et optio sed omnis aut voluptatem voluptas. + sender_email: Eum omnis est blanditiis maxime et. + sender_name: Et eum inventore quisquam. required: - account_id HubspotCredentials: @@ -5699,10 +5718,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Nulla eos. + example: Quia omnis in qui. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Recusandae totam soluta. + private_app_token: Nihil ut. required: - private_app_token InternalServerError: @@ -5728,17 +5747,16 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Odit odio praesentium. + example: Ut beatae quia. platforms: type: array items: type: string - example: Sint voluptatibus quam dicta voluptate consequuntur. + example: Minima illo dolores natus a sint. description: Platforms this job will create on example: - - Qui temporibus quis iste eaque. - - Debitis nam. - - Delectus ex aut quia. + - Quae et nesciunt iure quis in. + - Mollitia nihil ducimus. status: type: string description: Initial status (always 'queued' on create) @@ -5746,11 +5764,10 @@ components: enum: - queued example: - job_id: Consequatur dolore dolor corporis consequatur voluptatem voluptates. + job_id: Non quo necessitatibus. platforms: - - Repudiandae sit qui aut aut. - - Magnam quisquam et consequuntur ut sunt. - - Et velit fuga quos est. + - Accusantium laudantium nostrum earum dolores. + - Eos exercitationem. status: queued required: - job_id @@ -5761,18 +5778,33 @@ components: error: type: string description: Terminal error, if any - example: Fugiat aut dicta libero. + example: Hic vel ut. job_id: type: string description: Job UUID - example: Officiis beatae sed aut. + example: Illo accusamus. result: + type: array + items: + $ref: '#/components/schemas/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state - example: Est quia qui fugiat est itaque. + example: + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. status: type: string description: Job status - example: succeeded + example: queued enum: - queued - running @@ -5780,10 +5812,22 @@ components: - partial - failed example: - error: Beatae harum similique corporis id eum. - job_id: Culpa est possimus dolores dignissimos. - result: Laudantium error eum et aut. - status: partial + error: Dolores quidem necessitatibus voluptatem consequatur sit. + job_id: Earum minus autem omnis qui debitis eum. + result: + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + - campaign_id: Autem ratione sit nam aliquam. + error: Repellendus in corporis doloribus labore. + ok: false + platform: Modi rem voluptatem. + status: running required: - job_id - status @@ -5793,31 +5837,31 @@ components: account_id: type: string description: Provider account identifier - example: Omnis corrupti facere eum aliquid est repellat. + example: Quidem omnis totam eos non molestias. etag: type: string description: ETag header value (mirrors version) - example: Incidunt mollitia non sed hic. + example: Recusandae illum accusamus debitis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Ex ipsa nihil esse voluptate in consectetur. + example: Doloribus voluptas mollitia doloremque totam. label: type: string description: Optional friendly name - example: Sed voluptatum et impedit quod rem. + example: Quia doloremque commodi rerum. org_id: type: string description: LinkedIn organization URN id - example: Est distinctio accusamus a perferendis. + example: Praesentium sint laudantium error. project_id: type: string description: Owning project - example: Culpa quaerat. + example: Veniam et ducimus quos amet. status: type: string description: Connection status @@ -5830,18 +5874,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6865823349289112261 + example: 6150421422111226538 format: int64 example: - account_id: Velit quis. - etag: Vel architecto quae error dolor placeat. + account_id: Quas quis corporis. + etag: Ea ducimus ipsum dolorem dignissimos. has_credentials: true - id: Voluptatem nostrum. - label: Ut nobis. - org_id: Minus et. - project_id: Deleniti voluptas quo nostrum quia. + id: Nihil iure officiis nemo quia. + label: Et quia ex et alias ea. + org_id: Quo ullam ad iusto quos. + project_id: Ducimus id sint eius aut. status: inactive - version: 7197135224651925465 + version: 2540282771582052941 required: - id - project_id @@ -5856,7 +5900,7 @@ components: account_id: type: string description: Provider account identifier - example: Ex dolor. + example: Sit soluta quia qui. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5864,23 +5908,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptate est reprehenderit consectetur accusamus eaque inventore. + example: Optio quia similique vero est impedit quo. label: type: string description: Optional friendly name - example: Officia dolores et reprehenderit. + example: Libero officia et quia. org_id: type: string description: LinkedIn organization URN id - example: Vitae qui explicabo tempora accusantium aut. + example: Expedita sed velit distinctio. project_id: type: string description: Owning project - example: Aut explicabo. + example: Nihil at. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5889,17 +5933,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2969272646168040903 + example: 1438953144952054594 format: int64 example: - account_id: Autem eaque eaque dicta ut magni. - has_credentials: true - id: In vel. - label: Et vel dolorum aut inventore consequatur. - org_id: Molestiae qui nobis culpa. - project_id: Nobis qui sunt laboriosam ipsa. - status: inactive - version: 32502071618905206 + account_id: Optio rerum vel molestiae id. + has_credentials: false + id: Necessitatibus eos rerum. + label: Qui quas aut provident suscipit. + org_id: Reiciendis excepturi. + project_id: Veniam amet et quisquam voluptatem fuga. + status: active + version: 8349066598252210000 required: - id - project_id @@ -5913,7 +5957,7 @@ components: account_id: type: string description: Provider account identifier - example: Dolores dolores. + example: Aut temporibus. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5921,23 +5965,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Temporibus dolorem cumque quis accusantium quia enim. + example: Aut tenetur. label: type: string description: Optional friendly name - example: Ipsum et et laudantium. + example: Iure aut tenetur ipsum ea ad ducimus. org_id: type: string description: LinkedIn organization URN id - example: Sit est atque qui quaerat qui vitae. + example: Voluptatem libero. project_id: type: string description: Owning project - example: Asperiores velit aut alias quod minima. + example: Et et. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5946,17 +5990,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1323696837483058057 + example: 8572511867951081487 format: int64 example: - account_id: Consequatur aut vero. + account_id: Accusamus eos neque velit. has_credentials: true - id: Optio non. - label: Ipsam eligendi est dolore. - org_id: Est saepe doloribus unde id. - project_id: Optio in ratione accusamus quasi. - status: active - version: 4544790407326456577 + id: Eligendi non. + label: Aut amet aut voluptatum magnam. + org_id: Quisquam perspiciatis ipsam aperiam et totam in. + project_id: Necessitatibus non eum ipsum eveniet quam. + status: error + version: 786757177338717877 required: - id - project_id @@ -5970,7 +6014,7 @@ components: account_id: type: string description: Provider account identifier - example: Voluptas est consequatur rerum neque. + example: Debitis atque laboriosam unde facilis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5978,23 +6022,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Perspiciatis perferendis adipisci. + example: Numquam voluptatem maiores ipsam dicta cum odit. label: type: string description: Optional friendly name - example: Ea nam aut aut dolores. + example: Nam modi nostrum assumenda alias sed. org_id: type: string description: LinkedIn organization URN id - example: Optio quia similique vero est impedit quo. + example: Mollitia ducimus sunt. project_id: type: string description: Owning project - example: Sapiente sit totam ut et ullam. + example: Odit illo ut ut. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -6003,17 +6047,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5284871868291627638 + example: 4721820161303114412 format: int64 example: - account_id: Eos deserunt quia expedita sed velit distinctio. - has_credentials: false - id: Nihil at. - label: Sit soluta quia qui. - org_id: Natus veniam amet. - project_id: Libero officia et quia. - status: inactive - version: 1537409143960626181 + account_id: Est deserunt maiores consequatur. + has_credentials: true + id: Aliquam voluptatem. + label: Eos minima sunt. + org_id: Non ratione quo ullam dolores occaecati. + project_id: Dolore aliquam est autem. + status: deleted + version: 2899021755311679849 required: - id - project_id @@ -6031,14 +6075,14 @@ components: label: type: string description: Optional friendly name - example: Sint est sed. + example: Sit voluptatem ad ab. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Voluptas dolorem necessitatibus illum. + label: Tempora dolor quis totam hic quibusdam eveniet. org_id: "208777" required: - account_id @@ -6049,10 +6093,10 @@ components: access_token: type: string description: OAuth access token - example: Ducimus distinctio deserunt quia magni. + example: Dolorem necessitatibus neque consectetur occaecati earum. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Nisi est. + access_token: Ut sint non eum expedita non. required: - access_token MetaAdsConnection: @@ -6061,15 +6105,15 @@ components: account_id: type: string description: Provider account identifier - example: Quia doloremque commodi rerum. + example: Occaecati quaerat eum quia a excepturi. app_id: type: string description: Meta app ID - example: Error sit nihil iure officiis nemo. + example: Id vel iusto optio repellendus. etag: type: string description: ETag header value (mirrors version) - example: Eos non molestias laudantium quia iusto maxime. + example: Eos culpa quaerat culpa inventore aut molestiae. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6077,19 +6121,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Totam hic quibusdam eveniet. + example: Necessitatibus voluptatem incidunt et totam esse rerum. label: type: string description: Optional friendly name - example: Veniam et ducimus quos amet. + example: Voluptatem incidunt cum. page_id: type: string description: Facebook page ID - example: Illum accusamus debitis explicabo praesentium sint. + example: Hic quos inventore. project_id: type: string description: Owning project - example: Doloribus voluptas mollitia doloremque totam. + example: Dolorem delectus. status: type: string description: Connection status @@ -6102,19 +6146,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4075428576386055706 + example: 4898302691270586418 format: int64 example: - account_id: Corporis dolorem laborum maiores est ea ducimus. - app_id: Tenetur ut. - etag: Quo ullam ad iusto quos. + account_id: Nisi est magni odio aut. + app_id: Et ipsa magnam cum. + etag: Ducimus voluptatem doloremque ullam consequatur. has_credentials: false - id: Molestias ducimus id. - label: Ex et alias ea asperiores quas. - page_id: Est placeat explicabo aliquid. - project_id: Eius aut quo et. + id: Ad dolorem et. + label: Inventore impedit unde voluptatem quia ab recusandae. + page_id: Eveniet tempore est omnis iusto fugiat. + project_id: Rerum eveniet nam sunt. status: inactive - version: 7062935514847310019 + version: 8514774147978099222 required: - id - project_id @@ -6129,11 +6173,11 @@ components: account_id: type: string description: Provider account identifier - example: Reiciendis excepturi. + example: Quos qui quo et. app_id: type: string description: Meta app ID - example: Iure aut tenetur ipsum ea ad ducimus. + example: Sed voluptas fuga officia nulla. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6141,19 +6185,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quisquam voluptatem fuga quia qui. + example: Ut magnam facilis non facilis dolor consectetur. label: type: string description: Optional friendly name - example: Rerum vel molestiae id quae vero aut. + example: A debitis ut ea. page_id: type: string description: Facebook page ID - example: Et et. + example: Beatae facilis dolor quod nihil quia. project_id: type: string description: Owning project - example: Aut provident suscipit incidunt. + example: Error quisquam recusandae nesciunt et itaque. status: type: string description: Connection status @@ -6166,18 +6210,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8554261525276101559 + example: 2532070289670969642 format: int64 example: - account_id: Necessitatibus non eum ipsum eveniet quam. - app_id: Accusamus eos neque velit. - has_credentials: true - id: Aut temporibus. - label: Eligendi non. - page_id: Voluptatum magnam. - project_id: Laborum ipsum accusantium voluptatem libero. + account_id: Et nemo dicta illum omnis. + app_id: Minus est dolor. + has_credentials: false + id: Recusandae consequatur nulla. + label: Consequuntur provident nostrum vel ut. + page_id: Deleniti magnam nemo cum delectus. + project_id: Non consequuntur qui qui impedit assumenda voluptas. status: error - version: 8043832967599792035 + version: 1382848930967937507 required: - id - project_id @@ -6191,11 +6235,11 @@ components: account_id: type: string description: Provider account identifier - example: Odit illo ut ut. + example: Ipsa ut saepe beatae quasi. app_id: type: string description: Meta app ID - example: Perspiciatis debitis atque. + example: Neque voluptas doloremque nobis consectetur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6203,19 +6247,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: In iure molestiae quisquam. + example: Et voluptatem mollitia placeat aut laudantium. label: type: string description: Optional friendly name - example: Numquam voluptatem maiores ipsam dicta cum odit. + example: Nam sequi iste iusto. page_id: type: string description: Facebook page ID - example: Assumenda alias. + example: Corrupti ut. project_id: type: string description: Owning project - example: Ipsam aperiam et totam in. + example: Ut et laborum. status: type: string description: Connection status @@ -6228,18 +6272,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8618836083038100083 + example: 2992056059874429339 format: int64 example: - account_id: Aliquam est autem vel eos minima. - app_id: Ea voluptatum pariatur non. - has_credentials: true - id: Unde facilis. - label: Voluptatem optio. - page_id: Maiores consequatur. - project_id: Ut quas officiis mollitia ducimus sunt repellendus. - status: inactive - version: 2884566362507518761 + account_id: Quis impedit. + app_id: Tempore qui repellendus. + has_credentials: false + id: Voluptas voluptatem. + label: Corrupti dicta pariatur totam quas deserunt. + page_id: Earum voluptates repellat ipsam aut et ut. + project_id: Quia facere vitae aperiam. + status: active + version: 5857417550509828993 required: - id - project_id @@ -6253,35 +6297,35 @@ components: account_id: type: string description: Provider account identifier - example: Quisquam recusandae nesciunt et. + example: Accusantium est. app_id: type: string description: Meta app ID - example: Perferendis et. + example: Dolorem similique sapiente. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quo ullam. + example: Expedita commodi sit. label: type: string description: Optional friendly name - example: Facilis dolor consectetur sed. + example: Quo porro. page_id: type: string description: Facebook page ID - example: Ut ea sequi quos qui quo et. + example: Pariatur esse. project_id: type: string description: Owning project - example: Occaecati hic ut magnam facilis. + example: Et porro saepe eius. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -6290,18 +6334,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8315950268383046552 + example: 8954046891574288398 format: int64 example: - account_id: Non consequuntur qui qui impedit assumenda voluptas. - app_id: Et nemo dicta illum omnis. - has_credentials: true - id: Beatae facilis dolor quod nihil quia. - label: Recusandae consequatur nulla. - page_id: Vel ut. - project_id: Sed voluptas fuga officia nulla. - status: error - version: 8342264622249142271 + account_id: Sed qui dolor illo facere ut voluptatem. + app_id: Perferendis placeat earum occaecati et. + has_credentials: false + id: Ea pariatur. + label: Nam repellat. + page_id: Rerum maiores in alias est laboriosam saepe. + project_id: Aut rem molestiae assumenda ea. + status: deleted + version: 8862716294143227386 required: - id - project_id @@ -6319,20 +6363,20 @@ components: app_id: type: string description: Meta app ID - example: Occaecati id ea sunt dolorem necessitatibus neque. + example: Et minima. label: type: string description: Optional friendly name - example: Consequatur hic voluptatem. + example: Voluptas quis nihil tempora rem asperiores. page_id: type: string description: Facebook page ID - example: Omnis quidem dolor ipsum voluptas. + example: Vero natus voluptatem. example: account_id: act_193556282970417 - app_id: Ab quasi tempora dolor. - label: Occaecati earum unde ut. - page_id: Non eum expedita non voluptas sit voluptatem. + app_id: Voluptas aliquid libero sapiente aspernatur fugit eum. + label: Quas qui aut rerum illum vero. + page_id: Et neque soluta. required: - account_id MetaAdsCredentials: @@ -6341,15 +6385,15 @@ components: access_token: type: string description: Meta access token - example: Fugiat aliquid aspernatur voluptatem in cupiditate. + example: Est placeat explicabo aliquid. app_secret: type: string description: Meta app secret - example: Et dolorem quod. + example: Tenetur ut. description: Meta Ads credential. Write-only; never returned. example: - access_token: Iusto fugit non asperiores quidem natus. - app_secret: Nostrum atque illum nesciunt adipisci odit corrupti. + access_token: Quo vel iste aut cum voluptatem. + app_secret: Et et aperiam. required: - access_token - app_secret @@ -6359,15 +6403,15 @@ components: account_id: type: string description: Provider account identifier - example: Aut omnis itaque ut vero voluptatibus. + example: Dolor ea iusto eveniet velit sint odit. customer_id: type: string description: Microsoft Advertising customer ID - example: Sequi non et. + example: Quam enim odio quia. etag: type: string description: ETag header value (mirrors version) - example: Voluptatibus voluptatem vero dolorem qui. + example: Cupiditate et esse voluptate optio quis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6375,15 +6419,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Non eos. + example: Et atque. label: type: string description: Optional friendly name - example: Enim voluptatem inventore quasi. + example: Aliquid explicabo eaque ab aut voluptas. project_id: type: string description: Owning project - example: Vel aut aliquam rerum et quidem. + example: Impedit velit omnis incidunt. status: type: string description: Connection status @@ -6396,18 +6440,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6330819027913820088 + example: 8220727981299951228 format: int64 example: - account_id: Aut est voluptatibus placeat. - customer_id: Deleniti placeat rerum. - etag: Expedita et velit accusamus. - has_credentials: false - id: Vero vel. - label: Necessitatibus quaerat minima a voluptatem ipsa et. - project_id: Quibusdam repellendus qui numquam. - status: inactive - version: 7624219269087359761 + account_id: Unde fuga voluptas ut vero. + customer_id: Velit dolorem. + etag: A pariatur omnis. + has_credentials: true + id: Commodi aspernatur. + label: Velit perferendis est ipsum aut voluptas. + project_id: Nostrum numquam illo. + status: active + version: 5290138330966618163 required: - id - project_id @@ -6422,31 +6466,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo veritatis nisi velit distinctio animi. + example: Soluta et quam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptas tenetur esse. + example: Voluptate est enim aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Architecto molestiae cum. + example: Eaque ut. label: type: string description: Optional friendly name - example: Sapiente perspiciatis dolores dignissimos soluta non vel. + example: Iste et alias quis magni ad. project_id: type: string description: Owning project - example: Perspiciatis consequatur beatae sunt officiis sequi qui. + example: Et aspernatur delectus rem sit. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6455,17 +6499,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8298836967576578537 + example: 2822393091615672408 format: int64 example: - account_id: Eveniet aliquid quia aut impedit a veritatis. - customer_id: Sunt debitis enim voluptas qui voluptas veniam. - has_credentials: false - id: Assumenda sed minima nihil. - label: Dolor molestiae quia voluptatem deserunt libero. - project_id: Quaerat ipsa voluptatem. - status: error - version: 5039507493953656552 + account_id: Velit atque nam voluptatem in eveniet. + customer_id: Totam ea ut voluptatem velit eos aut. + has_credentials: true + id: Sequi non consequatur est. + label: Occaecati repellendus autem ullam odio quis sed. + project_id: Beatae magni est officiis enim. + status: active + version: 7510768710450776293 required: - id - project_id @@ -6479,11 +6523,11 @@ components: account_id: type: string description: Provider account identifier - example: Dolor cumque dolores. + example: Itaque iure soluta autem. customer_id: type: string description: Microsoft Advertising customer ID - example: Neque aspernatur culpa sed non. + example: Odit numquam quia. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6491,15 +6535,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptas maxime non illo ab in voluptatem. + example: Est eum ut ut amet et molestiae. label: type: string description: Optional friendly name - example: Ad et in voluptatem et perspiciatis. + example: Qui quae qui optio. project_id: type: string description: Owning project - example: Est magnam molestiae soluta. + example: Nihil dolor exercitationem eum placeat dolores culpa. status: type: string description: Connection status @@ -6512,17 +6556,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 889781010736384145 + example: 3577746410602694753 format: int64 example: - account_id: Deleniti reprehenderit saepe quas commodi qui qui. - customer_id: Excepturi reiciendis numquam consequatur amet dolorem. + account_id: Ut unde dolore id. + customer_id: Dolorem ut aspernatur et ad. has_credentials: false - id: Ad cumque voluptas. - label: Non minima possimus totam occaecati enim eaque. - project_id: Facere rerum voluptatem saepe eligendi. - status: deleted - version: 2150669320812381725 + id: Aut dolores. + label: Atque qui dignissimos aut eaque eveniet. + project_id: Voluptatem beatae quis dignissimos voluptatem et labore. + status: active + version: 412346224570068154 required: - id - project_id @@ -6536,11 +6580,11 @@ components: account_id: type: string description: Provider account identifier - example: Soluta et quam. + example: Aut dolorem ea veniam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptate est enim aut. + example: Ullam dolor. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6548,19 +6592,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Eaque ut. + example: Magnam sequi esse at. label: type: string description: Optional friendly name - example: Iste et alias quis magni ad. + example: Assumenda cum nemo esse nobis. project_id: type: string description: Owning project - example: Et aspernatur delectus rem sit. + example: Vel aut rerum voluptatem ad minus. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6569,17 +6613,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2822393091615672408 + example: 6107904235260429813 format: int64 example: - account_id: Velit atque nam voluptatem in eveniet. - customer_id: Totam ea ut voluptatem velit eos aut. + account_id: Nihil deleniti dolores dignissimos perferendis tempore eum. + customer_id: Magnam saepe incidunt nisi. has_credentials: true - id: Sequi non consequatur est. - label: Occaecati repellendus autem ullam odio quis sed. - project_id: Beatae magni est officiis enim. - status: active - version: 7510768710450776293 + id: Eum et consequatur quis. + label: Consequatur dolor quia amet vero dolorum incidunt. + project_id: Enim nisi doloremque rerum. + status: deleted + version: 9143198940358453773 required: - id - project_id @@ -6593,19 +6637,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: In autem neque nihil laborum omnis. + example: Repudiandae facilis blanditiis libero nam. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptatem possimus veniam dignissimos consequatur. + example: Qui sed voluptatibus quam quia. label: type: string description: Optional friendly name - example: Neque maiores quo aliquam in rem. + example: Delectus blanditiis magnam sed iure amet. example: - account_id: Est porro eos ipsa quia. - customer_id: Quo repudiandae. - label: Delectus enim quas id porro. + account_id: Molestiae omnis doloremque. + customer_id: Perspiciatis modi dicta quae sed ut. + label: Deserunt et quidem sapiente. required: - account_id MicrosoftAdsCredentials: @@ -6614,25 +6658,25 @@ components: client_id: type: string description: OAuth client id - example: Doloremque dicta. + example: Aut est voluptatibus placeat. client_secret: type: string description: OAuth client secret - example: Ratione impedit recusandae dolor consequatur. + example: Pariatur perferendis explicabo expedita et velit accusamus. developer_token: type: string description: Microsoft Advertising developer token - example: Voluptatem beatae repellat veritatis perferendis veritatis. + example: Nulla eos. refresh_token: type: string description: OAuth refresh token - example: Vel temporibus sunt nulla esse sed. + example: Deleniti placeat rerum. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Facere sed ea qui pariatur adipisci. - client_secret: Enim esse dolores. - developer_token: Est perferendis eos et cumque nulla. - refresh_token: Iste exercitationem voluptate quia esse nihil sed. + client_id: Recusandae totam soluta. + client_secret: Praesentium libero. + developer_token: Quisquam animi. + refresh_token: Qui et assumenda quas. required: - client_id - client_secret @@ -6655,6 +6699,33 @@ components: required: - code - message + PlatformResult: + type: object + properties: + campaign_id: + type: string + description: Upstream platform campaign id (present when ok) + example: Magni atque amet omnis doloremque at. + error: + type: string + description: Failure reason (present when not ok) + example: Dolor et natus. + ok: + type: boolean + description: Whether the campaign was created (or reused) successfully + example: true + platform: + type: string + description: Platform this result is for + example: Nihil neque quod alias ipsum. + example: + campaign_id: Consequatur non eveniet esse officia explicabo dolor. + error: Aspernatur voluptatibus. + ok: true + platform: Cupiditate non exercitationem. + required: + - platform + - ok PreconditionFailedError: type: object properties: @@ -6695,11 +6766,11 @@ components: account_id: type: string description: Provider account identifier - example: Occaecati quaerat eum quia a excepturi. + example: Minima vitae illo cumque optio impedit. etag: type: string description: ETag header value (mirrors version) - example: Eos culpa quaerat culpa inventore aut molestiae. + example: Odit autem repellendus dicta qui vel. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6707,19 +6778,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Necessitatibus voluptatem incidunt et totam esse rerum. + example: Enim id. label: type: string description: Optional friendly name - example: Voluptatem incidunt cum. + example: Vel necessitatibus vel voluptates tenetur veniam repellat. project_id: type: string description: Owning project - example: Dolorem delectus. + example: Eveniet quia voluptatem impedit cumque doloribus. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -6728,17 +6799,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4898302691270586418 + example: 234140326367801793 format: int64 example: - account_id: Rerum eveniet nam sunt. - etag: Voluptatem quia ab recusandae praesentium nisi. - has_credentials: true - id: Hic quos inventore. - label: Ad dolorem et. - project_id: Id vel iusto optio repellendus. + account_id: Rerum non assumenda molestiae modi impedit. + etag: Aliquam voluptatibus assumenda mollitia molestias eos nobis. + has_credentials: false + id: Earum id consequatur. + label: Adipisci ipsa. + project_id: Dolorum id ut molestias. status: deleted - version: 4971099885577230620 + version: 948876280422508983 required: - id - project_id @@ -6753,7 +6824,7 @@ components: account_id: type: string description: Provider account identifier - example: Laudantium eligendi ut et. + example: Et natus possimus cupiditate. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6761,19 +6832,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolor et aliquam deleniti. + example: Eaque magni omnis dolorem. label: type: string description: Optional friendly name - example: Est dolor velit et voluptatem mollitia placeat. + example: Quae et perspiciatis numquam. project_id: type: string description: Owning project - example: Nemo cum delectus laudantium. + example: Assumenda quam possimus aut ipsa. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -6782,16 +6853,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7301828793581898625 + example: 6695567399746083998 format: int64 example: - account_id: Necessitatibus quia facere vitae aperiam velit corrupti. + account_id: Amet itaque aut. has_credentials: true - id: Iste iusto reiciendis ipsa ut saepe beatae. - label: Voluptas doloremque nobis consectetur voluptas voluptas. - project_id: Temporibus in qui provident corrupti ut similique. - status: deleted - version: 8091372322961997197 + id: Atque delectus ut. + label: Unde adipisci aut quisquam. + project_id: Eum non ut itaque. + status: inactive + version: 8672712817511304757 required: - id - project_id @@ -6805,7 +6876,7 @@ components: account_id: type: string description: Provider account identifier - example: Repellendus dolore expedita commodi sit omnis et. + example: Quas quia quam voluptate nam iste. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6813,19 +6884,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Deserunt minima quis impedit. + example: Et doloremque porro non. label: type: string description: Optional friendly name - example: Aut et ut dolorem tempore. + example: Dolores quo est ratione beatae totam. project_id: type: string description: Owning project - example: In voluptate debitis earum voluptates repellat. + example: Quis ab non. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -6834,16 +6905,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4154692188906674111 + example: 1807846651493588341 format: int64 example: - account_id: Pariatur esse. - has_credentials: false - id: Quo porro. - label: Molestias reprehenderit. - project_id: Accusantium est. - status: error - version: 1321629448594002998 + account_id: Molestiae veniam exercitationem blanditiis ratione non. + has_credentials: true + id: Temporibus aut numquam. + label: Enim velit voluptates officiis tempora possimus rerum. + project_id: Accusantium ut vitae dolor soluta beatae. + status: active + version: 8042484860326151968 required: - id - project_id @@ -6857,7 +6928,7 @@ components: account_id: type: string description: Provider account identifier - example: Facere ut voluptatem. + example: Quos provident. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6865,19 +6936,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ab ea pariatur deserunt. + example: Quia qui dicta. label: type: string description: Optional friendly name - example: Repellat sequi sed qui dolor. + example: Totam et voluptates atque consequatur consequuntur voluptates. project_id: type: string description: Owning project - example: Rem molestiae assumenda ea incidunt. + example: Commodi facere vel. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -6886,16 +6957,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8862716294143227386 + example: 413153877019026133 format: int64 example: - account_id: Assumenda quam possimus aut ipsa. + account_id: Incidunt deleniti. has_credentials: false - id: Rerum maiores in alias est laboriosam saepe. - label: Eaque magni omnis dolorem. - project_id: Perferendis placeat earum occaecati et. - status: inactive - version: 7088601354925466349 + id: Officiis modi quae consequatur voluptatem et. + label: Vero eum ea perspiciatis rerum. + project_id: Culpa veritatis ut adipisci minus. + status: active + version: 6279401977493721745 required: - id - project_id @@ -6913,10 +6984,10 @@ components: label: type: string description: Optional friendly name - example: Et neque soluta. + example: Numquam optio possimus velit quod. example: account_id: t2_gv9wtbfa - label: Voluptas aliquid libero sapiente aspernatur fugit eum. + label: Perspiciatis quam iste possimus ipsam. required: - account_id RedditAdsCredentials: @@ -6925,20 +6996,20 @@ components: client_id: type: string description: OAuth client id - example: Quo vel iste aut cum voluptatem. + example: Mollitia vel. client_secret: type: string description: OAuth client secret - example: Et et aperiam. + example: Ea eum. refresh_token: type: string description: OAuth refresh token - example: Voluptas quis nihil tempora rem asperiores. + example: Qui qui. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Vero natus voluptatem. - client_secret: Et minima. - refresh_token: Quas qui aut rerum illum vero. + client_id: Repudiandae quae aut. + client_secret: Tempore rem quo fuga accusantium voluptas ratione. + refresh_token: Esse et labore earum. required: - client_id - client_secret @@ -6967,10 +7038,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Ut voluptatum consequatur quos atque voluptates. - client_secret: Sit nostrum dolor. - developer_token: Ipsa dolorum est aut blanditiis. - refresh_token: Unde omnis facere quam sed rem quia. + client_id: Nihil quia omnis eaque aperiam eum. + client_secret: Quam et voluptatibus illum dolorem. + developer_token: Eum dolorum. + refresh_token: Et illo beatae soluta. required: - credentials SetCredentialHubspotRequestBody: @@ -6980,7 +7051,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Distinctio aut. + private_app_token: Aut natus. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -6990,7 +7061,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Quis et maxime ipsam voluptatem repudiandae laudantium. + access_token: Qui esse. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7000,8 +7071,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Quo sint dolorum vel. - app_secret: Consequatur omnis quidem est non tenetur. + access_token: Sed qui. + app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7011,9 +7082,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Totam rem harum. - client_secret: Provident quia laboriosam magnam unde. - refresh_token: Et sed nobis blanditiis. + client_id: Ea ipsam temporibus. + client_secret: Et necessitatibus dolorem ut. + refresh_token: Expedita accusantium dolorum qui sed fugiat. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7023,10 +7094,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Aperiam et ipsam vitae. - access_token_secret: Velit est quis aliquid aliquam. - consumer_key: Consequatur iste sed illo adipisci sunt. - consumer_secret: Soluta consectetur porro quo quia incidunt. + access_token: Numquam quia. + access_token_secret: Dolorem autem ipsa autem provident est. + consumer_key: Pariatur voluptas odit fuga illo. + consumer_secret: Sit ex commodi sapiente a illum. required: - credentials TwitterAdsConnection: @@ -7035,31 +7106,31 @@ components: account_id: type: string description: Provider account identifier - example: Dicta qui. + example: Quo repudiandae. etag: type: string description: ETag header value (mirrors version) - example: Consequatur voluptate dolorum id ut. + example: Vel aut aliquam rerum et quidem. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Id adipisci. + example: Enim voluptatem inventore quasi. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Vel necessitatibus vel voluptates tenetur veniam repellat. + example: Voluptatem possimus veniam dignissimos consequatur. label: type: string description: Optional friendly name - example: Aut repudiandae voluptatibus odit autem. + example: Est porro eos ipsa quia. project_id: type: string description: Owning project - example: Minima vitae illo cumque optio impedit. + example: Delectus enim quas id porro. status: type: string description: Connection status @@ -7072,18 +7143,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6671950557225375758 + example: 1500674714869504232 format: int64 example: - account_id: Vitae nemo sint et consequatur vel quisquam. - etag: Sint possimus. - funding_instrument_id: Dolorem neque hic voluptatem ad similique sunt. + account_id: Sequi non et. + etag: Quibusdam repellendus qui numquam. + funding_instrument_id: Necessitatibus quaerat minima a voluptatem ipsa et. has_credentials: true - id: Aut rerum non assumenda molestiae modi. - label: Voluptatibus assumenda mollitia molestias eos. - project_id: Vitae molestiae itaque autem. - status: error - version: 3850958169697422368 + id: Aut omnis itaque ut vero voluptatibus. + label: Vero dolorem qui. + project_id: Eum provident velit voluptatibus. + status: active + version: 3990374454753155356 required: - id - project_id @@ -7098,11 +7169,11 @@ components: account_id: type: string description: Provider account identifier - example: Ut itaque voluptatem unde adipisci aut. + example: Eius omnis id itaque. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Aut praesentium eos ex laborum et doloremque. + example: Perferendis placeat dolores. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7110,19 +7181,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Numquam numquam et natus possimus. + example: Quidem quibusdam officiis dolor. label: type: string description: Optional friendly name - example: Repudiandae eum. + example: Sint dolor eaque culpa. project_id: type: string description: Owning project - example: Provident molestiae quia neque atque delectus. + example: Nisi sunt. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -7131,17 +7202,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 9192676630235860462 + example: 1134950045517095139 format: int64 example: - account_id: Quas quia quam voluptate nam iste. - funding_instrument_id: Temporibus aut numquam. - has_credentials: true - id: Non laudantium quis ab non sunt. - label: Beatae totam. - project_id: Quo est. - status: active - version: 1807846651493588341 + account_id: Sint suscipit. + funding_instrument_id: Non neque optio. + has_credentials: false + id: Dolore voluptatem qui eveniet amet. + label: Voluptate et. + project_id: Qui pariatur odio reprehenderit nam. + status: deleted + version: 6078188127403523196 required: - id - project_id @@ -7155,11 +7226,11 @@ components: account_id: type: string description: Provider account identifier - example: Sed dolorum cupiditate quia qui dicta. + example: Quo veritatis nisi velit distinctio animi. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Quae totam et voluptates atque consequatur. + example: Voluptas tenetur esse. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7167,15 +7238,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Accusantium ut vitae dolor soluta beatae. + example: Architecto molestiae cum. label: type: string description: Optional friendly name - example: Molestiae veniam exercitationem blanditiis ratione non. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. project_id: type: string description: Owning project - example: Enim velit voluptates officiis tempora possimus rerum. + example: Perspiciatis consequatur beatae sunt officiis sequi qui. status: type: string description: Connection status @@ -7188,17 +7259,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2489572558350094249 + example: 8298836967576578537 format: int64 example: - account_id: Adipisci minus et vero. - funding_instrument_id: Occaecati incidunt deleniti sunt dolorem ea. + account_id: Eveniet aliquid quia aut impedit a veritatis. + funding_instrument_id: Sunt debitis enim voluptas qui voluptas veniam. has_credentials: false - id: Voluptates ab quos provident magni et. - label: Et culpa culpa veritatis. - project_id: Reprehenderit officiis modi quae consequatur. - status: inactive - version: 8208341011850859357 + id: Assumenda sed minima nihil. + label: Dolor molestiae quia voluptatem deserunt libero. + project_id: Quaerat ipsa voluptatem. + status: error + version: 5039507493953656552 required: - id - project_id @@ -7212,11 +7283,11 @@ components: account_id: type: string description: Provider account identifier - example: Eius omnis id itaque. + example: Dolor cumque dolores. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Perferendis placeat dolores. + example: Neque aspernatur culpa sed non. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7224,19 +7295,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quidem quibusdam officiis dolor. + example: Voluptas maxime non illo ab in voluptatem. label: type: string description: Optional friendly name - example: Sint dolor eaque culpa. + example: Ad et in voluptatem et perspiciatis. project_id: type: string description: Owning project - example: Nisi sunt. + example: Est magnam molestiae soluta. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -7245,17 +7316,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1134950045517095139 + example: 889781010736384145 format: int64 example: - account_id: Sint suscipit. - funding_instrument_id: Non neque optio. + account_id: Deleniti reprehenderit saepe quas commodi qui qui. + funding_instrument_id: Excepturi reiciendis numquam consequatur amet dolorem. has_credentials: false - id: Dolore voluptatem qui eveniet amet. - label: Voluptate et. - project_id: Qui pariatur odio reprehenderit nam. + id: Ad cumque voluptas. + label: Non minima possimus totam occaecati enim eaque. + project_id: Facere rerum voluptatem saepe eligendi. status: deleted - version: 6078188127403523196 + version: 2150669320812381725 required: - id - project_id @@ -7273,15 +7344,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Cumque perspiciatis quam. + example: Est perferendis eos et cumque nulla. label: type: string description: Optional friendly name - example: Iste numquam optio possimus velit. + example: Iste exercitationem voluptate quia esse nihil sed. example: account_id: 8r7gb - funding_instrument_id: Eveniet quia voluptatem impedit cumque doloribus. - label: Possimus ipsam perspiciatis enim id. + funding_instrument_id: In autem neque nihil laborum omnis. + label: Neque maiores quo aliquam in rem. required: - account_id TwitterAdsCredentials: @@ -7290,25 +7361,25 @@ components: access_token: type: string description: OAuth 1.0a access token - example: Ullam consequatur ut eveniet tempore est. + example: Hic voluptatem ad similique sunt ratione. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Iusto fugiat ad et. + example: Dicta et ratione impedit recusandae dolor. consumer_key: type: string description: OAuth 1.0a consumer key - example: Magni odio aut omnis vel. + example: Nemo sint et consequatur vel quisquam libero. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Iure ducimus voluptatem. + example: Eum et sint possimus omnis dolorem. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Necessitatibus tempore rem quo. - access_token_secret: Accusantium voluptas ratione dignissimos esse et labore. - consumer_key: Magnam cum veritatis mollitia vel velit. - consumer_secret: Eum perferendis qui qui soluta repudiandae quae. + access_token: Facere sed ea qui pariatur adipisci. + access_token_secret: Enim esse dolores. + consumer_key: Mollitia vel temporibus sunt nulla esse. + consumer_secret: Sunt voluptatem beatae repellat veritatis perferendis veritatis. required: - consumer_key - consumer_secret @@ -7321,9 +7392,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Reiciendis architecto atque maxime soluta dolorem ducimus. - config: Error similique. - status: Maxime fugiat illo. + campaign_name: Alias ullam fugiat deserunt sint nihil iusto. + config: Necessitatibus expedita. + status: Voluptas inventore sit. required: - campaign UpdateGoogleAdsRequestBody: @@ -7345,12 +7416,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Et et veritatis voluptas nobis. - brand_kit: Consequuntur omnis a dignissimos voluptate. - label: Non sint praesentium quia. - portal_id: Doloremque architecto ea et. - sender_email: Asperiores facere et exercitationem soluta possimus. - sender_name: Aliquid et in. + account_id: Velit labore non. + brand_kit: Dolorem sapiente. + label: Sit quibusdam nulla adipisci aperiam dolorem molestias. + portal_id: Odit est esse. + sender_email: Ea cum et magni adipisci magnam. + sender_name: Atque labore qui odio et corporis. required: - config UpdateLinkedinAdsRequestBody: @@ -7361,7 +7432,7 @@ components: example: config: account_id: "538170226" - label: Tempora error rerum quae nihil. + label: Et placeat. org_id: "208777" required: - config @@ -7373,9 +7444,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Vel blanditiis sunt ut facere. - label: Vero et voluptas accusamus sunt. - page_id: Rerum cupiditate. + app_id: Non praesentium voluptas saepe sit. + label: Aut assumenda unde occaecati eum tenetur nam. + page_id: Aliquid voluptatibus iste mollitia commodi libero atque. required: - config UpdateMicrosoftAdsRequestBody: @@ -7385,9 +7456,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Fugiat maxime labore illo. - customer_id: Provident quas repudiandae voluptatem vitae iste maxime. - label: Necessitatibus et autem doloribus. + account_id: Perferendis quia possimus dolore vel qui et. + customer_id: Vero quis consequuntur. + label: Accusantium aspernatur facere tempora voluptatem dicta rerum. required: - config UpdateRedditAdsRequestBody: @@ -7398,7 +7469,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Provident quia distinctio. + label: Aut sed fugiat adipisci eos. required: - config UpdateTwitterAdsRequestBody: @@ -7409,8 +7480,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Amet et eaque. - label: Aut sed quibusdam reiciendis qui vel. + funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. + label: Quaerat ut neque expedita nostrum. required: - config securitySchemes: diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index 122aa12b..19cd2efe 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -246,11 +246,22 @@ type JobPollResponse struct { // Job status Status string // Per-platform results, written once when the job reaches a terminal state - Result any + Result []*PlatformResult // Terminal error, if any Error *string } +type PlatformResult struct { + // Platform this result is for + Platform string + // Whether the campaign was created (or reused) successfully + OK bool + // Upstream platform campaign id (present when ok) + CampaignID *string + // Failure reason (present when not ok) + Error *string +} + // UpdateBriefPayload is the payload type of the lfx-v2-campaign-service-briefs // service update-brief method. type UpdateBriefPayload struct { diff --git a/internal/service/brief.go b/internal/service/brief.go index 2bfacbc4..2ccbd622 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -229,9 +229,28 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br } resp := &briefs.JobPollResponse{JobID: j.ID, Status: string(j.Status)} if len(j.Result) > 0 { - var result any - if json.Unmarshal(j.Result, &result) == nil { - resp.Result = result + // The stored result is the orchestrator's per-platform outcome array; decode + // it into the typed response shape so the OpenAPI contract is honored. + var stored []struct { + Platform string `json:"platform"` + OK bool `json:"ok"` + CampaignID string `json:"campaign_id"` + Error string `json:"error"` + } + if json.Unmarshal(j.Result, &stored) == nil { + resp.Result = make([]*briefs.PlatformResult, 0, len(stored)) + for _, r := range stored { + pr := &briefs.PlatformResult{Platform: r.Platform, OK: r.OK} + if r.CampaignID != "" { + id := r.CampaignID + pr.CampaignID = &id + } + if r.Error != "" { + e := r.Error + pr.Error = &e + } + resp.Result = append(resp.Result, pr) + } } } if j.Error != "" { diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index cf772664..8513b9cb 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -99,10 +99,20 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa // of calling the platform's create API again, which would spend money on // a duplicate. A not-found is the normal first-time path; a transient // lookup error is recorded as a failure rather than risking a duplicate. + // + // This read-before-dispatch check narrows — but does not fully close — + // the duplicate window: two concurrent create-campaigns requests for the + // same (brief, platform) can both observe not-found and both dispatch. + // The (brief_id, platform) unique index keeps persistence single-rowed, + // but the upstream create is not transactional with it. Fully closing + // this requires provider-side idempotency keys and single-flight job + // ownership, tracked with the job-recovery follow-up (see the goroutine + // lifecycle thread). campaign_id below is always the upstream platform id + // so the field's meaning is identical on the reuse and create paths. if existing, lerr := o.campaigns.GetCampaignByPlatform(gctx, brief.ID, p); lerr == nil { if existing.PlatformCampaignID != "" { res.OK = true - res.CampaignID = existing.ID + res.CampaignID = existing.PlatformCampaignID results[i] = res return nil } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 19287e84..72c749fd 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -7,6 +7,7 @@ import ( "context" "encoding/json" "errors" + "strings" "sync" "testing" "time" @@ -238,6 +239,14 @@ func TestOrchestrator_SkipsAlreadyDispatchedPlatform(t *testing.T) { if len(camps.upserted) != 0 { t.Errorf("upserted %d campaigns, want 0 (no re-create)", len(camps.upserted)) } + // The reuse path must report the upstream platform campaign id (not the DB + // row id), so campaign_id means the same thing as on the create path. + if !strings.Contains(string(j.Result), "pc-google-ads") { + t.Errorf("result = %s, want it to carry the upstream campaign id pc-google-ads", j.Result) + } + if strings.Contains(string(j.Result), "existing-c1") { + t.Errorf("result = %s, must not leak the DB row id existing-c1", j.Result) + } } // TestOrchestrator_TransientLookupErrorIsFailure verifies that a transient error From 904d5e5a1a759c9c295fbb32f0ac2343286945b5 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 17:08:26 -0700 Subject: [PATCH 10/46] =?UTF-8?q?fix(review):=20round-3=20Copilot=20findin?= =?UTF-8?q?gs=20=E2=80=94=20UUID=20validation,=20approval=20concurrency,?= =?UTF-8?q?=20credential-log=20leak=20(PR=20#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Validate brief_id/campaign_id/job_id path params as UUIDs (Format(UUID)), so a malformed id returns 400 instead of a PostgreSQL cast error mapped to 500. project_id stays TEXT (slug-or-UUID). - Make brief approval version-gated: approve-brief now takes If-Match and Approve() gates on version, so a brief replaced since the approver fetched it can't be approved on stale content (428 missing / 412 mismatch). - Stop applying debug.LogPayloads to the health/connection/brief endpoints: every authenticated payload carries a BearerToken and connection create/set-credential payloads carry plaintext provider credentials, so DEBUG would leak secrets into logs. debug.HTTP (headers/status, no decoded payload) is retained. - Reconcile api-catalog: PlatformResult documented; the stale CampaignCreateResult section marked as the future richer shape (not the current payload) so it no longer contradicts JobPollResponse. Tests: approve version-gating (428/412/happy). gen/ regenerated; go build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 836 +++--- .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 2626 +++++++++-------- cmd/campaign-service/server.go | 15 +- design/brief.go | 12 +- docs/api-catalog.md | 10 +- docs/knowledge/log.md | 9 + gen/http/cli/lfx_v2_campaign_service/cli.go | 67 +- .../client/cli.go | 62 +- .../client/encode_decode.go | 34 + .../client/types.go | 66 + .../server/encode_decode.go | 72 +- .../server/types.go | 45 +- .../client/cli.go | 40 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 836 +++--- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 2626 +++++++++-------- gen/lfx_v2_campaign_service_briefs/client.go | 2 + gen/lfx_v2_campaign_service_briefs/service.go | 2 + internal/domain/brief_port.go | 6 +- .../infrastructure/postgres/brief_repo.go | 19 +- internal/service/brief.go | 8 +- internal/service/brief_test.go | 40 +- 25 files changed, 3950 insertions(+), 3491 deletions(-) diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index 5daf0890..b95b913e 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui alias ea."},"event_details":{"description":"Extracted event/course details","example":"Eos nesciunt ipsum et delectus dolorum."},"event_slug":{"type":"string","description":"Event/course slug","example":"Adipisci quaerat est nobis."},"id":{"type":"string","description":"Brief UUID","example":"Repellendus quo quidem."},"keywords":{"description":"Keyword list","example":"Tempore maxime."},"platforms":{"type":"array","items":{"type":"string","example":"Et veritatis quisquam sed ratione et."},"description":"Suggested default platforms","example":["Molestiae eos.","Aut iusto quos impedit eos.","Adipisci rerum consequatur placeat ea odio."]},"program_type":{"type":"string","description":"Funnel context","example":"Illum rerum error incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Cumque totam nulla aut reprehenderit."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Porro enim dolorum nobis."},"url":{"type":"string","description":"Event/course page URL","example":"Fugit non fuga rem adipisci."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6324133014862191516,"format":"int64"}},"example":{"copy":"Aut facilis porro dolor ipsa velit.","event_details":"Ut mollitia tempora minima voluptas quod.","event_slug":"Aperiam voluptates.","id":"Magnam pariatur explicabo est.","keywords":"Hic quis facere exercitationem.","platforms":["Aut perferendis natus.","Eaque ipsam harum nisi nobis et et.","Excepturi corporis ut.","Odio eius sed qui deserunt perspiciatis."],"program_type":"Adipisci ullam pariatur ex voluptas.","project_id":"Qui praesentium ipsam officiis cum ipsum recusandae.","status":"archived","targeting":"Exercitationem aut eaque.","url":"Vero ducimus.","version":5743767113243123162},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Commodi dicta."},"event_details":{"description":"Extracted event/course details","example":"Consequatur non cumque laudantium quod modi voluptas."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Accusamus et provident provident."},"keywords":{"description":"Keyword list","example":"Ad non."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Dolores voluptatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Odit iusto ad animi eos doloribus autem."}},"example":{"copy":"Quos accusantium fugit.","event_details":"Et expedita itaque quos.","event_slug":"Consequatur est unde nihil.","keywords":"Excepturi saepe sit vel perspiciatis neque.","platforms":["Qui eveniet laboriosam possimus.","Facere velit dolores eligendi.","Ad voluptatem.","Tempore impedit."],"program_type":"education","targeting":"Qui molestias.","url":"Laudantium quod est voluptas sequi voluptatem."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Nihil dolore suscipit reprehenderit et aut animi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Et aut consequatur inventore enim reiciendis."},"id":{"type":"string","description":"Campaign UUID","example":"Aut molestiae exercitationem et impedit at."},"platform":{"type":"string","description":"Channel","example":"Ullam omnis autem."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Id laboriosam nihil ea."},"project_id":{"type":"string","description":"Owning project","example":"Quisquam perferendis autem ut alias."},"status":{"type":"string","description":"Campaign status","example":"Neque ut rerum facilis quia molestiae ratione."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3905678301175813319,"format":"int64"}},"example":{"brief_id":"Consequatur qui molestiae velit ratione nesciunt et.","campaign_name":"Enim qui officia id necessitatibus mollitia soluta.","id":"Provident officia officiis.","platform":"Rerum ut necessitatibus illum ratione.","platform_campaign_id":"Mollitia atque atque dolores accusantium non dolor.","project_id":"Ut mollitia accusantium dignissimos.","status":"Nobis labore dicta.","version":6819175354933615501},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Sunt totam incidunt sunt id ipsa."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["linkedin-ads","hubspot","meta-ads","meta-ads"]}},"example":{"config":"Voluptatibus aut.","platforms":["hubspot","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Incidunt qui aut tempora dolor sequi quia."},"config":{"description":"Campaign configuration snapshot","example":"Culpa iste."},"status":{"type":"string","description":"Campaign status","example":"Consequatur velit odio."}},"example":{"campaign_name":"Sit incidunt.","config":"Qui quisquam voluptatibus sint quia.","status":"Officiis est."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Sunt assumenda."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Officia eligendi tempore provident dicta temporibus debitis.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est officia et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit in recusandae maiores et voluptatem voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ex quo praesentium voluptas."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Eos et architecto voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Mollitia omnis doloribus qui consequatur et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5274458285620360301,"format":"int64"}},"example":{"account_id":"Nihil nihil quae porro qui rem autem.","has_credentials":true,"id":"Vel natus provident.","label":"Ut non error aut et fuga.","login_customer_id":"Vitae perspiciatis eveniet quibusdam nobis ut asperiores.","project_id":"Perspiciatis id.","status":"deleted","version":4918506778223386612},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quis dicta voluptate aut in corporis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Nobis soluta."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Vitae accusantium excepturi deleniti voluptas."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut enim et."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Laboriosam non id temporibus et provident.","client_secret":"Neque quis illo minima.","developer_token":"Earum eligendi.","refresh_token":"Vel quae laudantium amet veritatis rerum itaque."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt repellendus corrupti itaque quo sit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Perspiciatis porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Omnis nobis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Eum et ipsum expedita reprehenderit eos."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum tempore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolorum ut architecto deleniti nostrum."},"sender_name":{"type":"string","description":"Default sender name","example":"Aperiam et nihil."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6605548766358472787,"format":"int64"}},"example":{"account_id":"Aperiam quos perferendis nisi blanditiis eveniet.","brand_kit":"Optio labore omnis.","has_credentials":true,"id":"Distinctio amet enim.","label":"Deserunt quod.","portal_id":"Corporis dolorum consequatur eius perferendis.","project_id":"Rem error.","sender_email":"Omnis vel voluptate necessitatibus enim et et.","sender_name":"Sunt omnis mollitia aut rerum quis et.","status":"active","version":7462268971443661923},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Rem ab corporis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Eaque dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil aut rerum est vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Non dolorem."},"sender_email":{"type":"string","description":"Default sender address","example":"Porro et."},"sender_name":{"type":"string","description":"Default sender name","example":"Dolor aut assumenda fugiat."}},"example":{"account_id":"Aut quas suscipit eos.","brand_kit":"Dolor et corrupti voluptas neque vitae.","label":"Inventore alias error aut maxime dicta.","portal_id":"Ipsa rerum velit et impedit.","sender_email":"Quaerat labore dolor.","sender_name":"Velit quam omnis."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Omnis autem accusamus."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Est assumenda aut."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Molestiae minus dolor accusantium."},"platforms":{"type":"array","items":{"type":"string","example":"Molestias fuga voluptatibus quis adipisci."},"description":"Platforms this job will create on","example":["Ut blanditiis dolor modi nobis aliquid.","Consequatur officiis velit quasi dolores assumenda.","Mollitia fugiat dolore similique et.","Voluptates quaerat molestiae."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Cum porro architecto doloremque aperiam doloribus aut.","platforms":["Cumque iure veritatis cumque nisi.","Distinctio ipsum ab.","Natus placeat esse est in deserunt aliquid."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Distinctio voluptas ut ut nisi."},"job_id":{"type":"string","description":"Job UUID","example":"Tempore nemo illum ut maiores."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}]},"status":{"type":"string","description":"Job status","example":"partial","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Et atque dolor odio labore pariatur.","job_id":"Nostrum velit hic excepturi omnis reprehenderit distinctio.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"queued"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"At odio incidunt distinctio sint qui."},"label":{"type":"string","description":"Optional friendly name","example":"Cumque saepe sint quidem odio ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Esse praesentium voluptatibus deserunt aliquam."},"project_id":{"type":"string","description":"Owning project","example":"Quis quis reprehenderit non quae omnis qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1342488242351916696,"format":"int64"}},"example":{"account_id":"Necessitatibus magni et molestiae.","has_credentials":true,"id":"Eos ut et eligendi.","label":"Est et eum est.","org_id":"Dolorum quas.","project_id":"Numquam dolorum consequatur.","status":"active","version":6946177746341876830},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nulla fuga fugit repellendus et accusamus sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Sequi error.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quam deleniti et et."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Quia aperiam sunt est labore."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus voluptatem iste nisi in."},"app_id":{"type":"string","description":"Meta app ID","example":"Iste qui rerum est sed sed similique."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut est rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"page_id":{"type":"string","description":"Facebook page ID","example":"Dolor occaecati earum iusto rerum sit cupiditate."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3681253484013323435,"format":"int64"}},"example":{"account_id":"Qui quidem exercitationem.","app_id":"Necessitatibus laudantium est ut.","has_credentials":false,"id":"Ea maiores quidem molestiae deleniti omnis.","label":"Nostrum corporis quasi magnam.","page_id":"Architecto quas eligendi impedit qui sed.","project_id":"Expedita voluptatum commodi fuga ipsa.","status":"active","version":8272760528024179326},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Exercitationem illum et quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Neque facilis est qui possimus eligendi."},"page_id":{"type":"string","description":"Facebook page ID","example":"Possimus et corrupti et nobis voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Quia quisquam corrupti distinctio voluptas eius.","label":"Est facilis qui.","page_id":"Modi ut culpa excepturi blanditiis."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Autem est est distinctio sunt aliquid harum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Nam rerum eaque eius."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Rerum illo mollitia odio et dolor.","app_secret":"Consectetur sint error ipsam maiores."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et rerum in expedita."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Consequatur dolore unde illum."},"label":{"type":"string","description":"Optional friendly name","example":"Quo veritatis quis delectus est."},"project_id":{"type":"string","description":"Owning project","example":"Dolores tenetur ut illum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4673192311933251173,"format":"int64"}},"example":{"account_id":"Aperiam cum possimus.","customer_id":"Omnis sed dolore dolorem voluptatibus quod.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Ullam ab suscipit et labore harum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Deleniti doloribus debitis assumenda dignissimos."},"label":{"type":"string","description":"Optional friendly name","example":"Non iste ad rem quidem sunt qui."}},"example":{"account_id":"Quisquam quam officiis aut.","customer_id":"Architecto ut unde.","label":"Vitae aut ea."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sapiente possimus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Voluptates atque."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Eaque voluptate reprehenderit sed voluptatem sed illo."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Cum nisi numquam.","client_secret":"Id unde veritatis officiis aut fugiat.","developer_token":"Quo corporis recusandae dicta quibusdam.","refresh_token":"Ut commodi et voluptas tenetur nobis facere."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Sed sit repudiandae aut aut."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolores vel dolorum minus voluptatem."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"Enim temporibus."}},"example":{"campaign_id":"Qui culpa deleniti.","error":"Et atque enim quis sed.","ok":true,"platform":"Architecto itaque doloribus voluptatem consequatur quis fugiat."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facilis suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Non sint inventore iste iure ut."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis deleniti."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4582993025544492856,"format":"int64"}},"example":{"account_id":"Expedita dignissimos non sed omnis officiis et.","has_credentials":false,"id":"Ad inventore voluptatum eligendi quasi.","label":"Velit dolores omnis placeat unde distinctio ducimus.","project_id":"Ipsa et dolore.","status":"active","version":4526728339972318921},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Enim repellendus magni repudiandae inventore."}},"example":{"account_id":"t2_gv9wtbfa","label":"Corrupti repellat eius ut qui nobis."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Delectus quam et eos."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Rem aut fuga."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Est dolor ut corporis."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Cupiditate ut illo dolor quaerat totam.","client_secret":"Illo vitae occaecati omnis.","refresh_token":"Pariatur debitis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eum et sint corrupti eos."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Qui unde dicta autem dolorem qui explicabo."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo possimus consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque autem ex eos."},"project_id":{"type":"string","description":"Owning project","example":"Quos hic doloribus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4374149818121411294,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","funding_instrument_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Repellat non suscipit veritatis sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim accusantium labore esse numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Dolorum deserunt.","label":"Non laudantium sunt minima repudiandae illo harum."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Saepe voluptatem reiciendis pariatur."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Et ut quis ut."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Sit dolor sunt eos nihil ipsam."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Odio totam cum deleniti placeat fuga."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Aut autem sint minus voluptatum.","access_token_secret":"Tempore quae.","consumer_key":"Iusto omnis.","consumer_secret":"Quia cum non."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index 35626754..63414314 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -111,6 +111,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -188,6 +189,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -291,6 +293,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -356,11 +359,17 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall required: false type: string + - name: If-Match + in: header + description: Version being approved (ETag); approval is rejected if the brief changed + required: false + type: string responses: "200": description: OK response. @@ -398,6 +407,20 @@ paths: required: - code - message + "412": + description: Precondition Failed response. + schema: + $ref: '#/definitions/PreconditionFailedError' + required: + - code + - message + "428": + description: Precondition Required response. + schema: + $ref: '#/definitions/PreconditionRequiredError' + required: + - code + - message "500": description: Internal Server Error response. schema: @@ -434,6 +457,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -511,11 +535,13 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: campaign_id in: path description: Campaign UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -594,11 +620,13 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: campaign_id in: path description: Campaign UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -3350,6 +3378,7 @@ paths: description: Job UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -3428,76 +3457,74 @@ definitions: properties: copy: description: Ad copy - example: Qui alias ea. + example: Molestiae est accusantium laudantium nostrum. event_details: description: Extracted event/course details - example: Eos nesciunt ipsum et delectus dolorum. + example: Non quo necessitatibus. event_slug: type: string description: Event/course slug - example: Adipisci quaerat est nobis. + example: Facere qui omnis. id: type: string description: Brief UUID - example: Repellendus quo quidem. + example: Beatae harum similique corporis id eum. keywords: description: Keyword list - example: Tempore maxime. + example: Dolores sit. platforms: type: array items: type: string - example: Et veritatis quisquam sed ratione et. + example: Beatae quia qui excepturi minima. description: Suggested default platforms example: - - Molestiae eos. - - Aut iusto quos impedit eos. - - Adipisci rerum consequatur placeat ea odio. + - Natus a. + - Quod sunt quae et nesciunt iure quis. + - Ut mollitia nihil ducimus. program_type: type: string description: Funnel context - example: Illum rerum error incidunt. + example: Facilis qui libero. project_id: type: string description: Owning project - example: Cumque totam nulla aut reprehenderit. + example: Et itaque rem eos et deleniti dolores. status: type: string description: Lifecycle status - example: draft + example: approved enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Porro enim dolorum nobis. + example: Exercitationem accusantium nihil. url: type: string description: Event/course page URL - example: Fugit non fuga rem adipisci. + example: Enim vitae officia dolorem odio. version: type: integer description: Optimistic-concurrency version - example: 6324133014862191516 + example: 8012662392626135551 format: int64 example: - copy: Aut facilis porro dolor ipsa velit. - event_details: Ut mollitia tempora minima voluptas quod. - event_slug: Aperiam voluptates. - id: Magnam pariatur explicabo est. - keywords: Hic quis facere exercitationem. + copy: Sed veniam dolores quidem necessitatibus voluptatem. + event_details: Earum minus autem omnis qui debitis eum. + event_slug: Modi possimus consequatur. + id: Ipsum voluptates pariatur magni atque. + keywords: Sit reiciendis et vel beatae molestiae. platforms: - - Aut perferendis natus. - - Eaque ipsam harum nisi nobis et et. - - Excepturi corporis ut. - - Odio eius sed qui deserunt perspiciatis. - program_type: Adipisci ullam pariatur ex voluptas. - project_id: Qui praesentium ipsam officiis cum ipsum recusandae. - status: archived - targeting: Exercitationem aut eaque. - url: Vero ducimus. - version: 5743767113243123162 + - Aspernatur illo accusamus. + - Cupiditate mollitia hic vel ut. + program_type: Sit cupiditate non. + project_id: Omnis doloremque at fugit dolor et. + status: approved + targeting: Natus vitae consequatur eos sit aut ut. + url: Eveniet esse officia explicabo dolor deserunt. + version: 6761108389050444243 required: - id - project_id @@ -3511,56 +3538,53 @@ definitions: properties: copy: description: Ad copy - example: Commodi dicta. + example: Vel inventore aliquid aut non eligendi accusamus. event_details: description: Extracted event/course details - example: Consequatur non cumque laudantium quod modi voluptas. + example: Explicabo repudiandae aut reiciendis recusandae molestias. event_slug: type: string description: Event/course slug (unique within the project) - example: Accusamus et provident provident. + example: Eos labore quia esse consectetur tenetur. keywords: description: Keyword list - example: Ad non. + example: Quod impedit accusamus incidunt minus veritatis enim. platforms: type: array items: type: string - example: Sed voluptatum laborum. + example: Et recusandae possimus. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Quas sunt eos nulla et perferendis qui. - - Aut reiciendis ullam laborum. - - Et quidem nisi quasi. - - Ab deserunt quia magnam temporibus minus et. + - Praesentium voluptate. + - Qui impedit temporibus eveniet eos omnis cumque. + - Ipsam ut sed natus et unde. program_type: type: string description: Funnel context - example: events + example: education enum: - events - education - membership targeting: description: Targeting recommendation - example: Dolores voluptatibus. + example: Hic est quia pariatur odit ullam. url: type: string description: Event/course page URL - example: Odit iusto ad animi eos doloribus autem. + example: Aliquam aut ut sit nisi architecto iure. example: - copy: Quos accusantium fugit. - event_details: Et expedita itaque quos. - event_slug: Consequatur est unde nihil. - keywords: Excepturi saepe sit vel perspiciatis neque. + copy: In aut nam rerum. + event_details: Quae qui inventore dolorem deserunt. + event_slug: Id corrupti sed quo perferendis nemo. + keywords: Distinctio magnam. platforms: - - Qui eveniet laboriosam possimus. - - Facere velit dolores eligendi. - - Ad voluptatem. - - Tempore impedit. - program_type: education - targeting: Qui molestias. - url: Laudantium quod est voluptas sequi voluptatem. + - Voluptatem nihil quaerat asperiores pariatur. + - Vel veritatis hic rerum accusamus velit error. + program_type: membership + targeting: Architecto deserunt vero ducimus distinctio. + url: Quisquam nisi repellendus quos magnam aut. required: - program_type - event_slug @@ -3571,45 +3595,45 @@ definitions: brief_id: type: string description: Parent brief - example: Nihil dolore suscipit reprehenderit et aut animi. + example: Et dolorem quod. campaign_name: type: string description: Campaign name - example: Et aut consequatur inventore enim reiciendis. + example: Consequatur hic voluptatem. id: type: string description: Campaign UUID - example: Aut molestiae exercitationem et impedit at. + example: Placeat et minus et. platform: type: string description: Channel - example: Ullam omnis autem. + example: Iusto fugit non asperiores quidem natus. platform_campaign_id: type: string description: ID returned by the ad platform - example: Id laboriosam nihil ea. + example: Nostrum atque illum nesciunt adipisci odit corrupti. project_id: type: string description: Owning project - example: Quisquam perferendis autem ut alias. + example: Fugiat aliquid aspernatur voluptatem in cupiditate. status: type: string description: Campaign status - example: Neque ut rerum facilis quia molestiae ratione. + example: Omnis quidem dolor ipsum voluptas. version: type: integer description: Optimistic-concurrency version - example: 3905678301175813319 + example: 3737008917467127208 format: int64 example: - brief_id: Consequatur qui molestiae velit ratione nesciunt et. - campaign_name: Enim qui officia id necessitatibus mollitia soluta. - id: Provident officia officiis. - platform: Rerum ut necessitatibus illum ratione. - platform_campaign_id: Mollitia atque atque dolores accusantium non dolor. - project_id: Ut mollitia accusantium dignissimos. - status: Nobis labore dicta. - version: 6819175354933615501 + brief_id: Ut sint non eum expedita non. + campaign_name: Doloribus voluptas mollitia doloremque totam. + id: Id ea. + platform: Sit voluptatem ad ab. + platform_campaign_id: Tempora dolor quis totam hic quibusdam eveniet. + project_id: Dolorem necessitatibus neque consectetur occaecati earum. + status: Veniam et ducimus quos amet. + version: 1836828122944842672 required: - id - project_id @@ -3624,7 +3648,7 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Sunt totam incidunt sunt id ipsa. + example: Nobis nam velit quis rem. platforms: type: array items: @@ -3640,15 +3664,14 @@ definitions: - hubspot description: Platforms to create campaigns on (binding selection) example: - - linkedin-ads - - hubspot - - meta-ads - meta-ads + - google-ads + - reddit-ads example: - config: Voluptatibus aut. + config: Architecto quae error. platforms: - - hubspot - - microsoft-ads + - reddit-ads + - twitter-ads required: - platforms CampaignUpdateInput: @@ -3658,18 +3681,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Incidunt qui aut tempora dolor sequi quia. + example: Doloremque commodi rerum esse. config: description: Campaign configuration snapshot - example: Culpa iste. + example: Laudantium quia. status: type: string description: Campaign status - example: Consequatur velit odio. + example: Omnis totam eos non. example: - campaign_name: Sit incidunt. - config: Qui quisquam voluptatibus sint quia. - status: Officiis est. + campaign_name: Maxime recusandae. + config: Laudantium error sit nihil iure officiis nemo. + status: Accusamus debitis explicabo praesentium. required: - campaign_name - status @@ -3718,14 +3741,14 @@ definitions: message: type: string description: Human-readable detail - example: Sunt assumenda. + example: Est omnis iusto fugiat ad et ipsa. ok: type: boolean description: Whether the credential authenticated against the provider - example: true + example: false example: - message: Officia eligendi tempore provident dicta temporibus debitis. - ok: false + message: Veritatis mollitia. + ok: true required: - ok GoogleAdsConnection: @@ -3735,31 +3758,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Est officia et. + example: Vero ut et neque soluta distinctio voluptas. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Velit in recusandae maiores et voluptatem voluptatem. + example: Rem asperiores eligendi vero. label: type: string description: Optional friendly name - example: Ex quo praesentium voluptas. + example: Facere quas qui aut rerum. login_customer_id: type: string description: Manager account used for API access - example: Eos et architecto voluptas. + example: Fugit eum. project_id: type: string description: Owning project - example: Mollitia omnis doloribus qui consequatur et. + example: Voluptatem fugiat et. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -3768,17 +3791,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 5274458285620360301 + example: 5717670313645740058 format: int64 example: - account_id: Nihil nihil quae porro qui rem autem. + account_id: Occaecati quaerat eum quia a excepturi. has_credentials: true - id: Vel natus provident. - label: Ut non error aut et fuga. - login_customer_id: Vitae perspiciatis eveniet quibusdam nobis ut asperiores. - project_id: Perspiciatis id. + id: Necessitatibus voluptatem incidunt et totam esse rerum. + label: Voluptatem incidunt cum. + login_customer_id: Eos culpa quaerat culpa inventore aut molestiae. + project_id: Dolorem delectus. status: deleted - version: 4918506778223386612 + version: 4898302691270586418 required: - id - project_id @@ -3815,25 +3838,25 @@ definitions: client_id: type: string description: OAuth client id - example: Quis dicta voluptate aut in corporis. + example: Id vel iusto optio repellendus. client_secret: type: string description: OAuth client secret - example: Nobis soluta. + example: Ad dolorem et. developer_token: type: string description: Google Ads developer token - example: Vitae accusantium excepturi deleniti voluptas. + example: Rerum eveniet nam sunt. refresh_token: type: string description: OAuth refresh token - example: Aut enim et. + example: Hic quos inventore. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Laboriosam non id temporibus et provident. - client_secret: Neque quis illo minima. - developer_token: Earum eligendi. - refresh_token: Vel quae laudantium amet veritatis rerum itaque. + client_id: Nisi est magni odio aut. + client_secret: Vel omnis iure. + developer_token: Voluptatem doloremque ullam consequatur ut. + refresh_token: Inventore impedit unde voluptatem quia ab recusandae. required: - refresh_token - client_id @@ -3846,39 +3869,39 @@ definitions: account_id: type: string description: Provider account identifier - example: Deserunt repellendus corrupti itaque quo sit. + example: Incidunt voluptas non necessitatibus. brand_kit: type: string description: Per-project brand kit selector - example: Perspiciatis porro. + example: Provident porro. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Blanditiis mollitia dolores illo nostrum magnam. + example: Qui nemo nihil dolorum consequatur. label: type: string description: Optional friendly name - example: Omnis nobis. + example: Est ea sed sit. portal_id: type: string description: HubSpot portal/account ID - example: Eum et ipsum expedita reprehenderit eos. + example: Deserunt nostrum consectetur et sed praesentium libero. project_id: type: string description: Owning project - example: Nostrum tempore. + example: Tempora qui eum hic vel aspernatur at. sender_email: type: string description: Default sender address - example: Dolorum ut architecto deleniti nostrum. + example: Qui minima in nulla sunt autem eos. sender_name: type: string description: Default sender name - example: Aperiam et nihil. + example: Provident dicta tenetur voluptatem voluptate dolor. status: type: string description: Connection status @@ -3891,20 +3914,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6605548766358472787 + example: 5710646536103854438 format: int64 example: - account_id: Aperiam quos perferendis nisi blanditiis eveniet. - brand_kit: Optio labore omnis. + account_id: Est quis impedit. + brand_kit: Dolor quam dolor consectetur eos iste. has_credentials: true - id: Distinctio amet enim. - label: Deserunt quod. - portal_id: Corporis dolorum consequatur eius perferendis. - project_id: Rem error. - sender_email: Omnis vel voluptate necessitatibus enim et et. - sender_name: Sunt omnis mollitia aut rerum quis et. - status: active - version: 7462268971443661923 + id: Odio sunt esse mollitia incidunt. + label: Veritatis itaque. + portal_id: Consequatur eligendi eum necessitatibus alias. + project_id: Dolores laborum sed. + sender_email: Ut aperiam voluptate voluptates. + sender_name: Sapiente molestiae dolorum repellat expedita ut. + status: inactive + version: 6098388766312520476 required: - id - project_id @@ -3919,34 +3942,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Rem ab corporis. + example: Veniam iusto consequatur quia sed officia eligendi. brand_kit: type: string description: Per-project brand kit selector - example: Eaque dolor. + example: Veniam delectus repellendus omnis. label: type: string description: Optional friendly name - example: Nihil aut rerum est vel. + example: Praesentium et. portal_id: type: string description: HubSpot portal/account ID - example: Non dolorem. + example: Qui impedit. sender_email: type: string description: Default sender address - example: Porro et. + example: Ea alias. sender_name: type: string description: Default sender name - example: Dolor aut assumenda fugiat. + example: Reprehenderit dignissimos aut velit quis at sint. example: - account_id: Aut quas suscipit eos. - brand_kit: Dolor et corrupti voluptas neque vitae. - label: Inventore alias error aut maxime dicta. - portal_id: Ipsa rerum velit et impedit. - sender_email: Quaerat labore dolor. - sender_name: Velit quam omnis. + account_id: Quo necessitatibus necessitatibus. + brand_kit: Repudiandae tenetur aperiam saepe vel. + label: Amet cum. + portal_id: Sint dicta. + sender_email: Omnis voluptatem rerum praesentium. + sender_name: Blanditiis non totam temporibus. required: - account_id HubspotCredentials: @@ -3956,10 +3979,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Omnis autem accusamus. + example: Animi sit esse ratione aliquid. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Est assumenda aut. + private_app_token: Laborum est quasi dignissimos. required: - private_app_token InternalServerError: @@ -3988,18 +4011,18 @@ definitions: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Molestiae minus dolor accusantium. + example: Quia magni aut nisi est. platforms: type: array items: type: string - example: Molestias fuga voluptatibus quis adipisci. + example: Est sed. description: Platforms this job will create on example: - - Ut blanditiis dolor modi nobis aliquid. - - Consequatur officiis velit quasi dolores assumenda. - - Mollitia fugiat dolore similique et. - - Voluptates quaerat molestiae. + - Dolorem necessitatibus illum. + - Ex ipsa nihil esse voluptate in consectetur. + - Culpa quaerat. + - Sed voluptatum et impedit quod rem. status: type: string description: Initial status (always 'queued' on create) @@ -4007,11 +4030,11 @@ definitions: enum: - queued example: - job_id: Cum porro architecto doloremque aperiam doloribus aut. + job_id: Omnis corrupti facere eum aliquid est repellat. platforms: - - Cumque iure veritatis cumque nisi. - - Distinctio ipsum ab. - - Natus placeat esse est in deserunt aliquid. + - Id incidunt mollitia non sed. + - Minima est distinctio accusamus. + - Perferendis culpa voluptatem nostrum eaque deleniti. status: queued required: - job_id @@ -4023,29 +4046,33 @@ definitions: error: type: string description: Terminal error, if any - example: Distinctio voluptas ut ut nisi. + example: Ut voluptatem. job_id: type: string description: Job UUID - example: Tempore nemo illum ut maiores. + example: Molestias ducimus id. result: type: array items: $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. + ok: false + platform: Consequatur et dignissimos ex quo praesentium voluptas. status: type: string description: Job status - example: partial + example: queued enum: - queued - running @@ -4053,26 +4080,22 @@ definitions: - partial - failed example: - error: Et atque dolor odio labore pariatur. - job_id: Nostrum velit hic excepturi omnis reprehenderit distinctio. + error: Aperiam facere voluptas quis nihil. + job_id: Vel iste aut cum voluptatem. result: - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. - ok: false - platform: Dolor molestias ipsa dolorum est. - status: queued + platform: Consequatur et dignissimos ex quo praesentium voluptas. + status: partial required: - job_id - status @@ -4084,17 +4107,18 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. required: - brief LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: @@ -4105,10 +4129,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Vitae reiciendis voluptatem. + config: Adipisci consequuntur omnis a. platforms: - reddit-ads - - microsoft-ads + - meta-ads + - google-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4119,17 +4144,18 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. required: - brief LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: @@ -4140,9 +4166,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Alias ullam fugiat deserunt sint nihil iusto. - config: Necessitatibus expedita. - status: Voluptas inventore sit. + campaign_name: Itaque quos voluptatibus quos accusantium fugit. + config: Qui molestias. + status: Excepturi saepe sit vel perspiciatis neque. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4159,10 +4185,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - config - credentials @@ -4176,14 +4202,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - config - credentials @@ -4198,10 +4224,10 @@ definitions: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - config - credentials @@ -4216,12 +4242,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - config - credentials @@ -4235,14 +4261,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. required: - config - credentials @@ -4257,11 +4283,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - config - credentials @@ -4276,13 +4302,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - config - credentials @@ -4294,10 +4320,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4308,7 +4334,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4319,7 +4345,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4330,8 +4356,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4342,10 +4368,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4356,9 +4382,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4369,10 +4395,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4396,12 +4422,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4413,7 +4439,7 @@ definitions: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" required: - config @@ -4426,9 +4452,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4439,9 +4465,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4453,7 +4479,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4465,8 +4491,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. required: - config LinkedinAdsConnection: @@ -4476,7 +4502,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Aut est. + example: Esse et labore earum. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4484,23 +4510,23 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: At odio incidunt distinctio sint qui. + example: Velit ea eum perferendis qui qui. label: type: string description: Optional friendly name - example: Cumque saepe sint quidem odio ab. + example: Tempore rem quo fuga accusantium voluptas ratione. org_id: type: string description: LinkedIn organization URN id - example: Esse praesentium voluptatibus deserunt aliquam. + example: Velit quod cumque perspiciatis. project_id: type: string description: Owning project - example: Quis quis reprehenderit non quae omnis qui. + example: Repudiandae quae aut. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4509,17 +4535,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 1342488242351916696 + example: 7189689836865162887 format: int64 example: - account_id: Necessitatibus magni et molestiae. - has_credentials: true - id: Eos ut et eligendi. - label: Est et eum est. - org_id: Dolorum quas. - project_id: Numquam dolorum consequatur. - status: active - version: 6946177746341876830 + account_id: Tenetur veniam repellat. + has_credentials: false + id: Iste possimus ipsam perspiciatis enim id expedita. + label: Doloribus at vel necessitatibus vel. + org_id: Cumque optio impedit. + project_id: Quia voluptatem impedit. + status: error + version: 5803043317553025654 required: - id - project_id @@ -4538,14 +4564,14 @@ definitions: label: type: string description: Optional friendly name - example: Nulla fuga fugit repellendus et accusamus sed. + example: Aut repudiandae voluptatibus odit autem. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Sequi error. + label: Dicta qui. org_id: "208777" required: - account_id @@ -4557,10 +4583,10 @@ definitions: access_token: type: string description: OAuth access token - example: Quam deleniti et et. + example: Et earum id. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Quia aperiam sunt est labore. + access_token: Voluptate dolorum id ut molestias id. required: - access_token MetaAdsConnection: @@ -4570,35 +4596,35 @@ definitions: account_id: type: string description: Provider account identifier - example: Delectus voluptatem iste nisi in. + example: Autem aliquam voluptatibus assumenda mollitia molestias eos. app_id: type: string description: Meta app ID - example: Iste qui rerum est sed sed similique. + example: Fugit eum et sint possimus omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut est rerum. + example: Ipsa aut. label: type: string description: Optional friendly name - example: Natus expedita aspernatur consequuntur quod ducimus molestias. + example: Impedit vitae molestiae. page_id: type: string description: Facebook page ID - example: Dolor occaecati earum iusto rerum sit cupiditate. + example: Et consequatur vel quisquam. project_id: type: string description: Owning project - example: Occaecati et. + example: Non assumenda molestiae. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4607,18 +4633,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 3681253484013323435 + example: 1948493999542129316 format: int64 example: - account_id: Qui quidem exercitationem. - app_id: Necessitatibus laudantium est ut. + account_id: Vel temporibus sunt nulla esse sed. + app_id: Sed ea qui pariatur adipisci doloremque. has_credentials: false - id: Ea maiores quidem molestiae deleniti omnis. - label: Nostrum corporis quasi magnam. - page_id: Architecto quas eligendi impedit qui sed. - project_id: Expedita voluptatum commodi fuga ipsa. - status: active - version: 8272760528024179326 + id: Neque hic voluptatem ad similique sunt. + label: Ratione impedit recusandae dolor consequatur. + page_id: Veritatis perferendis veritatis libero. + project_id: Doloremque dicta. + status: deleted + version: 8079523500580416969 required: - id - project_id @@ -4637,20 +4663,20 @@ definitions: app_id: type: string description: Meta app ID - example: Exercitationem illum et quisquam. + example: Recusandae est perferendis eos et cumque. label: type: string description: Optional friendly name - example: Neque facilis est qui possimus eligendi. + example: Esse dolores aut. page_id: type: string description: Facebook page ID - example: Possimus et corrupti et nobis voluptas. + example: Exercitationem voluptate quia esse nihil. example: account_id: act_193556282970417 - app_id: Quia quisquam corrupti distinctio voluptas eius. - label: Est facilis qui. - page_id: Modi ut culpa excepturi blanditiis. + app_id: Laborum omnis. + label: Esse neque maiores quo aliquam. + page_id: Rem eveniet in autem neque. required: - account_id MetaAdsCredentials: @@ -4660,15 +4686,15 @@ definitions: access_token: type: string description: Meta access token - example: Autem est est distinctio sunt aliquid harum. + example: Voluptatem possimus veniam dignissimos consequatur. app_secret: type: string description: Meta app secret - example: Nam rerum eaque eius. + example: Delectus enim quas id porro. description: Meta Ads credential. Write-only; never returned. example: - access_token: Rerum illo mollitia odio et dolor. - app_secret: Consectetur sint error ipsam maiores. + access_token: Est porro eos ipsa quia. + app_secret: Quo repudiandae. required: - access_token - app_secret @@ -4679,31 +4705,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Et rerum in expedita. + example: Modi esse voluptatibus. customer_id: type: string description: Microsoft Advertising customer ID - example: Repellat assumenda nesciunt distinctio eaque aliquam. + example: Quo veritatis id accusamus hic. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Consequatur dolore unde illum. + example: Veniam molestias. label: type: string description: Optional friendly name - example: Quo veritatis quis delectus est. + example: Tenetur cumque rerum. project_id: type: string description: Owning project - example: Dolores tenetur ut illum. + example: Accusamus quia velit commodi. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -4712,17 +4738,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4673192311933251173 + example: 2983004504871549622 format: int64 example: - account_id: Aperiam cum possimus. - customer_id: Omnis sed dolore dolorem voluptatibus quod. - has_credentials: false - id: Veniam consectetur deserunt in hic dolorum facere. - label: Magni consequatur dignissimos itaque quia. - project_id: Et reprehenderit dignissimos. - status: error - version: 3475949958922975875 + account_id: Inventore quisquam praesentium nihil atque et nihil. + customer_id: Ad ex. + has_credentials: true + id: Officia et optio sed omnis aut voluptatem. + label: Maxime et ea et. + project_id: Nisi eum omnis est. + status: inactive + version: 3453857184328446715 required: - id - project_id @@ -4737,19 +4763,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Ullam ab suscipit et labore harum. + example: Atque reprehenderit. customer_id: type: string description: Microsoft Advertising customer ID - example: Deleniti doloribus debitis assumenda dignissimos. + example: Eligendi incidunt accusamus excepturi. label: type: string description: Optional friendly name - example: Non iste ad rem quidem sunt qui. + example: Dolore delectus ut beatae eaque. example: - account_id: Quisquam quam officiis aut. - customer_id: Architecto ut unde. - label: Vitae aut ea. + account_id: Molestiae id aut debitis iure. + customer_id: Dolore est dolorem quod enim pariatur. + label: Qui est ut voluptas quod minima dolor. required: - account_id MicrosoftAdsCredentials: @@ -4759,25 +4785,25 @@ definitions: client_id: type: string description: OAuth client id - example: Sapiente possimus. + example: Occaecati veritatis. client_secret: type: string description: OAuth client secret - example: Voluptates atque. + example: Aut architecto aliquam mollitia labore sapiente. developer_token: type: string description: Microsoft Advertising developer token - example: Praesentium tenetur quas at ut necessitatibus dolor. + example: Quia mollitia. refresh_token: type: string description: OAuth refresh token - example: Eaque voluptate reprehenderit sed voluptatem sed illo. + example: Tenetur non accusamus qui ex. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Cum nisi numquam. - client_secret: Id unde veritatis officiis aut fugiat. - developer_token: Quo corporis recusandae dicta quibusdam. - refresh_token: Ut commodi et voluptas tenetur nobis facere. + client_id: Ex et amet sunt. + client_secret: Ad quae nisi. + developer_token: Cum et ab ipsum. + refresh_token: Reiciendis enim. required: - client_id - client_secret @@ -4809,24 +4835,24 @@ definitions: campaign_id: type: string description: Upstream platform campaign id (present when ok) - example: Sed sit repudiandae aut aut. + example: Ex et alias ea asperiores quas. error: type: string description: Failure reason (present when not ok) - example: Dolores vel dolorum minus voluptatem. + example: Corporis dolorem laborum maiores est ea ducimus. ok: type: boolean description: Whether the campaign was created (or reused) successfully - example: false + example: true platform: type: string description: Platform this result is for - example: Enim temporibus. + example: Aut quo. example: - campaign_id: Qui culpa deleniti. - error: Et atque enim quis sed. - ok: true - platform: Architecto itaque doloribus voluptatem consequatur quis fugiat. + campaign_id: Ullam ad iusto quos et est. + error: Explicabo aliquid. + ok: false + platform: Dolorem dignissimos. required: - platform - ok @@ -4875,27 +4901,27 @@ definitions: account_id: type: string description: Provider account identifier - example: Facilis suscipit. + example: Aut omnis itaque ut vero voluptatibus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Maiores laudantium. + example: Non eos. label: type: string description: Optional friendly name - example: Non sint inventore iste iure ut. + example: Enim voluptatem inventore quasi. project_id: type: string description: Owning project - example: Perspiciatis deleniti. + example: Vel aut aliquam rerum et quidem. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -4904,16 +4930,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4582993025544492856 + example: 6330819027913820088 format: int64 example: - account_id: Expedita dignissimos non sed omnis officiis et. - has_credentials: false - id: Ad inventore voluptatum eligendi quasi. - label: Velit dolores omnis placeat unde distinctio ducimus. - project_id: Ipsa et dolore. - status: active - version: 4526728339972318921 + account_id: Quibusdam repellendus qui numquam. + has_credentials: true + id: Voluptatibus voluptatem vero dolorem qui. + label: Vero vel. + project_id: Sequi non et. + status: inactive + version: 4305260724068280609 required: - id - project_id @@ -4932,10 +4958,10 @@ definitions: label: type: string description: Optional friendly name - example: Enim repellendus magni repudiandae inventore. + example: A voluptatem ipsa et voluptatem. example: account_id: t2_gv9wtbfa - label: Corrupti repellat eius ut qui nobis. + label: Est voluptatibus placeat sint pariatur. required: - account_id RedditAdsCredentials: @@ -4945,20 +4971,20 @@ definitions: client_id: type: string description: OAuth client id - example: Delectus quam et eos. + example: Explicabo expedita et velit accusamus. client_secret: type: string description: OAuth client secret - example: Rem aut fuga. + example: Deleniti placeat rerum. refresh_token: type: string description: OAuth refresh token - example: Est dolor ut corporis. + example: Nulla eos. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Cupiditate ut illo dolor quaerat totam. - client_secret: Illo vitae occaecati omnis. - refresh_token: Pariatur debitis. + client_id: Recusandae totam soluta. + client_secret: Praesentium libero. + refresh_token: Qui et assumenda quas. required: - client_id - client_secret @@ -4970,11 +4996,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Eum et sint corrupti eos. + example: Qui sed voluptatibus quam quia. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Qui unde dicta autem dolorem qui explicabo. + example: Sapiente laudantium molestiae omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4982,19 +5008,19 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Explicabo possimus consequatur. + example: Quisquam animi. label: type: string description: Optional friendly name - example: Neque autem ex eos. + example: Repudiandae facilis blanditiis libero nam. project_id: type: string description: Owning project - example: Quos hic doloribus. + example: Delectus blanditiis magnam sed iure amet. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5003,17 +5029,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4374149818121411294 + example: 9048631027735279786 format: int64 example: - account_id: Sit est dolores est et. - funding_instrument_id: Velit atque laudantium ullam rerum. - has_credentials: false - id: Repellat non suscipit veritatis sit tempore. - label: Ut quo iure. - project_id: Magnam ut similique ea minima magnam. - status: deleted - version: 7309957715046801903 + account_id: Officiis aliquid explicabo eaque ab. + funding_instrument_id: Ea iusto eveniet velit sint odit sed. + has_credentials: true + id: Consequuntur perspiciatis modi. + label: Vero et atque in impedit velit omnis. + project_id: Quae sed. + status: inactive + version: 187687687190489160 required: - id - project_id @@ -5032,15 +5058,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Enim accusantium labore esse numquam. + example: Esse voluptate optio quis quae quam. label: type: string description: Optional friendly name - example: Rerum adipisci. + example: Eos nemo cupiditate. example: account_id: 8r7gb - funding_instrument_id: Dolorum deserunt. - label: Non laudantium sunt minima repudiandae illo harum. + funding_instrument_id: Pariatur nostrum. + label: Odio quia omnis commodi. required: - account_id TwitterAdsCredentials: @@ -5050,25 +5076,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Saepe voluptatem reiciendis pariatur. + example: Voluptas ut vero autem consequuntur optio omnis. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Et ut quis ut. + example: Pariatur omnis ut velit dolorem dolor. consumer_key: type: string description: OAuth 1.0a consumer key - example: Sit dolor sunt eos nihil ipsam. + example: Illo porro velit perferendis. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Odio totam cum deleniti placeat fuga. + example: Ipsum aut voluptas molestias unde. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Aut autem sint minus voluptatum. - access_token_secret: Tempore quae. - consumer_key: Iusto omnis. - consumer_secret: Quia cum non. + access_token: Mollitia nulla. + access_token_secret: Minus voluptatem ab delectus porro. + consumer_key: Omnis in qui. + consumer_secret: Nihil ut. required: - consumer_key - consumer_secret diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index 819d47c6..dd5372bd 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Ut temporibus aliquam animi unde.","event_details":"Et architecto voluptas ratione delectus ut.","event_slug":"Magni autem.","id":"Laboriosam tempore vero voluptatum a quos.","keywords":"Ut est nobis aspernatur.","platforms":["Tempore nihil quos.","Eum dignissimos iure praesentium ea.","Quis quas qui mollitia perferendis eveniet voluptas."],"program_type":"Nemo perspiciatis et qui aliquam doloremque itaque.","project_id":"Sed exercitationem ut totam ut minus.","status":"draft","targeting":"Fugit qui tempora commodi reiciendis sit alias.","url":"Ullam tenetur quia totam magni sunt repellat.","version":958049424855577225}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sit ut repellat voluptas."},"example":"Eligendi consequatur officia labore eos."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Quaerat ea accusantium.","event_details":"Amet iusto provident sequi est.","event_slug":"Ut ea alias.","id":"Explicabo cupiditate rerum.","keywords":"Voluptatem iure vero.","platforms":["Accusantium quis architecto.","Enim magnam eius voluptas voluptatibus deleniti.","Dolorum excepturi quibusdam."],"program_type":"Hic vero et.","project_id":"Incidunt ipsum est perspiciatis soluta voluptas est.","status":"draft","targeting":"Consequatur neque tempore voluptatibus quo quod nesciunt.","url":"Nam aspernatur qui quidem est eligendi.","version":7881322722259816896}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Exercitationem officia corrupti tempora ea."},"example":"Totam unde."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa sint optio nobis quae corporis."},"example":"Voluptas ut nostrum officiis et accusamus provident."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Rerum ut culpa totam sequi sit.","event_details":"Sit et quod porro sed minus.","event_slug":"Et ratione sit.","id":"Et assumenda recusandae.","keywords":"Excepturi dolor labore.","platforms":["Omnis veritatis omnis.","Officia et pariatur molestias autem ratione.","Ut et veniam maiores."],"program_type":"Totam id incidunt.","project_id":"Sint eveniet dicta numquam doloremque ab cumque.","status":"draft","targeting":"Iusto dolores.","url":"Sed ipsum quia.","version":7723389563281978281}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Odio eos earum fuga non est."},"example":"Rerum reiciendis similique."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Sint qui praesentium ea praesentium magni.","event_details":"Consequuntur neque mollitia quia.","event_slug":"Tempora veritatis harum ab nobis fuga atque.","id":"Et tempore.","keywords":"Iure dolore et et aut nam.","platforms":["Blanditiis et qui est dolorem eos.","Dolorem sed atque.","Provident id quia porro rerum.","Quo aliquid nobis."],"program_type":"Ratione incidunt est saepe.","project_id":"Eligendi earum qui est et id laudantium.","status":"archived","targeting":"Voluptates odit consequatur quis.","url":"Fugiat aut laboriosam maxime facere culpa modi.","version":317664992246136086}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Repudiandae odit."},"example":"Cupiditate est illo repellat et cum repellat."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Rerum sint optio.","platforms":["Quos tempora dolorem dolor fugiat quia.","Exercitationem rerum iste ducimus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Temporibus ipsum necessitatibus ratione possimus."},"example":"Facilis repellat eveniet reiciendis."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur sint et vel molestiae."},"example":"Non placeat."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Est qui molestiae rerum adipisci minima quibusdam.","campaign_name":"Harum distinctio reiciendis architecto atque maxime soluta.","id":"Commodi quam voluptates.","platform":"Accusantium sunt culpa libero quisquam.","platform_campaign_id":"Rerum amet aut tempora recusandae aspernatur.","project_id":"Optio dolorem omnis.","status":"Ducimus porro maxime.","version":5829797402937558935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Minima adipisci aut quia quisquam."},"example":"Quia facilis sit."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Magnam nihil qui doloremque nam magnam aliquid."},"example":"Possimus accusantium expedita alias."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Exercitationem consectetur.","campaign_name":"Modi asperiores ut libero vel.","id":"Laboriosam quis facere.","platform":"Nesciunt necessitatibus ex ea ullam corrupti sunt.","platform_campaign_id":"Omnis accusantium ad.","project_id":"Totam sapiente vitae numquam ut nesciunt voluptas.","status":"Voluptates iste autem veniam et enim unde.","version":1765361339666375563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis sapiente ut sit quod.","has_credentials":true,"id":"Ea minus enim ut.","label":"Magnam ut et ab.","login_customer_id":"Quae nihil magni.","project_id":"Nostrum veniam qui rerum ipsum eum fugit.","status":"error","version":7243034772713915274}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Magni et rerum sed voluptatum.","has_credentials":false,"id":"Veniam velit sequi sit impedit dolorum voluptas.","label":"Enim est occaecati sed non dolorem distinctio.","login_customer_id":"Nostrum tenetur repellendus.","project_id":"Ipsum quaerat delectus cupiditate sit et.","status":"deleted","version":5181448788196437025}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut sunt ex et autem delectus."},"example":"Occaecati placeat et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Laudantium expedita ut ipsum id commodi nobis.","label":"Velit sapiente qui iusto quis magni et.","login_customer_id":"Officiis deleniti ipsam nam.","project_id":"Vitae aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aut id molestiae sit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem quia."},"example":"Adipisci consectetur ut modi quo et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non ut voluptas et accusamus natus id.","brand_kit":"Eos voluptatibus.","has_credentials":true,"id":"Sit similique ut minima ut.","label":"Quia enim illo et eligendi.","portal_id":"Et quam architecto vero.","project_id":"Voluptatum officia quod error amet quia inventore.","sender_email":"Vero labore laudantium maiores.","sender_name":"Reiciendis dignissimos consequatur iste qui minima.","status":"deleted","version":4350724330275405551}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure ut."},"example":"Minus id deleniti."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Debitis soluta sed quod dicta aperiam eveniet.","brand_kit":"Voluptas expedita omnis ex.","has_credentials":true,"id":"Deleniti itaque voluptas magnam.","label":"Consequuntur sit libero autem ut.","portal_id":"Accusantium sequi modi corrupti esse mollitia.","project_id":"Voluptatem modi velit vitae optio ut.","sender_email":"Saepe rerum sunt eum et qui aut.","sender_name":"Ut quia harum.","status":"error","version":6360555217771164808}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum autem quia quis soluta nostrum cumque."},"example":"Quia velit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Autem recusandae totam.","brand_kit":"Similique deserunt iusto.","has_credentials":true,"id":"Ex delectus.","label":"Officia quidem non qui voluptates natus cum.","portal_id":"Odit necessitatibus veritatis amet ut rerum quidem.","project_id":"Voluptas ullam dolores rem.","sender_email":"Iusto velit quo voluptatibus modi reiciendis aliquam.","sender_name":"Quidem explicabo expedita sunt.","status":"active","version":3951189417473657674}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aspernatur possimus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore qui est."},"example":"Provident saepe aliquam architecto non vero."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Accusamus vero et voluptas accusamus sunt.","has_credentials":true,"id":"Minus voluptas asperiores debitis labore aut.","label":"Distinctio ipsa nihil ad hic repellendus nobis.","org_id":"Vel blanditiis sunt ut facere.","project_id":"Porro ab id necessitatibus consequatur natus tempora.","status":"error","version":4876542408988375571}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus aliquam aut quas aliquid."},"example":"Praesentium beatae quis ut eius."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Facere harum enim consequatur id voluptatem.","has_credentials":true,"id":"Ducimus sequi.","label":"Quia tenetur ducimus.","org_id":"Consequatur dolorum sint voluptatem voluptas omnis est.","project_id":"Autem ab voluptas culpa.","status":"active","version":4064850428710517856}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas consequatur iusto nostrum pariatur."},"example":"Quidem minus pariatur praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Et corporis officia sint.","has_credentials":false,"id":"Consequatur omnis quidem est non tenetur.","label":"Voluptatibus qui cupiditate voluptatem.","org_id":"Quia nulla autem ratione.","project_id":"Deleniti dolores commodi.","status":"error","version":874315130556833044}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Qui esse."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Mollitia a magni vel consequatur ea deserunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Deserunt reiciendis dolorem totam voluptatem."},"example":"Repudiandae molestias est consectetur porro quo pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Aut et.","app_id":"Quia laboriosam magnam unde hic.","has_credentials":false,"id":"Facilis facilis aut suscipit aut odio iste.","label":"Tenetur velit quaerat aut.","page_id":"Distinctio ea totam rem harum provident.","project_id":"Deleniti earum magni quibusdam.","status":"deleted","version":5896744453366252956}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas libero pariatur ut qui sint."},"example":"Quasi esse corporis molestiae excepturi suscipit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quibusdam vel autem modi id facere.","app_id":"Possimus expedita qui.","has_credentials":true,"id":"Eius voluptatem molestiae qui suscipit rerum.","label":"Rem architecto.","page_id":"Et maxime.","project_id":"Eligendi tempora quos.","status":"deleted","version":8688592599556109682}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut ea."},"example":"Aliquam eum molestiae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Vero commodi est qui asperiores velit enim.","app_id":"Architecto dicta.","has_credentials":true,"id":"Atque rerum et officiis sapiente et et.","label":"Eligendi ea vel consequatur nihil.","page_id":"Ut est recusandae aspernatur eum fugit voluptas.","project_id":"Dolores in hic rem.","status":"deleted","version":2446786767075191046}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Numquam doloremque et qui perferendis ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis iusto molestias itaque."},"example":"Fugit et soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Doloremque architecto ea et.","customer_id":"Exercitationem soluta possimus a.","has_credentials":false,"id":"Sed maiores qui sed exercitationem quam.","label":"Et et veritatis voluptas nobis.","project_id":"Non sint praesentium quia.","status":"active","version":2312965176389631300}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem labore laboriosam repellat harum."},"example":"Aut eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Quia sed omnis quaerat aut.","customer_id":"Magnam cumque quasi magni ducimus.","has_credentials":true,"id":"Ducimus debitis nesciunt quas quibusdam occaecati cum.","label":"Nostrum laborum minima.","project_id":"Iste voluptatem et voluptatem ut ut.","status":"error","version":3654633208585641813}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et qui officiis repudiandae qui iste accusantium."},"example":"Consequatur provident ea sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Quis possimus placeat.","customer_id":"Et qui et.","has_credentials":true,"id":"Dignissimos voluptate iste.","label":"Ad esse neque earum modi.","project_id":"Aut qui est iste.","status":"active","version":280885210133145304}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quo quae aut culpa.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Corrupti aut earum rerum ducimus dicta."},"example":"Perspiciatis a aut quas delectus a."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Incidunt aut aperiam et ipsam.","has_credentials":true,"id":"Pariatur consequatur iste sed illo.","label":"Consectetur porro quo.","project_id":"Sunt ipsa.","status":"error","version":6549464945762782488}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur delectus libero id."},"example":"Aut sit iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Neque ipsum nihil cumque repellendus.","has_credentials":true,"id":"Sit iusto.","label":"Architecto unde rerum quisquam ut.","project_id":"Voluptates neque expedita.","status":"inactive","version":3464454785938965677}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur iste eum amet vel impedit et."},"example":"Adipisci et laboriosam veritatis saepe numquam rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","has_credentials":false,"id":"Recusandae beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ratione consequuntur aut et corrupti.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam sunt rem non doloribus."},"example":"Corrupti ipsum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Dignissimos necessitatibus consequuntur.","funding_instrument_id":"Ipsum voluptatem et quam beatae laborum omnis.","has_credentials":true,"id":"Error necessitatibus et autem doloribus est.","label":"Repudiandae voluptatem vitae iste maxime modi laborum.","project_id":"Maxime labore illo maxime provident.","status":"error","version":1380295609570133746}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas esse qui quisquam quae est magni."},"example":"Quibusdam accusamus possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequuntur quia et saepe aperiam."},"example":"Accusamus ipsa qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Nobis nam.","funding_instrument_id":"Reiciendis pariatur quisquam.","has_credentials":true,"id":"Aut quis qui laudantium dolore.","label":"Non quidem doloribus debitis itaque itaque dolores.","project_id":"Possimus nihil qui enim ratione voluptatem eos.","status":"error","version":7616558197057713508}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ea voluptatem eum voluptas eveniet.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Sit harum ipsa et."},"example":"Dignissimos fugiat voluptatibus natus."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Reiciendis et perspiciatis saepe consequatur doloribus.","job_id":"Velit minus.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Odit odio praesentium."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eaque ratione debitis nam blanditiis."},"event_details":{"description":"Extracted event/course details","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil sunt doloremque."},"id":{"type":"string","description":"Brief UUID","example":"Vero at ut quis."},"keywords":{"description":"Keyword list","example":"Eveniet sint voluptatibus quam dicta."},"platforms":{"type":"array","items":{"type":"string","example":"Ea architecto autem iste."},"description":"Suggested default platforms","example":["Ipsa tempore incidunt velit provident.","Magni tempore sunt itaque omnis.","Ex sunt sit beatae.","Modi voluptatum veniam molestiae quibusdam."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui maiores quia non unde deserunt."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae aut fugit alias."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Consequuntur voluptatem est qui."},"url":{"type":"string","description":"Event/course page URL","example":"Ut ut odio odio sed minus quia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6644792324746576285,"format":"int64"}},"example":{"copy":"Iure culpa est possimus dolores dignissimos.","etag":"Id eum aut et itaque.","event_details":"Itaque est fugiat aut dicta.","event_slug":"Magnam quisquam et consequuntur ut sunt.","id":"Ex aut quia distinctio consequatur.","keywords":"Velit laudantium error.","platforms":["Beatae sed aut quia nihil est.","Qui fugiat."],"program_type":"Provident repudiandae sit qui aut aut.","project_id":"Dolor corporis consequatur voluptatem voluptates sed.","status":"draft","targeting":"Et aut quia beatae.","url":"Et velit fuga quos est.","version":9139670973455309725},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut aperiam voluptate voluptates."},"event_details":{"description":"Extracted event/course details","example":"Eum necessitatibus alias."},"event_slug":{"type":"string","description":"Event/course slug","example":"Provident dicta tenetur voluptatem voluptate dolor."},"id":{"type":"string","description":"Brief UUID","example":"Ad quis aperiam deserunt nostrum."},"keywords":{"description":"Keyword list","example":"Sapiente molestiae dolorum repellat expedita ut."},"platforms":{"type":"array","items":{"type":"string","example":"Odio sunt esse mollitia incidunt."},"description":"Suggested default platforms","example":["Laborum sed molestias veritatis itaque.","Est quis impedit.","Illo harum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui minima in nulla sunt autem eos."},"project_id":{"type":"string","description":"Owning project","example":"Et sed praesentium libero."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Dolor quam dolor consectetur eos iste."},"url":{"type":"string","description":"Event/course page URL","example":"Provident porro."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":709937816203366628,"format":"int64"}},"example":{"copy":"Animi sit esse ratione aliquid.","event_details":"Repudiandae tenetur aperiam saepe vel.","event_slug":"Alias minus reprehenderit dignissimos aut velit.","id":"Quis veniam iusto consequatur quia.","keywords":"Laborum est quasi dignissimos.","platforms":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."],"program_type":"Impedit dolores.","project_id":"Officia eligendi alias.","status":"draft","targeting":"Velit quis harum recusandae est ipsum.","url":"At sint laborum veniam.","version":285293330655778463},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Reiciendis sit minima."},"event_details":{"description":"Extracted event/course details","example":"Eligendi ipsam aut vel atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Perspiciatis alias et amet ex molestiae."},"id":{"type":"string","description":"Brief UUID","example":"Modi repellat eum."},"keywords":{"description":"Keyword list","example":"Unde et."},"platforms":{"type":"array","items":{"type":"string","example":"Pariatur mollitia incidunt autem."},"description":"Suggested default platforms","example":["Voluptate fuga ea distinctio maiores mollitia aut.","Rerum cum eaque nesciunt est totam inventore."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi magni quidem sit in quia."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem eos doloribus sint."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut dolores in voluptas."},"url":{"type":"string","description":"Event/course page URL","example":"Minus libero et consequuntur suscipit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"copy":"Sapiente harum aliquam sunt eum rerum eaque.","event_details":"Voluptatem sint hic.","event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","keywords":"Facere voluptatibus.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","targeting":"Nisi repudiandae.","url":"Nostrum similique omnis iste.","version":7605661861379582739},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Delectus veniam vel est et magni."},"event_details":{"description":"Extracted event/course details","example":"Vero consequatur possimus aut assumenda."},"event_slug":{"type":"string","description":"Event/course slug","example":"Recusandae ut ullam aliquam dolore iure."},"id":{"type":"string","description":"Brief UUID","example":"Velit omnis dolorem est aut."},"keywords":{"description":"Keyword list","example":"Et provident illo non quisquam iure doloremque."},"platforms":{"type":"array","items":{"type":"string","example":"Officia natus quia labore."},"description":"Suggested default platforms","example":["Dolores et incidunt voluptatem ipsa.","Assumenda excepturi.","Tempora est eveniet sequi ea."]},"program_type":{"type":"string","description":"Funnel context","example":"Consequuntur esse culpa."},"project_id":{"type":"string","description":"Owning project","example":"Recusandae dignissimos dolore harum totam tempora vitae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut aliquid."},"url":{"type":"string","description":"Event/course page URL","example":"Minus nostrum iste nemo fugiat sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1796419171074064120,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Ab laboriosam sunt quis omnis.","id":"Veritatis impedit aut.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Alias temporibus illum impedit ullam.","Suscipit harum.","Neque quia.","Et veniam itaque optio consequatur nulla sint."],"program_type":"Exercitationem accusamus pariatur saepe ab qui.","project_id":"Earum doloribus.","status":"approved","targeting":"Cupiditate aut.","url":"Sunt quis odio enim nam id voluptatem.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui rerum numquam quo omnis a quia."},"event_details":{"description":"Extracted event/course details","example":"Itaque qui repudiandae magnam atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Soluta dolore vitae."},"id":{"type":"string","description":"Brief UUID","example":"Minima iure quos enim occaecati beatae."},"keywords":{"description":"Keyword list","example":"Culpa ipsam totam nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"description":"Suggested default platforms","example":["Voluptatem aut debitis vitae unde velit eos.","Accusantium odit rerum commodi ea.","Consequatur et."]},"program_type":{"type":"string","description":"Funnel context","example":"Quaerat et eius culpa magni illum consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestias sint sequi."},"url":{"type":"string","description":"Event/course page URL","example":"In commodi et asperiores et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":122602759626083426,"format":"int64"}},"example":{"copy":"Fuga atque.","event_details":"Qui omnis nesciunt qui consequuntur.","event_slug":"Minima dolorem sit est tempora qui.","id":"Placeat perferendis omnis ad voluptas.","keywords":"Sequi culpa.","platforms":["Praesentium cumque illum pariatur odio molestias voluptatum.","Nulla perferendis possimus deserunt iure et.","Ea quidem ducimus tempora ea molestias."],"program_type":"Enim totam.","project_id":"Voluptates laboriosam cumque mollitia quidem quo.","status":"draft","targeting":"Odit provident sed quo aperiam.","url":"Voluptas necessitatibus cumque non porro qui molestias.","version":4353559979947303924},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Voluptas aperiam."},"event_details":{"description":"Extracted event/course details","example":"Dolores enim."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Rerum numquam amet deserunt rem quia."},"keywords":{"description":"Keyword list","example":"Assumenda harum eos eveniet ut et laboriosam."},"platforms":{"type":"array","items":{"type":"string","example":"Numquam omnis ullam facilis ab sapiente."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Esse voluptate eum laboriosam distinctio non.","Deserunt labore et id aut et adipisci.","Ut molestiae.","Voluptates ut culpa saepe necessitatibus."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Quos expedita voluptas qui eaque."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsam dolores et et qui ut."}},"example":{"copy":"Porro ut et cupiditate.","event_details":"Non assumenda perspiciatis.","event_slug":"Nostrum ratione id.","keywords":"Ea ullam minima voluptatem vel deleniti.","platforms":["Quae molestiae suscipit non iusto.","Consequatur in vero soluta.","Eius dicta.","Ullam distinctio dolore velit."],"program_type":"education","targeting":"Repudiandae necessitatibus dolorem enim beatae quia.","url":"Laborum aspernatur voluptate itaque fugit."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Aut ut."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut ut sit nisi architecto."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptate enim qui impedit temporibus."},"id":{"type":"string","description":"Campaign UUID","example":"Et vel beatae molestiae fuga."},"platform":{"type":"string","description":"Channel","example":"Sed corrupti sit."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Labore quia esse consectetur tenetur eum."},"project_id":{"type":"string","description":"Owning project","example":"Vitae consequatur eos."},"status":{"type":"string","description":"Campaign status","example":"Rerum et recusandae possimus quis."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9161333083936888105,"format":"int64"}},"example":{"brief_id":"Explicabo repudiandae aut reiciendis recusandae molestias.","campaign_name":"Hic est quia pariatur odit ullam.","etag":"Quisquam nisi repellendus quos magnam aut.","id":"Eos omnis cumque nemo ipsam ut.","platform":"Vel inventore aliquid aut non eligendi accusamus.","platform_campaign_id":"Quod impedit accusamus incidunt minus veritatis enim.","project_id":"Natus et unde.","status":"Ex id corrupti sed quo perferendis.","version":7863921121752869750},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptates sit est corporis molestiae voluptatem."},"campaign_name":{"type":"string","description":"Campaign name","example":"Ratione ipsum."},"id":{"type":"string","description":"Campaign UUID","example":"Et incidunt."},"platform":{"type":"string","description":"Channel","example":"Expedita inventore qui necessitatibus ut necessitatibus in."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Autem maxime hic."},"project_id":{"type":"string","description":"Owning project","example":"Dolor sed excepturi delectus."},"status":{"type":"string","description":"Campaign status","example":"Amet hic est."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":906675377577277444,"format":"int64"}},"example":{"brief_id":"Magnam voluptates molestiae libero autem quod.","campaign_name":"Sunt accusantium totam quia.","id":"Occaecati rerum reiciendis.","platform":"Ullam ipsum.","platform_campaign_id":"Dolores dolore id dolore sed.","project_id":"Esse mollitia et dolorum accusantium aspernatur quos.","status":"Accusantium debitis adipisci qui iste explicabo.","version":9006499932988805057},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Dolor quia consectetur non nulla dolore."},"campaign_name":{"type":"string","description":"Campaign name","example":"Quos omnis."},"id":{"type":"string","description":"Campaign UUID","example":"Qui quia."},"platform":{"type":"string","description":"Channel","example":"Ducimus voluptas soluta quod qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Fugiat est omnis inventore voluptatum ab totam."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam sint autem repudiandae asperiores."},"status":{"type":"string","description":"Campaign status","example":"Libero consequatur."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3986034538934721868,"format":"int64"}},"example":{"brief_id":"Reiciendis odit eos et quidem.","campaign_name":"Quae voluptatem velit mollitia dolorem ea.","id":"Sapiente ex est modi cupiditate possimus ducimus.","platform":"Atque hic quam impedit placeat.","platform_campaign_id":"Voluptatibus aliquam et.","project_id":"Modi consequatur molestias et et deleniti.","status":"Enim voluptas numquam.","version":616047483519279742},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Qui libero natus."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["microsoft-ads","meta-ads","twitter-ads","hubspot"]}},"example":{"config":"Vitae officia dolorem.","platforms":["meta-ads","twitter-ads","hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Id voluptatem nihil quaerat asperiores."},"config":{"description":"Campaign configuration snapshot","example":"Error perferendis quae qui inventore dolorem."},"status":{"type":"string","description":"Campaign status","example":"Repellat vel veritatis hic rerum accusamus."}},"example":{"campaign_name":"Quasi in aut nam rerum.","config":"Architecto deserunt vero ducimus distinctio.","status":"Distinctio magnam."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Magni aut nisi est sit sint."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Et voluptas dolorem necessitatibus illum quisquam.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit quis."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel architecto quae error dolor placeat."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem nostrum."},"label":{"type":"string","description":"Optional friendly name","example":"Ut nobis."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Minus et."},"project_id":{"type":"string","description":"Owning project","example":"Deleniti voluptas quo nostrum quia."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7197135224651925465,"format":"int64"}},"example":{"account_id":"Nostrum atque illum nesciunt adipisci odit corrupti.","etag":"Voluptas omnis quidem dolor ipsum voluptas sed.","has_credentials":true,"id":"Fugiat aliquid aspernatur voluptatem in cupiditate.","label":"Iusto fugit non asperiores quidem natus.","login_customer_id":"Id ea.","project_id":"Et dolorem quod.","status":"deleted","version":8604742619872904748},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rem fugit accusantium est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto eius dolor magnam necessitatibus amet."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum tempore tempora."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dolorem asperiores autem aut aut soluta."},"project_id":{"type":"string","description":"Owning project","example":"Earum aut qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6983147448769937945,"format":"int64"}},"example":{"account_id":"Officia dolores et reprehenderit.","has_credentials":false,"id":"Et est et corporis.","label":"Aut explicabo.","login_customer_id":"Rerum rem.","project_id":"Voluptate est reprehenderit consectetur accusamus eaque inventore.","status":"deleted","version":8504196254053832609},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et vel dolorum aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vitae qui explicabo tempora accusantium aut."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis qui sunt laboriosam ipsa."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dicta ut."},"project_id":{"type":"string","description":"Owning project","example":"In vel."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5579476471615779331,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","has_credentials":true,"id":"Beatae error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","login_customer_id":"Iure dolores dolores dolorem sit nihil.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsam eligendi est dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sit est atque qui quaerat qui vitae."},"label":{"type":"string","description":"Optional friendly name","example":"Optio in ratione accusamus quasi."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quos excepturi natus est est."},"project_id":{"type":"string","description":"Owning project","example":"Optio non."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6617602369183761406,"format":"int64"}},"example":{"account_id":"Quibusdam ea nam aut.","has_credentials":false,"id":"Doloribus unde id aut perspiciatis.","label":"Sit totam ut et.","login_customer_id":"Est consequatur rerum neque velit nulla modi.","project_id":"Adipisci ut.","status":"active","version":926393304108038988},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"In consectetur et culpa quaerat vel sed."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et impedit quod."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Magni omnis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Ipsa nihil esse."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit id incidunt.","client_secret":"Non sed hic minima est distinctio.","developer_token":"A perferendis.","refresh_token":"Facere eum aliquid est repellat assumenda."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Error eligendi incidunt accusamus excepturi inventore."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut architecto aliquam mollitia labore sapiente."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quod minima dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nihil facilis sunt."},"label":{"type":"string","description":"Optional friendly name","example":"Ut beatae eaque quo atque."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Molestiae id aut debitis iure."},"project_id":{"type":"string","description":"Owning project","example":"Vero ad ex consequatur dolore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolore est dolorem quod enim pariatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Occaecati veritatis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7262698057225531796,"format":"int64"}},"example":{"account_id":"Ad quae nisi.","brand_kit":"Incidunt voluptas non necessitatibus.","etag":"Cum et ab ipsum.","has_credentials":true,"id":"Tenetur non accusamus qui ex.","label":"Ex et amet sunt.","portal_id":"Qui nemo nihil dolorum consequatur.","project_id":"Quia mollitia.","sender_email":"Tempora qui eum hic vel aspernatur at.","sender_name":"Est ea sed sit.","status":"deleted","version":7589133128297342291},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non in iure dolores et quis id."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Accusamus corrupti sint molestiae occaecati est quos."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sint consequuntur omnis distinctio possimus non aliquid."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi est et est totam."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quia sed nesciunt minus."},"project_id":{"type":"string","description":"Owning project","example":"Facilis neque sed alias dolore id."},"sender_email":{"type":"string","description":"Default sender address","example":"Non doloribus nam."},"sender_name":{"type":"string","description":"Default sender name","example":"Nulla suscipit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1661229305097180791,"format":"int64"}},"example":{"account_id":"Totam non qui.","brand_kit":"Sunt labore voluptate.","has_credentials":true,"id":"Est ut ratione nobis.","label":"Qui ut ut qui sed explicabo.","portal_id":"Vero nulla laboriosam vel et et iure.","project_id":"Occaecati tenetur minima veritatis sed impedit laborum.","sender_email":"Exercitationem voluptatum perspiciatis autem.","sender_name":"Eum ut.","status":"active","version":5481070480011205228},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur laborum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut tempora dolorem neque assumenda sed."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Cum ipsum quo possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Excepturi sit minus."},"project_id":{"type":"string","description":"Owning project","example":"Quam culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Et quisquam dicta."},"sender_name":{"type":"string","description":"Default sender name","example":"Eaque enim est libero enim quo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2473646846997850541,"format":"int64"}},"example":{"account_id":"Similique eaque autem impedit tenetur voluptatibus.","brand_kit":"Et fuga veniam.","has_credentials":true,"id":"Aspernatur ipsam consequatur qui illo totam fuga.","label":"Qui non illum expedita commodi in dolores.","portal_id":"Harum molestiae cupiditate ab et eum ex.","project_id":"In tempore quo consequatur.","sender_email":"Quia velit adipisci.","sender_name":"Aliquid eum itaque qui recusandae recusandae.","status":"deleted","version":5418486313404831501},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Praesentium eos aspernatur voluptatum facilis laboriosam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ab earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ea et iusto doloremque odio pariatur."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aliquid ratione est omnis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Alias et error nobis minima fuga reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Expedita animi ut velit at."},"sender_email":{"type":"string","description":"Default sender address","example":"Impedit qui suscipit ipsa."},"sender_name":{"type":"string","description":"Default sender name","example":"Animi fuga maxime tempora."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2736756583759126082,"format":"int64"}},"example":{"account_id":"Ab itaque tempore vel quia cum quas.","brand_kit":"Sed commodi voluptatibus.","has_credentials":true,"id":"Rerum perspiciatis dolor pariatur.","label":"Quo soluta maxime temporibus earum et aperiam.","portal_id":"Ipsa aut est et est debitis ea.","project_id":"Amet officia occaecati quam nostrum quis voluptas.","sender_email":"Eum voluptatum accusamus illo eveniet eum.","sender_name":"Nemo molestiae modi ut non atque.","status":"deleted","version":5960975059584485019},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Minus voluptatem ab delectus porro."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi esse voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Mollitia nulla."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Veniam molestias."},"sender_email":{"type":"string","description":"Default sender address","example":"Accusamus quia velit commodi."},"sender_name":{"type":"string","description":"Default sender name","example":"Tenetur cumque rerum."}},"example":{"account_id":"Hic magni.","brand_kit":"Nihil atque.","label":"Fugit dolorum nulla quo veritatis id.","portal_id":"Et optio sed omnis aut voluptatem voluptas.","sender_email":"Eum omnis est blanditiis maxime et.","sender_name":"Et eum inventore quisquam."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Quia omnis in qui."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Nihil ut."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Ut beatae quia."},"platforms":{"type":"array","items":{"type":"string","example":"Minima illo dolores natus a sint."},"description":"Platforms this job will create on","example":["Quae et nesciunt iure quis in.","Mollitia nihil ducimus."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Non quo necessitatibus.","platforms":["Accusantium laudantium nostrum earum dolores.","Eos exercitationem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Hic vel ut."},"job_id":{"type":"string","description":"Job UUID","example":"Illo accusamus."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dolores quidem necessitatibus voluptatem consequatur sit.","job_id":"Earum minus autem omnis qui debitis eum.","result":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}],"status":"running"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae illum accusamus debitis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Doloribus voluptas mollitia doloremque totam."},"label":{"type":"string","description":"Optional friendly name","example":"Quia doloremque commodi rerum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Praesentium sint laudantium error."},"project_id":{"type":"string","description":"Owning project","example":"Veniam et ducimus quos amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6150421422111226538,"format":"int64"}},"example":{"account_id":"Quas quis corporis.","etag":"Ea ducimus ipsum dolorem dignissimos.","has_credentials":true,"id":"Nihil iure officiis nemo quia.","label":"Et quia ex et alias ea.","org_id":"Quo ullam ad iusto quos.","project_id":"Ducimus id sint eius aut.","status":"inactive","version":2540282771582052941},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit soluta quia qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio quia similique vero est impedit quo."},"label":{"type":"string","description":"Optional friendly name","example":"Libero officia et quia."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil at."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1438953144952054594,"format":"int64"}},"example":{"account_id":"Optio rerum vel molestiae id.","has_credentials":false,"id":"Necessitatibus eos rerum.","label":"Qui quas aut provident suscipit.","org_id":"Reiciendis excepturi.","project_id":"Veniam amet et quisquam voluptatem fuga.","status":"active","version":8349066598252210000},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut temporibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut tenetur."},"label":{"type":"string","description":"Optional friendly name","example":"Iure aut tenetur ipsum ea ad ducimus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Voluptatem libero."},"project_id":{"type":"string","description":"Owning project","example":"Et et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8572511867951081487,"format":"int64"}},"example":{"account_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Eligendi non.","label":"Aut amet aut voluptatum magnam.","org_id":"Quisquam perspiciatis ipsam aperiam et totam in.","project_id":"Necessitatibus non eum ipsum eveniet quam.","status":"error","version":786757177338717877},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Debitis atque laboriosam unde facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"label":{"type":"string","description":"Optional friendly name","example":"Nam modi nostrum assumenda alias sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Mollitia ducimus sunt."},"project_id":{"type":"string","description":"Owning project","example":"Odit illo ut ut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4721820161303114412,"format":"int64"}},"example":{"account_id":"Est deserunt maiores consequatur.","has_credentials":true,"id":"Aliquam voluptatem.","label":"Eos minima sunt.","org_id":"Non ratione quo ullam dolores occaecati.","project_id":"Dolore aliquam est autem.","status":"deleted","version":2899021755311679849},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sit voluptatem ad ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Tempora dolor quis totam hic quibusdam eveniet.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Dolorem necessitatibus neque consectetur occaecati earum."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut sint non eum expedita non."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Id vel iusto optio repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"page_id":{"type":"string","description":"Facebook page ID","example":"Hic quos inventore."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Nisi est magni odio aut.","app_id":"Et ipsa magnam cum.","etag":"Ducimus voluptatem doloremque ullam consequatur.","has_credentials":false,"id":"Ad dolorem et.","label":"Inventore impedit unde voluptatem quia ab recusandae.","page_id":"Eveniet tempore est omnis iusto fugiat.","project_id":"Rerum eveniet nam sunt.","status":"inactive","version":8514774147978099222},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos qui quo et."},"app_id":{"type":"string","description":"Meta app ID","example":"Sed voluptas fuga officia nulla."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut magnam facilis non facilis dolor consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"A debitis ut ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Beatae facilis dolor quod nihil quia."},"project_id":{"type":"string","description":"Owning project","example":"Error quisquam recusandae nesciunt et itaque."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2532070289670969642,"format":"int64"}},"example":{"account_id":"Et nemo dicta illum omnis.","app_id":"Minus est dolor.","has_credentials":false,"id":"Recusandae consequatur nulla.","label":"Consequuntur provident nostrum vel ut.","page_id":"Deleniti magnam nemo cum delectus.","project_id":"Non consequuntur qui qui impedit assumenda voluptas.","status":"error","version":1382848930967937507},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsa ut saepe beatae quasi."},"app_id":{"type":"string","description":"Meta app ID","example":"Neque voluptas doloremque nobis consectetur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et voluptatem mollitia placeat aut laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Nam sequi iste iusto."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corrupti ut."},"project_id":{"type":"string","description":"Owning project","example":"Ut et laborum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2992056059874429339,"format":"int64"}},"example":{"account_id":"Quis impedit.","app_id":"Tempore qui repellendus.","has_credentials":false,"id":"Voluptas voluptatem.","label":"Corrupti dicta pariatur totam quas deserunt.","page_id":"Earum voluptates repellat ipsam aut et ut.","project_id":"Quia facere vitae aperiam.","status":"active","version":5857417550509828993},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Accusantium est."},"app_id":{"type":"string","description":"Meta app ID","example":"Dolorem similique sapiente."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Expedita commodi sit."},"label":{"type":"string","description":"Optional friendly name","example":"Quo porro."},"page_id":{"type":"string","description":"Facebook page ID","example":"Pariatur esse."},"project_id":{"type":"string","description":"Owning project","example":"Et porro saepe eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8954046891574288398,"format":"int64"}},"example":{"account_id":"Sed qui dolor illo facere ut voluptatem.","app_id":"Perferendis placeat earum occaecati et.","has_credentials":false,"id":"Ea pariatur.","label":"Nam repellat.","page_id":"Rerum maiores in alias est laboriosam saepe.","project_id":"Aut rem molestiae assumenda ea.","status":"deleted","version":8862716294143227386},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Et minima."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas quis nihil tempora rem asperiores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vero natus voluptatem."}},"example":{"account_id":"act_193556282970417","app_id":"Voluptas aliquid libero sapiente aspernatur fugit eum.","label":"Quas qui aut rerum illum vero.","page_id":"Et neque soluta."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Est placeat explicabo aliquid."},"app_secret":{"type":"string","description":"Meta app secret","example":"Tenetur ut."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Quo vel iste aut cum voluptatem.","app_secret":"Et et aperiam."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor ea iusto eveniet velit sint odit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quam enim odio quia."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate et esse voluptate optio quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et atque."},"label":{"type":"string","description":"Optional friendly name","example":"Aliquid explicabo eaque ab aut voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Impedit velit omnis incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8220727981299951228,"format":"int64"}},"example":{"account_id":"Unde fuga voluptas ut vero.","customer_id":"Velit dolorem.","etag":"A pariatur omnis.","has_credentials":true,"id":"Commodi aspernatur.","label":"Velit perferendis est ipsum aut voluptas.","project_id":"Nostrum numquam illo.","status":"active","version":5290138330966618163},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Odit numquam quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Ut unde dolore id.","customer_id":"Dolorem ut aspernatur et ad.","has_credentials":false,"id":"Aut dolores.","label":"Atque qui dignissimos aut eaque eveniet.","project_id":"Voluptatem beatae quis dignissimos voluptatem et labore.","status":"active","version":412346224570068154},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut dolorem ea veniam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ullam dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Magnam sequi esse at."},"label":{"type":"string","description":"Optional friendly name","example":"Assumenda cum nemo esse nobis."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut rerum voluptatem ad minus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6107904235260429813,"format":"int64"}},"example":{"account_id":"Nihil deleniti dolores dignissimos perferendis tempore eum.","customer_id":"Magnam saepe incidunt nisi.","has_credentials":true,"id":"Eum et consequatur quis.","label":"Consequatur dolor quia amet vero dolorum incidunt.","project_id":"Enim nisi doloremque rerum.","status":"deleted","version":9143198940358453773},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Repudiandae facilis blanditiis libero nam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus blanditiis magnam sed iure amet."}},"example":{"account_id":"Molestiae omnis doloremque.","customer_id":"Perspiciatis modi dicta quae sed ut.","label":"Deserunt et quidem sapiente."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Aut est voluptatibus placeat."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Pariatur perferendis explicabo expedita et velit accusamus."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Nulla eos."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Deleniti placeat rerum."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","developer_token":"Quisquam animi.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Magni atque amet omnis doloremque at."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolor et natus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Nihil neque quod alias ipsum."}},"example":{"campaign_id":"Consequatur non eveniet esse officia explicabo dolor.","error":"Aspernatur voluptatibus.","ok":true,"platform":"Cupiditate non exercitationem."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Rerum non assumenda molestiae modi impedit.","etag":"Aliquam voluptatibus assumenda mollitia molestias eos nobis.","has_credentials":false,"id":"Earum id consequatur.","label":"Adipisci ipsa.","project_id":"Dolorum id ut molestias.","status":"deleted","version":948876280422508983},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et natus possimus cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque magni omnis dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Quae et perspiciatis numquam."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda quam possimus aut ipsa."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6695567399746083998,"format":"int64"}},"example":{"account_id":"Amet itaque aut.","has_credentials":true,"id":"Atque delectus ut.","label":"Unde adipisci aut quisquam.","project_id":"Eum non ut itaque.","status":"inactive","version":8672712817511304757},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quas quia quam voluptate nam iste."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et doloremque porro non."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores quo est ratione beatae totam."},"project_id":{"type":"string","description":"Owning project","example":"Quis ab non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1807846651493588341,"format":"int64"}},"example":{"account_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Temporibus aut numquam.","label":"Enim velit voluptates officiis tempora possimus rerum.","project_id":"Accusantium ut vitae dolor soluta beatae.","status":"active","version":8042484860326151968},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Incidunt deleniti.","has_credentials":false,"id":"Officiis modi quae consequatur voluptatem et.","label":"Vero eum ea perspiciatis rerum.","project_id":"Culpa veritatis ut adipisci minus.","status":"active","version":6279401977493721745},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Numquam optio possimus velit quod."}},"example":{"account_id":"t2_gv9wtbfa","label":"Perspiciatis quam iste possimus ipsam."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Mollitia vel."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ea eum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Qui qui."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Repudiandae quae aut.","client_secret":"Tempore rem quo fuga accusantium voluptas ratione.","refresh_token":"Esse et labore earum."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo repudiandae."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel aut aliquam rerum et quidem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim voluptatem inventore quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est porro eos ipsa quia."},"project_id":{"type":"string","description":"Owning project","example":"Delectus enim quas id porro."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1500674714869504232,"format":"int64"}},"example":{"account_id":"Sequi non et.","etag":"Quibusdam repellendus qui numquam.","funding_instrument_id":"Necessitatibus quaerat minima a voluptatem ipsa et.","has_credentials":true,"id":"Aut omnis itaque ut vero voluptatibus.","label":"Vero dolorem qui.","project_id":"Eum provident velit voluptatibus.","status":"active","version":3990374454753155356},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","funding_instrument_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","funding_instrument_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est perferendis eos et cumque nulla."},"label":{"type":"string","description":"Optional friendly name","example":"Iste exercitationem voluptate quia esse nihil sed."}},"example":{"account_id":"8r7gb","funding_instrument_id":"In autem neque nihil laborum omnis.","label":"Neque maiores quo aliquam in rem."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Hic voluptatem ad similique sunt ratione."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Dicta et ratione impedit recusandae dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nemo sint et consequatur vel quisquam libero."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Eum et sint possimus omnis dolorem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Facere sed ea qui pariatur adipisci.","access_token_secret":"Enim esse dolores.","consumer_key":"Mollitia vel temporibus sunt nulla esse.","consumer_secret":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index 0ae17c6a..8eb9fff0 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -32,17 +32,18 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. responses: "201": description: Created response. @@ -52,28 +53,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Nobis est fugit ratione consectetur exercitationem. - example: Aperiam quia doloribus omnis. + example: Aliquid qui omnis et. + example: Asperiores recusandae deserunt ratione eius culpa sit. content: application/json: schema: $ref: '#/components/schemas/Brief2' example: - copy: Ut temporibus aliquam animi unde. - event_details: Et architecto voluptas ratione delectus ut. - event_slug: Magni autem. - id: Laboriosam tempore vero voluptatum a quos. - keywords: Ut est nobis aspernatur. + copy: Magni et rerum sed voluptatum. + event_details: Enim est occaecati sed non dolorem distinctio. + event_slug: Aperiam eum. + id: Omnis suscipit corrupti reiciendis. + keywords: Aut ratione sunt nostrum tenetur. platforms: - - Tempore nihil quos. - - Eum dignissimos iure praesentium ea. - - Quis quas qui mollitia perferendis eveniet voluptas. - program_type: Nemo perspiciatis et qui aliquam doloremque itaque. - project_id: Sed exercitationem ut totam ut minus. + - Dolorum aut distinctio vel. + - Veniam velit sequi sit impedit dolorum voluptas. + - Ipsum quaerat delectus cupiditate sit et. + program_type: Beatae soluta molestiae nihil quia omnis. + project_id: Perspiciatis saepe consequatur doloribus sequi et. status: draft - targeting: Fugit qui tempora commodi reiciendis sit alias. - url: Ullam tenetur quia totam magni sunt repellat. - version: 958049424855577225 + targeting: Dolorem cum. + url: Quam et voluptatibus illum dolorem. + version: 1135469282733514180 "400": description: 'BadRequest: Bad request' content: @@ -145,8 +146,9 @@ paths: schema: type: string description: Brief UUID - example: Sit ut repellat voluptas. - example: Eligendi consequatur officia labore eos. + example: b6261fa8-da11-47f0-b13d-8ff0dc6aaffd + format: uuid + example: 52ae4742-df9c-4ce6-ab10-c9bd7ccebd74 responses: "204": description: No Content response. @@ -220,8 +222,9 @@ paths: schema: type: string description: Brief UUID - example: Excepturi fugit. - example: Aut quia voluptates voluptates nisi. + example: 2df7b380-3594-4323-92b0-9a8e5a8fedcc + format: uuid + example: 6d67841a-f263-4343-acd9-5ea22a27e47d responses: "200": description: OK response. @@ -231,28 +234,27 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut molestias aut excepturi cumque. - example: Ut hic distinctio non recusandae et qui. + example: Libero repudiandae aliquid ex. + example: Eveniet suscipit odio ratione. content: application/json: schema: $ref: '#/components/schemas/Brief3' example: - copy: Quaerat ea accusantium. - event_details: Amet iusto provident sequi est. - event_slug: Ut ea alias. - id: Explicabo cupiditate rerum. - keywords: Voluptatem iure vero. + copy: Dolores commodi aperiam voluptatibus. + event_details: Omnis quidem est non tenetur dolore. + event_slug: Distinctio ipsa nihil ad hic repellendus nobis. + id: Harum et minus voluptas. + keywords: Cupiditate voluptatem. platforms: - - Accusantium quis architecto. - - Enim magnam eius voluptas voluptatibus deleniti. - - Dolorum excepturi quibusdam. - program_type: Hic vero et. - project_id: Incidunt ipsum est perspiciatis soluta voluptas est. - status: draft - targeting: Consequatur neque tempore voluptatibus quo quod nesciunt. - url: Nam aspernatur qui quidem est eligendi. - version: 7881322722259816896 + - Cupiditate aliquam vel blanditiis sunt ut. + - Aperiam quo sint dolorum vel molestiae. + program_type: Porro ab id necessitatibus consequatur natus tempora. + project_id: Debitis labore aut. + status: approved + targeting: Et corporis officia sint. + url: Accusamus vero et voluptas accusamus sunt. + version: 1623908575818221398 "400": description: 'BadRequest: Bad request' content: @@ -323,8 +325,9 @@ paths: schema: type: string description: Brief UUID - example: Exercitationem officia corrupti tempora ea. - example: Totam unde. + example: 7b75bd11-b6e0-441e-99e4-25f506ecfdd1 + format: uuid + example: 913052d6-1036-4a14-9f9a-107c3b258bb8 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -342,17 +345,18 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. responses: "200": description: OK response. @@ -362,28 +366,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ipsa sint optio nobis quae corporis. - example: Voluptas ut nostrum officiis et accusamus provident. + example: Ut aperiam eveniet nihil qui ea. + example: Id aut praesentium maiores unde quo culpa. content: application/json: schema: $ref: '#/components/schemas/Brief4' example: - copy: Rerum ut culpa totam sequi sit. - event_details: Sit et quod porro sed minus. - event_slug: Et ratione sit. - id: Et assumenda recusandae. - keywords: Excepturi dolor labore. + copy: Doloremque et qui perferendis. + event_details: Fugit voluptas molestias architecto dicta quidem illo. + event_slug: Sapiente et et itaque dolores in. + id: Provident quia laboriosam magnam unde. + keywords: Quia aut sed fugiat adipisci eos rerum. platforms: - - Omnis veritatis omnis. - - Officia et pariatur molestias autem ratione. - - Ut et veniam maiores. - program_type: Totam id incidunt. - project_id: Sint eveniet dicta numquam doloremque ab cumque. - status: draft - targeting: Iusto dolores. - url: Sed ipsum quia. - version: 7723389563281978281 + - Nihil explicabo vero. + - Est qui asperiores velit enim. + - Expedita ut minus ut est recusandae aspernatur. + program_type: Rerum et. + project_id: Et sed nobis blanditiis. + status: approved + targeting: Ipsam temporibus sint et necessitatibus dolorem ut. + url: Rem dolores eligendi ea. + version: 6226287149251328788 "400": description: 'BadRequest: Bad request' content: @@ -473,8 +477,18 @@ paths: schema: type: string description: Brief UUID - example: Odio eos earum fuga non est. - example: Rerum reiciendis similique. + example: 25175f34-92c0-434d-a72f-1a9c500ccdda + format: uuid + example: 78a49884-958d-4ef7-99b9-e60dab3c1338 + - name: If-Match + in: header + description: Version being approved (ETag); approval is rejected if the brief changed + allowEmptyValue: true + schema: + type: string + description: Version being approved (ETag); approval is rejected if the brief changed + example: Qui inventore. + example: Ducimus ut adipisci est laboriosam. responses: "200": description: OK response. @@ -484,29 +498,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempora qui incidunt tempora. - example: Vero voluptates soluta. + example: Sunt cum ut. + example: Omnis rerum. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Sint qui praesentium ea praesentium magni. - event_details: Consequuntur neque mollitia quia. - event_slug: Tempora veritatis harum ab nobis fuga atque. - id: Et tempore. - keywords: Iure dolore et et aut nam. + copy: Error necessitatibus et autem doloribus est. + event_details: Similique odio adipisci dolore iste. + event_slug: Quo culpa. + id: Sit ex commodi sapiente a illum. + keywords: Maxime labore illo maxime provident. platforms: - - Blanditiis et qui est dolorem eos. - - Dolorem sed atque. - - Provident id quia porro rerum. - - Quo aliquid nobis. - program_type: Ratione incidunt est saepe. - project_id: Eligendi earum qui est et id laudantium. - status: archived - targeting: Voluptates odit consequatur quis. - url: Fugiat aut laboriosam maxime facere culpa modi. - version: 317664992246136086 + - Sint suscipit iste eveniet laudantium rerum. + - Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + - Nostrum dolorum iure eaque animi. + - Error laudantium. + program_type: Dolorem autem ipsa autem provident est. + project_id: Numquam quia. + status: draft + targeting: Repudiandae voluptatem vitae iste maxime modi laborum. + url: Quis et odio tenetur optio. + version: 8367189057804003789 "400": description: 'BadRequest: Bad request' content: @@ -534,6 +548,24 @@ paths: example: code: "409" message: A connection for this provider already exists on the project. + "412": + description: 'PreconditionFailed: ETag mismatch' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionFailedError' + example: + code: "412" + message: The supplied ETag does not match the current version. + "428": + description: 'PreconditionRequired: If-Match header required' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionRequiredError' + example: + code: "428" + message: An If-Match header is required. "500": description: 'InternalServerError: Internal server error' content: @@ -578,8 +610,9 @@ paths: schema: type: string description: Brief UUID - example: Repudiandae odit. - example: Cupiditate est illo repellat et cum repellat. + example: 7509879d-b17a-46bc-8080-88e3691c2522 + format: uuid + example: 8a223dd4-35ee-4368-99ff-2fcd89c1cc01 requestBody: required: true content: @@ -588,10 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Vitae reiciendis voluptatem. + config: Adipisci consequuntur omnis a. platforms: - reddit-ads - - microsoft-ads + - meta-ads + - google-ads responses: "202": description: Accepted response. @@ -600,10 +634,12 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Rerum sint optio. + job_id: Corporis architecto. platforms: - - Quos tempora dolorem dolor fugiat quia. - - Exercitationem rerum iste ducimus. + - Aut natus. + - Sint autem. + - Deleniti itaque voluptas magnam. + - Voluptatem modi velit vitae optio ut. status: queued "400": description: 'BadRequest: Bad request' @@ -676,8 +712,9 @@ paths: schema: type: string description: Brief UUID - example: Temporibus ipsum necessitatibus ratione possimus. - example: Facilis repellat eveniet reiciendis. + example: 8195f930-c608-4657-a663-c7fb3bbbcc1f + format: uuid + example: 37f4e508-72cb-404c-b000-62333f1be4ef - name: campaign_id in: path description: Campaign UUID @@ -685,8 +722,9 @@ paths: schema: type: string description: Campaign UUID - example: Consequatur sint et vel molestiae. - example: Non placeat. + example: adfc99b5-eeb9-46c5-864a-a5348085e060 + format: uuid + example: e29e4478-4e55-4995-ba2d-1e20a74f91aa responses: "200": description: OK response. @@ -696,21 +734,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus pariatur et et sed debitis. - example: Necessitatibus reprehenderit illum. + example: Labore excepturi quibusdam. + example: Saepe optio quas qui consequatur cumque. content: application/json: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Est qui molestiae rerum adipisci minima quibusdam. - campaign_name: Harum distinctio reiciendis architecto atque maxime soluta. - id: Commodi quam voluptates. - platform: Accusantium sunt culpa libero quisquam. - platform_campaign_id: Rerum amet aut tempora recusandae aspernatur. - project_id: Optio dolorem omnis. - status: Ducimus porro maxime. - version: 5829797402937558935 + brief_id: Recusandae aut perferendis. + campaign_name: Corporis ut non. + id: Voluptas aspernatur aperiam. + platform: Est eaque ipsam harum nisi nobis. + platform_campaign_id: Et eveniet. + project_id: Aliquam vero ducimus. + status: Eius sed qui deserunt perspiciatis nihil. + version: 5441532063507194963 "400": description: 'BadRequest: Bad request' content: @@ -781,8 +819,9 @@ paths: schema: type: string description: Brief UUID - example: Minima adipisci aut quia quisquam. - example: Quia facilis sit. + example: 1d638e35-bc0b-4c2e-ab43-ab65a6a17f35 + format: uuid + example: e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a - name: campaign_id in: path description: Campaign UUID @@ -790,8 +829,9 @@ paths: schema: type: string description: Campaign UUID - example: Magnam nihil qui doloremque nam magnam aliquid. - example: Possimus accusantium expedita alias. + example: 879d577b-fd07-4d30-a031-6f7df870ad66 + format: uuid + example: 24ce19fe-6f4a-48ff-b8c2-d78990409795 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -809,9 +849,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Alias ullam fugiat deserunt sint nihil iusto. - config: Necessitatibus expedita. - status: Voluptas inventore sit. + campaign_name: Itaque quos voluptatibus quos accusantium fugit. + config: Qui molestias. + status: Excepturi saepe sit vel perspiciatis neque. responses: "200": description: OK response. @@ -821,21 +861,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Incidunt sit. - example: Totam tempora quod expedita. + example: Magni qui veniam architecto deleniti adipisci. + example: Ad dignissimos sit. content: application/json: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Exercitationem consectetur. - campaign_name: Modi asperiores ut libero vel. - id: Laboriosam quis facere. - platform: Nesciunt necessitatibus ex ea ullam corrupti sunt. - platform_campaign_id: Omnis accusantium ad. - project_id: Totam sapiente vitae numquam ut nesciunt voluptas. - status: Voluptates iste autem veniam et enim unde. - version: 1765361339666375563 + brief_id: Provident officia officiis. + campaign_name: Rerum ut necessitatibus illum ratione. + id: Enim reiciendis sint neque. + platform: Ut mollitia accusantium dignissimos. + platform_campaign_id: Consequatur qui molestiae velit ratione nesciunt et. + project_id: Rerum facilis quia molestiae ratione officia. + status: Mollitia atque atque dolores accusantium non dolor. + version: 9077221317587809922 "400": description: 'BadRequest: Bad request' content: @@ -975,21 +1015,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas ipsam iste. - example: Delectus libero necessitatibus quis. + example: Vel sint nisi laborum laboriosam assumenda sed. + example: Ipsam quia ut quibusdam et. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Quis sapiente ut sit quod. + account_id: Quis quis reprehenderit non quae omnis qui. has_credentials: true - id: Ea minus enim ut. - label: Magnam ut et ab. - login_customer_id: Quae nihil magni. - project_id: Nostrum veniam qui rerum ipsum eum fugit. + id: Dolor officia eligendi. + label: At odio incidunt distinctio sint qui. + login_customer_id: Quidem odio ab accusantium aut est deleniti. + project_id: Provident dicta temporibus debitis. status: error - version: 7243034772713915274 + version: 5571372049954177452 "404": description: 'NotFound: Resource not found' content: @@ -1047,10 +1087,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. responses: "201": description: Created response. @@ -1060,21 +1100,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Commodi et nihil et. - example: Repellendus adipisci sit et enim quasi ut. + example: Possimus eum aut delectus voluptatem rerum. + example: Commodi repudiandae sequi aperiam. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Magni et rerum sed voluptatum. + account_id: Id temporibus et provident maiores neque quis. has_credentials: false - id: Veniam velit sequi sit impedit dolorum voluptas. - label: Enim est occaecati sed non dolorem distinctio. - login_customer_id: Nostrum tenetur repellendus. - project_id: Ipsum quaerat delectus cupiditate sit et. - status: deleted - version: 5181448788196437025 + id: Provident nobis soluta culpa vitae. + label: Laudantium amet veritatis rerum itaque consequatur laboriosam. + login_customer_id: Eligendi ut. + project_id: Excepturi deleniti voluptas aperiam vel. + status: error + version: 4162198444433663334 "400": description: 'BadRequest: Bad request' content: @@ -1158,21 +1198,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut sunt ex et autem delectus. - example: Occaecati placeat et. + example: Vel delectus molestias qui magnam. + example: Ipsum ullam quis est incidunt debitis qui. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Deserunt magni voluptas odio assumenda totam. + account_id: Eum est molestiae necessitatibus magni. has_credentials: true - id: Laudantium expedita ut ipsum id commodi nobis. - label: Velit sapiente qui iusto quis magni et. - login_customer_id: Officiis deleniti ipsam nam. - project_id: Vitae aut voluptatem inventore ab. - status: deleted - version: 6633489521806040497 + id: Deserunt aliquam necessitatibus. + label: In est. + login_customer_id: Deserunt ipsum dolorum quas error. + project_id: Ut et eligendi et numquam dolorum. + status: error + version: 3367774197321419764 "400": description: 'BadRequest: Bad request' content: @@ -1254,10 +1294,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. responses: "204": description: No Content response. @@ -1324,8 +1364,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Aut id molestiae sit. - ok: false + message: Fugit repellendus et accusamus sed non sequi. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -1429,24 +1469,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dolorem quia. - example: Adipisci consectetur ut modi quo et. + example: Blanditiis inventore similique est. + example: Possimus qui. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Non ut voluptas et accusamus natus id. - brand_kit: Eos voluptatibus. - has_credentials: true - id: Sit similique ut minima ut. - label: Quia enim illo et eligendi. - portal_id: Et quam architecto vero. - project_id: Voluptatum officia quod error amet quia inventore. - sender_email: Vero labore laudantium maiores. - sender_name: Reiciendis dignissimos consequatur iste qui minima. - status: deleted - version: 4350724330275405551 + account_id: Dolorem fugiat et aspernatur voluptatem nobis. + brand_kit: Delectus ex aut quia. + has_credentials: false + id: Tempore sunt itaque omnis. + label: Modi voluptatum veniam molestiae quibusdam. + portal_id: Perferendis eveniet. + project_id: Ex sunt sit beatae. + sender_email: Voluptatibus quam dicta voluptate consequuntur voluptatem est. + sender_name: Temporibus quis iste eaque ratione debitis nam. + status: inactive + version: 3577051025426830879 "404": description: 'NotFound: Resource not found' content: @@ -1500,14 +1540,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. responses: "201": description: Created response. @@ -1517,24 +1557,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Iure ut. - example: Minus id deleniti. + example: Voluptatum explicabo vero repudiandae temporibus ut. + example: Est hic enim similique et eveniet vel. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Debitis soluta sed quod dicta aperiam eveniet. - brand_kit: Voluptas expedita omnis ex. + account_id: Molestiae aut fugit alias. + brand_kit: Architecto autem iste. has_credentials: true - id: Deleniti itaque voluptas magnam. - label: Consequuntur sit libero autem ut. - portal_id: Accusantium sequi modi corrupti esse mollitia. - project_id: Voluptatem modi velit vitae optio ut. - sender_email: Saepe rerum sunt eum et qui aut. - sender_name: Ut quia harum. - status: error - version: 6360555217771164808 + id: Ea ullam minima voluptatem vel deleniti. + label: Vero at ut quis. + portal_id: Non unde. + project_id: Repudiandae necessitatibus dolorem enim beatae quia. + sender_email: Dolorum nihil sunt doloremque explicabo. + sender_name: Ut odio odio sed minus quia quia. + status: active + version: 8635749132548484011 "400": description: 'BadRequest: Bad request' content: @@ -1606,12 +1646,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. responses: "200": description: OK response. @@ -1621,24 +1661,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Eum autem quia quis soluta nostrum cumque. - example: Quia velit. + example: Reprehenderit eius distinctio voluptatum. + example: Voluptatibus sunt. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Autem recusandae totam. - brand_kit: Similique deserunt iusto. + account_id: Velit fuga quos. + brand_kit: Culpa est possimus dolores dignissimos. has_credentials: true - id: Ex delectus. - label: Officia quidem non qui voluptates natus cum. - portal_id: Odit necessitatibus veritatis amet ut rerum quidem. - project_id: Voluptas ullam dolores rem. - sender_email: Iusto velit quo voluptatibus modi reiciendis aliquam. - sender_name: Quidem explicabo expedita sunt. + id: Reprehenderit provident repudiandae sit. + label: Ut sunt aliquam. + portal_id: Sed aut quia nihil est quia. + project_id: Aut aut eos magnam quisquam et. + sender_email: Fugiat est itaque. + sender_name: Fugiat aut dicta libero. status: active - version: 3951189417473657674 + version: 2879571083312014203 "400": description: 'BadRequest: Bad request' content: @@ -1720,7 +1760,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. responses: "204": description: No Content response. @@ -1787,7 +1827,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Aspernatur possimus. + message: Laudantium error eum et aut. ok: true "404": description: 'NotFound: Resource not found' @@ -1892,21 +1932,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempore qui est. - example: Provident saepe aliquam architecto non vero. + example: Quia sequi consequatur aut dolorem. + example: Necessitatibus quam. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Accusamus vero et voluptas accusamus sunt. - has_credentials: true - id: Minus voluptas asperiores debitis labore aut. - label: Distinctio ipsa nihil ad hic repellendus nobis. - org_id: Vel blanditiis sunt ut facere. - project_id: Porro ab id necessitatibus consequatur natus tempora. - status: error - version: 4876542408988375571 + account_id: Ipsa quo vel architecto quas eligendi impedit. + has_credentials: false + id: Expedita voluptatum commodi fuga ipsa. + label: Qui quidem exercitationem. + org_id: Laudantium est ut soluta neque facilis est. + project_id: Nostrum corporis quasi magnam. + status: inactive + version: 8731305521183611402 "404": description: 'NotFound: Resource not found' content: @@ -1961,10 +2001,10 @@ paths: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. responses: "201": description: Created response. @@ -1974,21 +2014,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus aliquam aut quas aliquid. - example: Praesentium beatae quis ut eius. + example: Aspernatur enim perferendis. + example: Soluta porro distinctio cupiditate. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Facere harum enim consequatur id voluptatem. + account_id: Quam quis quam dolor occaecati earum iusto. has_credentials: true - id: Ducimus sequi. - label: Quia tenetur ducimus. - org_id: Consequatur dolorum sint voluptatem voluptas omnis est. - project_id: Autem ab voluptas culpa. + id: Occaecati et. + label: Delectus voluptatem iste nisi in. + org_id: Iste qui rerum est sed sed similique. + project_id: Natus expedita aspernatur consequuntur quod ducimus molestias. status: active - version: 4064850428710517856 + version: 6933590282461306362 "400": description: 'BadRequest: Bad request' content: @@ -2061,7 +2101,7 @@ paths: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" responses: "200": @@ -2072,21 +2112,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas consequatur iusto nostrum pariatur. - example: Quidem minus pariatur praesentium. + example: Omnis ipsam ad sed laudantium ut ea. + example: Ad a et inventore tempora facilis dolores. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Et corporis officia sint. - has_credentials: false - id: Consequatur omnis quidem est non tenetur. - label: Voluptatibus qui cupiditate voluptatem. - org_id: Quia nulla autem ratione. - project_id: Deleniti dolores commodi. - status: error - version: 874315130556833044 + account_id: Quia quisquam corrupti distinctio voluptas eius. + has_credentials: true + id: Corrupti et nobis voluptas dignissimos. + label: Ducimus modi ut culpa excepturi blanditiis. + org_id: Distinctio sunt aliquid harum quis nam rerum. + project_id: Illum et quisquam ex est facilis. + status: inactive + version: 3234333099728911322 "400": description: 'BadRequest: Bad request' content: @@ -2168,7 +2208,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. responses: "204": description: No Content response. @@ -2235,8 +2275,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Mollitia a magni vel consequatur ea deserunt. - ok: false + message: Est rerum. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -2340,22 +2380,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Deserunt reiciendis dolorem totam voluptatem. - example: Repudiandae molestias est consectetur porro quo pariatur. + example: Natus ratione. + example: Amet quam consequuntur nulla quaerat. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Aut et. - app_id: Quia laboriosam magnam unde hic. - has_credentials: false - id: Facilis facilis aut suscipit aut odio iste. - label: Tenetur velit quaerat aut. - page_id: Distinctio ea totam rem harum provident. - project_id: Deleniti earum magni quibusdam. - status: deleted - version: 5896744453366252956 + account_id: Pariatur debitis. + app_id: Omnis neque autem ex eos. + has_credentials: true + id: Est dolor ut corporis. + label: Illo vitae occaecati omnis. + page_id: Cupiditate quos hic. + project_id: Cupiditate ut illo dolor quaerat totam. + status: active + version: 1381780689877724774 "404": description: 'NotFound: Resource not found' content: @@ -2410,12 +2450,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. responses: "201": description: Created response. @@ -2425,22 +2465,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas libero pariatur ut qui sint. - example: Quasi esse corporis molestiae excepturi suscipit. + example: Aut maiores ea omnis quia quas. + example: Sunt odit molestiae ab praesentium enim. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Quibusdam vel autem modi id facere. - app_id: Possimus expedita qui. + account_id: Laboriosam qui id enim. + app_id: Qui nobis et delectus quam. has_credentials: true - id: Eius voluptatem molestiae qui suscipit rerum. - label: Rem architecto. - page_id: Et maxime. - project_id: Eligendi tempora quos. - status: deleted - version: 8688592599556109682 + id: Ipsa et dolore. + label: Expedita dignissimos non sed omnis officiis et. + page_id: Nihil corrupti repellat eius. + project_id: Velit dolores omnis placeat unde distinctio ducimus. + status: error + version: 2384980829463304567 "400": description: 'BadRequest: Bad request' content: @@ -2513,9 +2553,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. responses: "200": description: OK response. @@ -2525,22 +2565,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ut ea. - example: Aliquam eum molestiae. + example: Iure tempora non ea facilis nihil eius. + example: Corporis nesciunt ipsam voluptates magnam atque. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Vero commodi est qui asperiores velit enim. - app_id: Architecto dicta. + account_id: Magnam ut similique ea minima magnam. + app_id: Dolores est et recusandae nihil. has_credentials: true - id: Atque rerum et officiis sapiente et et. - label: Eligendi ea vel consequatur nihil. - page_id: Ut est recusandae aspernatur eum fugit voluptas. - project_id: Dolores in hic rem. + id: A necessitatibus molestiae. + label: Repellat non suscipit veritatis sit tempore. + page_id: Nam sit. + project_id: Unde dicta autem dolorem qui explicabo. status: deleted - version: 2446786767075191046 + version: 2040878603756169140 "400": description: 'BadRequest: Bad request' content: @@ -2622,8 +2662,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. responses: "204": description: No Content response. @@ -2690,8 +2730,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Numquam doloremque et qui perferendis ut. - ok: true + message: Velit atque laudantium ullam rerum. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2795,21 +2835,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Debitis iusto molestias itaque. - example: Fugit et soluta. + example: Aut mollitia. + example: Pariatur ratione blanditiis. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Doloremque architecto ea et. - customer_id: Exercitationem soluta possimus a. - has_credentials: false - id: Sed maiores qui sed exercitationem quam. - label: Et et veritatis voluptas nobis. - project_id: Non sint praesentium quia. - status: active - version: 2312965176389631300 + account_id: Vel ipsam dolores et. + customer_id: Numquam omnis ullam facilis ab sapiente. + has_credentials: true + id: Omnis autem accusamus. + label: Eligendi rerum numquam amet deserunt rem. + project_id: Est assumenda aut. + status: deleted + version: 6442954210695633704 "404": description: 'NotFound: Resource not found' content: @@ -2863,14 +2903,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. responses: "201": description: Created response. @@ -2880,21 +2920,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dolorem labore laboriosam repellat harum. - example: Aut eos. + example: Quidem est. + example: Corporis deserunt quae. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Quia sed omnis quaerat aut. - customer_id: Magnam cumque quasi magni ducimus. + account_id: Ipsa rerum velit et impedit. + customer_id: Ut velit quam omnis. has_credentials: true - id: Ducimus debitis nesciunt quas quibusdam occaecati cum. - label: Nostrum laborum minima. - project_id: Iste voluptatem et voluptatem ut ut. - status: error - version: 3654633208585641813 + id: Aut assumenda fugiat quia eaque dolor porro. + label: Qui aut quas suscipit eos. + project_id: Alias error aut maxime. + status: inactive + version: 5504009031361040663 "400": description: 'BadRequest: Bad request' content: @@ -2966,9 +3006,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. responses: "200": description: OK response. @@ -2978,21 +3018,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et qui officiis repudiandae qui iste accusantium. - example: Consequatur provident ea sint. + example: Ex quis molestias nam quia facilis. + example: Deserunt earum saepe repellat. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Quis possimus placeat. - customer_id: Et qui et. - has_credentials: true - id: Dignissimos voluptate iste. - label: Ad esse neque earum modi. - project_id: Aut qui est iste. - status: active - version: 280885210133145304 + account_id: Enim id voluptas aperiam distinctio. + customer_id: Ut et laboriosam. + has_credentials: false + id: Deleniti deserunt labore. + label: Deserunt voluptates ut culpa saepe necessitatibus veritatis. + project_id: Id aut et adipisci quo ut. + status: inactive + version: 171807855442490922 "400": description: 'BadRequest: Bad request' content: @@ -3074,10 +3114,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. responses: "204": description: No Content response. @@ -3144,8 +3184,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Quo quae aut culpa. - ok: false + message: Expedita voluptas qui eaque. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -3249,20 +3289,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Corrupti aut earum rerum ducimus dicta. - example: Perspiciatis a aut quas delectus a. + example: Aut enim. + example: Voluptas a natus est dolor voluptatum. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Incidunt aut aperiam et ipsam. + account_id: Et rerum in expedita. has_credentials: true - id: Pariatur consequatur iste sed illo. - label: Consectetur porro quo. - project_id: Sunt ipsa. - status: error - version: 6549464945762782488 + id: Voluptatum ducimus tempore quae eum consequatur dolore. + label: Quo veritatis quis delectus est. + project_id: Illum illum dolores tenetur ut illum. + status: active + version: 4673192311933251173 "404": description: 'NotFound: Resource not found' content: @@ -3317,11 +3357,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. responses: "201": description: Created response. @@ -3331,20 +3371,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consectetur delectus libero id. - example: Aut sit iste. + example: Consequatur beatae. + example: Totam dolorem. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Neque ipsum nihil cumque repellendus. - has_credentials: true - id: Sit iusto. - label: Architecto unde rerum quisquam ut. - project_id: Voluptates neque expedita. - status: inactive - version: 3464454785938965677 + account_id: Iusto omnis. + has_credentials: false + id: Odio totam cum deleniti placeat fuga. + label: Et ut quis ut. + project_id: Saepe voluptatem reiciendis pariatur. + status: error + version: 757606501996618102 "400": description: 'BadRequest: Bad request' content: @@ -3417,7 +3457,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. responses: "200": description: OK response. @@ -3427,20 +3467,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur iste eum amet vel impedit et. - example: Adipisci et laboriosam veritatis saepe numquam rem. + example: Sit dignissimos est. + example: Harum esse. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Est consequatur eveniet in fuga ut. + account_id: Aperiam cum possimus. has_credentials: false - id: Recusandae beatae aliquam quia officiis hic ea. - label: Vitae quae debitis sunt aperiam ex voluptatibus. - project_id: Ut dolor velit. - status: active - version: 2352400902970282412 + id: Veniam consectetur deserunt in hic dolorum facere. + label: Magni consequatur dignissimos itaque quia. + project_id: Et reprehenderit dignissimos. + status: error + version: 3475949958922975875 "400": description: 'BadRequest: Bad request' content: @@ -3522,9 +3562,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. responses: "204": description: No Content response. @@ -3591,7 +3631,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ratione consequuntur aut et corrupti. + message: Sed dolore dolorem voluptatibus. ok: false "404": description: 'NotFound: Resource not found' @@ -3696,21 +3736,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ullam sunt rem non doloribus. - example: Corrupti ipsum. + example: Voluptatibus ut. + example: Fugit nostrum rerum. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Dignissimos necessitatibus consequuntur. - funding_instrument_id: Ipsum voluptatem et quam beatae laborum omnis. - has_credentials: true - id: Error necessitatibus et autem doloribus est. - label: Repudiandae voluptatem vitae iste maxime modi laborum. - project_id: Maxime labore illo maxime provident. - status: error - version: 1380295609570133746 + account_id: Deserunt repellendus corrupti itaque quo sit. + funding_instrument_id: Eum et ipsum expedita reprehenderit eos. + has_credentials: false + id: Blanditiis mollitia dolores illo nostrum magnam. + label: Omnis nobis. + project_id: Nostrum tempore. + status: inactive + version: 6605548766358472787 "404": description: 'NotFound: Resource not found' content: @@ -3765,13 +3805,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. responses: "201": description: Created response. @@ -3781,21 +3821,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas esse qui quisquam quae est magni. - example: Quibusdam accusamus possimus. + example: Odio autem perferendis accusamus nulla placeat aut. + example: Aliquid quia natus. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - funding_instrument_id: Eaque animi molestias error laudantium. + account_id: Id unde veritatis officiis aut fugiat. + funding_instrument_id: Voluptas tenetur nobis facere. has_credentials: true - id: Quis et odio tenetur optio. - label: Iste eveniet laudantium rerum. - project_id: Ut sint. - status: error - version: 7980949958307848867 + id: Eaque voluptate reprehenderit sed voluptatem sed illo. + label: Cum nisi numquam. + project_id: Praesentium tenetur quas at ut necessitatibus dolor. + status: active + version: 4642810346647163563 "400": description: 'BadRequest: Bad request' content: @@ -3868,8 +3908,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. responses: "200": description: OK response. @@ -3879,21 +3919,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequuntur quia et saepe aperiam. - example: Accusamus ipsa qui. + example: Sint expedita fugit iste nemo voluptas. + example: Fugit unde ea quis. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Nobis nam. - funding_instrument_id: Reiciendis pariatur quisquam. - has_credentials: true - id: Aut quis qui laudantium dolore. - label: Non quidem doloribus debitis itaque itaque dolores. - project_id: Possimus nihil qui enim ratione voluptatem eos. - status: error - version: 7616558197057713508 + account_id: Rem error. + funding_instrument_id: Aperiam quos perferendis nisi blanditiis eveniet. + has_credentials: false + id: Aperiam et nihil. + label: Distinctio amet enim. + project_id: Perspiciatis porro. + status: inactive + version: 3440110816039158635 "400": description: 'BadRequest: Bad request' content: @@ -3975,10 +4015,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. responses: "204": description: No Content response. @@ -4045,8 +4085,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ea voluptatem eum voluptas eveniet. - ok: false + message: Enim ut corporis dolorum consequatur eius. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -4100,8 +4140,9 @@ paths: schema: type: string description: Job UUID - example: Sit harum ipsa et. - example: Dignissimos fugiat voluptatibus natus. + example: 126427cd-77bf-4d47-8ce7-9c23b3694a22 + format: uuid + example: f1fa4e30-2659-4090-9083-cfac42b3b0b1 responses: "200": description: OK response. @@ -4110,22 +4151,18 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Reiciendis et perspiciatis saepe consequatur doloribus. - job_id: Velit minus. + error: Dolore ut non error aut. + job_id: Vel natus provident. result: - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. - ok: false - platform: Dolor molestias ipsa dolorum est. - status: running + platform: Consequatur et dignissimos ex quo praesentium voluptas. + status: queued "400": description: 'BadRequest: Bad request' content: @@ -4197,44 +4234,42 @@ components: properties: copy: description: Ad copy - example: Odit odio praesentium. + example: Vitae illo consequuntur esse. etag: type: string description: ETag header value (mirrors version) - example: Eaque ratione debitis nam blanditiis. + example: Officia natus quia labore. event_details: description: Extracted event/course details - example: Dolorem fugiat et aspernatur voluptatem nobis. + example: Quia recusandae dignissimos dolore harum totam. event_slug: type: string description: Event/course slug - example: Nihil sunt doloremque. + example: Molestiae eius in reprehenderit nobis hic. id: type: string description: Brief UUID - example: Vero at ut quis. + example: Aliquid dignissimos minima aut fugit. keywords: description: Keyword list - example: Eveniet sint voluptatibus quam dicta. + example: Libero recusandae ut ullam aliquam. platforms: type: array items: type: string - example: Ea architecto autem iste. + example: Harum aliquam sunt eum. description: Suggested default platforms example: - - Ipsa tempore incidunt velit provident. - - Magni tempore sunt itaque omnis. - - Ex sunt sit beatae. - - Modi voluptatum veniam molestiae quibusdam. + - Occaecati facere voluptatibus nihil nisi. + - Distinctio tempore qui velit omnis dolorem est. program_type: type: string description: Funnel context - example: Qui maiores quia non unde deserunt. + example: Ipsum neque sapiente aliquid quidem velit. project_id: type: string description: Owning project - example: Molestiae aut fugit alias. + example: Et iure laudantium quia est molestiae. status: type: string description: Lifecycle status @@ -4245,32 +4280,33 @@ components: - archived targeting: description: Targeting recommendation - example: Consequuntur voluptatem est qui. + example: Iure consequatur minus nostrum iste nemo. url: type: string description: Event/course page URL - example: Ut ut odio odio sed minus quia. + example: Magni eos voluptatem sint hic ut. version: type: integer description: Optimistic-concurrency version - example: 6644792324746576285 + example: 3221003988771868872 format: int64 example: - copy: Iure culpa est possimus dolores dignissimos. - etag: Id eum aut et itaque. - event_details: Itaque est fugiat aut dicta. - event_slug: Magnam quisquam et consequuntur ut sunt. - id: Ex aut quia distinctio consequatur. - keywords: Velit laudantium error. + copy: Quod exercitationem. + etag: Enim nam id. + event_details: Repellendus eveniet veritatis impedit aut iste earum. + event_slug: Sequi ea ut vero consequatur possimus. + id: Ut dolores et incidunt. + keywords: Pariatur saepe ab qui et. platforms: - - Beatae sed aut quia nihil est. - - Qui fugiat. - program_type: Provident repudiandae sit qui aut aut. - project_id: Dolor corporis consequatur voluptatem voluptates sed. - status: draft - targeting: Et aut quia beatae. - url: Et velit fuga quos est. - version: 9139670973455309725 + - Et magni ad et provident. + - Non quisquam iure. + - Est ut aliquid. + program_type: Ipsam tempora est. + project_id: Ipsa fugiat assumenda. + status: archived + targeting: Laboriosam sunt quis omnis animi. + url: Assumenda sit delectus veniam. + version: 3928799509074172783 required: - id - project_id @@ -4283,39 +4319,40 @@ components: properties: copy: description: Ad copy - example: Ut aperiam voluptate voluptates. + example: Sit facere iste et alias. event_details: description: Extracted event/course details - example: Eum necessitatibus alias. + example: Ut iste et aspernatur delectus. event_slug: type: string description: Event/course slug - example: Provident dicta tenetur voluptatem voluptate dolor. + example: Aspernatur culpa sed non qui ad. id: type: string description: Brief UUID - example: Ad quis aperiam deserunt nostrum. + example: Perspiciatis ea dolor. keywords: description: Keyword list - example: Sapiente molestiae dolorum repellat expedita ut. + example: Magni ad doloremque soluta et quam totam. platforms: type: array items: type: string - example: Odio sunt esse mollitia incidunt. + example: Rerum voluptatem saepe eligendi eum non. description: Suggested default platforms example: - - Laborum sed molestias veritatis itaque. - - Est quis impedit. - - Illo harum et consequatur. + - Totam occaecati enim eaque blanditiis deleniti reprehenderit. + - Quas commodi. + - Qui mollitia architecto recusandae voluptates excepturi reiciendis. + - Consequatur amet dolorem qui. program_type: type: string description: Funnel context - example: Qui minima in nulla sunt autem eos. + example: Ratione dicta. project_id: type: string description: Owning project - example: Et sed praesentium libero. + example: Dolores qui. status: type: string description: Lifecycle status @@ -4326,33 +4363,33 @@ components: - archived targeting: description: Targeting recommendation - example: Dolor quam dolor consectetur eos iste. + example: Eos repudiandae voluptate est enim aut laborum. url: type: string description: Event/course page URL - example: Provident porro. + example: Voluptas qui. version: type: integer description: Optimistic-concurrency version - example: 709937816203366628 + example: 7978828505057037537 format: int64 example: - copy: Animi sit esse ratione aliquid. - event_details: Repudiandae tenetur aperiam saepe vel. - event_slug: Alias minus reprehenderit dignissimos aut velit. - id: Quis veniam iusto consequatur quia. - keywords: Laborum est quasi dignissimos. + copy: Autem aperiam quis. + event_details: Quae qui optio magni itaque iure. + event_slug: Consequatur velit atque nam voluptatem in. + id: Est et beatae. + keywords: Enim odit numquam. platforms: - - Omnis doloribus. - - Cum ut quo. - - Necessitatibus id sint dicta assumenda omnis voluptatem. - - Praesentium voluptatem blanditiis non totam temporibus. - program_type: Impedit dolores. - project_id: Officia eligendi alias. + - Ea ut voluptatem velit. + - Aut est est eum ut ut. + - Et molestiae blanditiis nihil dolor exercitationem. + - Placeat dolores culpa sed. + program_type: Repellendus autem ullam odio quis. + project_id: Est officiis enim qui. status: draft - targeting: Velit quis harum recusandae est ipsum. - url: At sint laborum veniam. - version: 285293330655778463 + targeting: Placeat aut dolores at. + url: Explicabo voluptatem et. + version: 2226888956028863556 required: - id - project_id @@ -4365,75 +4402,75 @@ components: properties: copy: description: Ad copy - example: Reiciendis sit minima. + example: Quia amet vero dolorum incidunt officia nihil. event_details: description: Extracted event/course details - example: Eligendi ipsam aut vel atque. + example: Optio enim nisi doloremque rerum sed consequatur. event_slug: type: string description: Event/course slug - example: Perspiciatis alias et amet ex molestiae. + example: Ut aspernatur et ad. id: type: string description: Brief UUID - example: Modi repellat eum. + example: Dignissimos voluptatem et labore sit atque qui. keywords: description: Keyword list - example: Unde et. + example: Dolores dignissimos perferendis tempore eum laboriosam iure. platforms: type: array items: type: string - example: Pariatur mollitia incidunt autem. + example: Vel aut rerum voluptatem ad minus. description: Suggested default platforms example: - - Voluptate fuga ea distinctio maiores mollitia aut. - - Rerum cum eaque nesciunt est totam inventore. + - Cum nemo esse nobis. + - Aut dolorem ea veniam. + - Quae adipisci doloribus ullam. + - Dolor eum et consequatur. program_type: type: string description: Funnel context - example: Eligendi magni quidem sit in quia. + example: Unde dolore id a necessitatibus fuga ducimus. project_id: type: string description: Owning project - example: Voluptatem eos doloribus sint. + example: Aut eaque eveniet autem. status: type: string description: Lifecycle status - example: archived + example: draft enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Ut dolores in voluptas. + example: At magnam saepe incidunt nisi est. url: type: string description: Event/course page URL - example: Minus libero et consequuntur suscipit. + example: Magnam sequi esse at. version: type: integer description: Optimistic-concurrency version - example: 3896136867528920326 + example: 3943386503686697829 format: int64 example: - copy: Sapiente harum aliquam sunt eum rerum eaque. - event_details: Voluptatem sint hic. - event_slug: Aut omnis labore et quis consequatur dolores. - id: Numquam molestias quibusdam aliquid deleniti. - keywords: Facere voluptatibus. + copy: Quos labore est ut ratione. + event_details: Sint molestiae occaecati. + event_slug: Deleniti non in iure dolores et quis. + id: Distinctio possimus. + keywords: Ut occaecati tenetur minima. platforms: - - Minima aut fugit eos et iure laudantium. - - Est molestiae voluptates ipsum neque sapiente aliquid. - - Velit sunt molestiae eius. - - Reprehenderit nobis hic eos magni. - program_type: Est natus sequi beatae. - project_id: Est aliquam debitis natus. - status: approved - targeting: Nisi repudiandae. - url: Nostrum similique omnis iste. - version: 7605661861379582739 + - Minus natus. + - Doloribus nam eius nulla suscipit ullam accusamus. + program_type: Id ducimus excepturi est et est. + project_id: Aliquid qui facilis neque sed alias. + status: archived + targeting: Sed impedit. + url: Recusandae similique assumenda ut quia. + version: 5475183181677687295 required: - id - project_id @@ -4446,76 +4483,74 @@ components: properties: copy: description: Ad copy - example: Delectus veniam vel est et magni. + example: Laborum quia beatae non et excepturi. event_details: description: Extracted event/course details - example: Vero consequatur possimus aut assumenda. + example: Molestias voluptatibus nam debitis hic qui. event_slug: type: string description: Event/course slug - example: Recusandae ut ullam aliquam dolore iure. + example: Exercitationem voluptatum perspiciatis autem. id: type: string description: Brief UUID - example: Velit omnis dolorem est aut. + example: Ut ut qui sed explicabo dolorem totam. keywords: description: Keyword list - example: Et provident illo non quisquam iure doloremque. + example: Minus officiis et quisquam dicta rerum. platforms: type: array items: type: string - example: Officia natus quia labore. + example: Sunt labore voluptate. description: Suggested default platforms example: - - Dolores et incidunt voluptatem ipsa. - - Assumenda excepturi. - - Tempora est eveniet sequi ea. + - Ipsum quo possimus saepe quam. + - Qui cum. program_type: type: string description: Funnel context - example: Consequuntur esse culpa. + example: Vero nulla laboriosam vel et et iure. project_id: type: string description: Owning project - example: Recusandae dignissimos dolore harum totam tempora vitae. + example: Qui nesciunt sed magnam. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Ut aliquid. + example: Enim est libero enim quo. url: type: string description: Event/course page URL - example: Minus nostrum iste nemo fugiat sunt. + example: Eum ut. version: type: integer description: Optimistic-concurrency version - example: 1796419171074064120 + example: 888507263129682759 format: int64 example: - copy: Commodi qui mollitia et eum veniam. - event_details: Alias voluptatem ut consequatur ut recusandae. - event_slug: Ab laboriosam sunt quis omnis. - id: Veritatis impedit aut. - keywords: Aliquam eaque voluptatem omnis. + copy: Et fuga veniam. + event_details: Aliquid eum itaque qui recusandae recusandae. + event_slug: Illum expedita commodi in dolores nemo similique. + id: Dolorem neque assumenda sed sapiente aspernatur ipsam. + keywords: Ea et iusto doloremque odio pariatur. platforms: - - Alias temporibus illum impedit ullam. - - Suscipit harum. - - Neque quia. - - Et veniam itaque optio consequatur nulla sint. - program_type: Exercitationem accusamus pariatur saepe ab qui. - project_id: Earum doloribus. - status: approved - targeting: Cupiditate aut. - url: Sunt quis odio enim nam id voluptatem. - version: 232152934679383541 + - Voluptatem libero quia. + - Harum molestiae cupiditate ab et eum ex. + - Quia velit adipisci. + program_type: Dignissimos in tempore quo consequatur sint qui. + project_id: Qui illo totam. + status: archived + targeting: Expedita animi ut velit at. + url: Autem impedit. + version: 6980228077781980481 required: - id - project_id @@ -4528,39 +4563,38 @@ components: properties: copy: description: Ad copy - example: Qui rerum numquam quo omnis a quia. + example: Quo soluta maxime temporibus earum et aperiam. event_details: description: Extracted event/course details - example: Itaque qui repudiandae magnam atque. + example: Amet officia occaecati quam nostrum quis voluptas. event_slug: type: string description: Event/course slug - example: Soluta dolore vitae. + example: Sapiente alias et error nobis minima. id: type: string description: Brief UUID - example: Minima iure quos enim occaecati beatae. + example: Ratione est omnis voluptas praesentium. keywords: description: Keyword list - example: Culpa ipsam totam nulla. + example: Ab itaque tempore vel quia cum quas. platforms: type: array items: type: string - example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. + example: Fuga maxime tempora rem. description: Suggested default platforms example: - - Voluptatem aut debitis vitae unde velit eos. - - Accusantium odit rerum commodi ea. - - Consequatur et. + - Debitis rerum. + - Dolor pariatur. program_type: type: string description: Funnel context - example: Quaerat et eius culpa magni illum consequatur. + example: Laboriosam et. project_id: type: string description: Owning project - example: Molestiae ad voluptatum ducimus accusantium et. + example: Aspernatur voluptatum facilis. status: type: string description: Lifecycle status @@ -4571,32 +4605,32 @@ components: - archived targeting: description: Targeting recommendation - example: Molestias sint sequi. + example: Minus sit necessitatibus. url: type: string description: Event/course page URL - example: In commodi et asperiores et. + example: Reprehenderit dolorem impedit qui suscipit ipsa ut. version: type: integer description: Optimistic-concurrency version - example: 122602759626083426 + example: 4889810267187914144 format: int64 example: - copy: Fuga atque. - event_details: Qui omnis nesciunt qui consequuntur. - event_slug: Minima dolorem sit est tempora qui. - id: Placeat perferendis omnis ad voluptas. - keywords: Sequi culpa. + copy: Excepturi cumque ullam esse. + event_details: Quia voluptates voluptates nisi nihil aut molestias. + event_slug: Sed commodi voluptatibus. + id: Et est debitis ea. + keywords: Non autem voluptatem ut. platforms: - - Praesentium cumque illum pariatur odio molestias voluptatum. - - Nulla perferendis possimus deserunt iure et. - - Ea quidem ducimus tempora ea molestias. - program_type: Enim totam. - project_id: Voluptates laboriosam cumque mollitia quidem quo. - status: draft - targeting: Odit provident sed quo aperiam. - url: Voluptas necessitatibus cumque non porro qui molestias. - version: 4353559979947303924 + - Facilis asperiores enim nisi. + - Perspiciatis optio. + - Quia doloribus omnis et excepturi fugit dolores. + program_type: Nemo molestiae modi ut non atque. + project_id: Eum voluptatum accusamus illo eveniet eum. + status: approved + targeting: Distinctio non recusandae et qui ut exercitationem. + url: Nobis est fugit ratione consectetur exercitationem. + version: 1659901820906198210 required: - id - project_id @@ -4609,56 +4643,54 @@ components: properties: copy: description: Ad copy - example: Voluptas aperiam. + example: Tempora voluptate fuga ea distinctio. event_details: description: Extracted event/course details - example: Dolores enim. + example: Pariatur mollitia incidunt autem. event_slug: type: string description: Event/course slug (unique within the project) - example: Rerum numquam amet deserunt rem quia. + example: Quis harum recusandae. keywords: description: Keyword list - example: Assumenda harum eos eveniet ut et laboriosam. + example: Mollitia aut tempore rerum. platforms: type: array items: type: string - example: Numquam omnis ullam facilis ab sapiente. + example: Repellat eum totam voluptatem eos doloribus. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Esse voluptate eum laboriosam distinctio non. - - Deserunt labore et id aut et adipisci. - - Ut molestiae. - - Voluptates ut culpa saepe necessitatibus. + - Eligendi magni quidem sit in quia. + - Perspiciatis alias et amet ex molestiae. + - Minus libero et consequuntur suscipit. program_type: type: string description: Funnel context - example: education + example: membership enum: - events - education - membership targeting: description: Targeting recommendation - example: Quos expedita voluptas qui eaque. + example: Eaque nesciunt. url: type: string description: Event/course page URL - example: Ipsam dolores et et qui ut. + example: Ipsum est amet quaerat. example: - copy: Porro ut et cupiditate. - event_details: Non assumenda perspiciatis. - event_slug: Nostrum ratione id. - keywords: Ea ullam minima voluptatem vel deleniti. + copy: Beatae consectetur aut omnis labore et quis. + event_details: Natus deleniti est natus. + event_slug: Inventore in eligendi ipsam. + keywords: Dolores repellat. platforms: - - Quae molestiae suscipit non iusto. - - Consequatur in vero soluta. - - Eius dicta. - - Ullam distinctio dolore velit. + - Itaque ut dolores in. + - Expedita placeat dolores numquam molestias. + - Aliquid deleniti fuga est aliquam. program_type: education - targeting: Repudiandae necessitatibus dolorem enim beatae quia. - url: Laborum aspernatur voluptate itaque fugit. + targeting: Similique omnis. + url: Vel atque eos reiciendis sit minima non. required: - program_type - event_slug @@ -4668,50 +4700,50 @@ components: brief_id: type: string description: Parent brief - example: Aut ut. + example: Voluptas necessitatibus cumque non porro qui molestias. campaign_name: type: string description: Campaign name - example: Aut ut sit nisi architecto. + example: Nulla perferendis possimus deserunt iure et. etag: type: string description: ETag header value (mirrors version) - example: Voluptate enim qui impedit temporibus. + example: Omnis nesciunt qui. id: type: string description: Campaign UUID - example: Et vel beatae molestiae fuga. + example: Et minima dolorem sit. platform: type: string description: Channel - example: Sed corrupti sit. + example: In praesentium cumque. platform_campaign_id: type: string description: ID returned by the ad platform - example: Labore quia esse consectetur tenetur eum. + example: Pariatur odio molestias voluptatum. project_id: type: string description: Owning project - example: Vitae consequatur eos. + example: Tempora qui. status: type: string description: Campaign status - example: Rerum et recusandae possimus quis. + example: Ea quidem ducimus tempora ea molestias. version: type: integer description: Optimistic-concurrency version - example: 9161333083936888105 + example: 971659538665007246 format: int64 example: - brief_id: Explicabo repudiandae aut reiciendis recusandae molestias. - campaign_name: Hic est quia pariatur odit ullam. - etag: Quisquam nisi repellendus quos magnam aut. - id: Eos omnis cumque nemo ipsam ut. - platform: Vel inventore aliquid aut non eligendi accusamus. - platform_campaign_id: Quod impedit accusamus incidunt minus veritatis enim. - project_id: Natus et unde. - status: Ex id corrupti sed quo perferendis. - version: 7863921121752869750 + brief_id: Odit provident sed quo aperiam. + campaign_name: Voluptatem repellat expedita inventore. + etag: Maxime hic aliquam ratione ipsum. + id: Quia fuga atque. + platform: Aspernatur nihil et incidunt dolorem dolor sed. + platform_campaign_id: Delectus harum voluptates sit est corporis. + project_id: Sequi culpa. + status: Necessitatibus ut necessitatibus in. + version: 5532967292288417247 required: - id - project_id @@ -4726,45 +4758,45 @@ components: brief_id: type: string description: Parent brief - example: Voluptates sit est corporis molestiae voluptatem. + example: Et iste. campaign_name: type: string description: Campaign name - example: Ratione ipsum. + example: Rerum reiciendis similique. id: type: string description: Campaign UUID - example: Et incidunt. + example: Ea laboriosam totam unde. platform: type: string description: Channel - example: Expedita inventore qui necessitatibus ut necessitatibus in. + example: Voluptas ut nostrum officiis et accusamus provident. platform_campaign_id: type: string description: ID returned by the ad platform - example: Autem maxime hic. + example: Odio eos earum fuga non est. project_id: type: string description: Owning project - example: Dolor sed excepturi delectus. + example: Ipsa sint optio nobis quae corporis. status: type: string description: Campaign status - example: Amet hic est. + example: Tempora qui incidunt tempora. version: type: integer description: Optimistic-concurrency version - example: 906675377577277444 + example: 7916176946868712323 format: int64 example: - brief_id: Magnam voluptates molestiae libero autem quod. - campaign_name: Sunt accusantium totam quia. - id: Occaecati rerum reiciendis. - platform: Ullam ipsum. - platform_campaign_id: Dolores dolore id dolore sed. - project_id: Esse mollitia et dolorum accusantium aspernatur quos. - status: Accusantium debitis adipisci qui iste explicabo. - version: 9006499932988805057 + brief_id: Voluptas incidunt eligendi consequatur. + campaign_name: Earum temporibus ipsum necessitatibus ratione possimus eum. + id: Voluptatem dolores tempora qui sit. + platform: Labore eos et repudiandae odit omnis cupiditate. + platform_campaign_id: Illo repellat et cum. + project_id: Voluptates soluta animi sit ut. + status: Repellat eveniet reiciendis consequatur consequatur sint. + version: 2970088391723074573 required: - id - project_id @@ -4779,45 +4811,45 @@ components: brief_id: type: string description: Parent brief - example: Dolor quia consectetur non nulla dolore. + example: Et et sed. campaign_name: type: string description: Campaign name - example: Quos omnis. + example: Minima adipisci aut quia quisquam. id: type: string description: Campaign UUID - example: Qui quia. + example: Molestiae quo non. platform: type: string description: Channel - example: Ducimus voluptas soluta quod qui. + example: Vel quaerat iure ipsam. platform_campaign_id: type: string description: ID returned by the ad platform - example: Fugiat est omnis inventore voluptatum ab totam. + example: Necessitatibus reprehenderit illum. project_id: type: string description: Owning project - example: Ipsam sint autem repudiandae asperiores. + example: Reprehenderit natus. status: type: string description: Campaign status - example: Libero consequatur. + example: Quia facilis sit. version: type: integer description: Optimistic-concurrency version - example: 3986034538934721868 + example: 7577275663228988931 format: int64 example: - brief_id: Reiciendis odit eos et quidem. - campaign_name: Quae voluptatem velit mollitia dolorem ea. - id: Sapiente ex est modi cupiditate possimus ducimus. - platform: Atque hic quam impedit placeat. - platform_campaign_id: Voluptatibus aliquam et. - project_id: Modi consequatur molestias et et deleniti. - status: Enim voluptas numquam. - version: 616047483519279742 + brief_id: Molestiae cupiditate quis modi blanditiis. + campaign_name: Distinctio dignissimos. + id: Nihil qui doloremque nam magnam aliquid impedit. + platform: Tempora quod expedita magni. + platform_campaign_id: Harum ipsa. + project_id: Accusantium expedita alias placeat incidunt sit perspiciatis. + status: Voluptatibus natus tempora commodi et. + version: 6630207652424081561 required: - id - project_id @@ -4831,7 +4863,7 @@ components: properties: config: description: Per-platform campaign configuration - example: Qui libero natus. + example: Ullam eaque suscipit harum. platforms: type: array items: @@ -4847,16 +4879,15 @@ components: - hubspot description: Platforms to create campaigns on (binding selection) example: - - microsoft-ads - meta-ads - - twitter-ads - - hubspot + - google-ads + - reddit-ads + - reddit-ads example: - config: Vitae officia dolorem. + config: Et veniam itaque optio consequatur nulla sint. platforms: - - meta-ads - - twitter-ads - - hubspot + - reddit-ads + - linkedin-ads required: - platforms CampaignUpdateInput: @@ -4865,18 +4896,18 @@ components: campaign_name: type: string description: Campaign name - example: Id voluptatem nihil quaerat asperiores. + example: Amet hic est. config: description: Campaign configuration snapshot - example: Error perferendis quae qui inventore dolorem. + example: Quae esse mollitia et dolorum. status: type: string description: Campaign status - example: Repellat vel veritatis hic rerum accusamus. + example: Quaerat occaecati rerum. example: - campaign_name: Quasi in aut nam rerum. - config: Architecto deserunt vero ducimus distinctio. - status: Distinctio magnam. + campaign_name: Aspernatur quos est magnam voluptates. + config: Dolores dolore id dolore sed. + status: Libero autem quod saepe ullam ipsum. required: - campaign_name - status @@ -4920,14 +4951,14 @@ components: message: type: string description: Human-readable detail - example: Magni aut nisi est sit sint. + example: Accusantium totam quia. ok: type: boolean description: Whether the credential authenticated against the provider - example: false + example: true example: - message: Et voluptas dolorem necessitatibus illum quisquam. - ok: true + message: Debitis adipisci. + ok: false required: - ok CreateBriefRequestBody: @@ -4937,17 +4968,18 @@ components: $ref: '#/components/schemas/BriefInput' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. required: - brief CreateCampaignsRequestBody: @@ -4957,10 +4989,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Vitae reiciendis voluptatem. + config: Adipisci consequuntur omnis a. platforms: - reddit-ads - - microsoft-ads + - meta-ads + - google-ads required: - input CreateGoogleAdsRequestBody: @@ -4976,10 +5009,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - config - credentials @@ -4992,14 +5025,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - config - credentials @@ -5013,10 +5046,10 @@ components: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - config - credentials @@ -5030,12 +5063,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - config - credentials @@ -5048,14 +5081,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. required: - config - credentials @@ -5069,11 +5102,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - config - credentials @@ -5087,13 +5120,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - config - credentials @@ -5103,35 +5136,35 @@ components: account_id: type: string description: Provider account identifier - example: Velit quis. + example: Voluptatibus aliquam et. etag: type: string description: ETag header value (mirrors version) - example: Vel architecto quae error dolor placeat. + example: Mollitia dolorem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatem nostrum. + example: Modi consequatur molestias et et deleniti. label: type: string description: Optional friendly name - example: Ut nobis. + example: Atque hic quam impedit placeat. login_customer_id: type: string description: Manager account used for API access - example: Minus et. + example: Consequatur enim voluptas numquam aut et. project_id: type: string description: Owning project - example: Deleniti voluptas quo nostrum quia. + example: Reiciendis odit eos et quidem. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5140,18 +5173,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7197135224651925465 + example: 2538353845791645445 format: int64 example: - account_id: Nostrum atque illum nesciunt adipisci odit corrupti. - etag: Voluptas omnis quidem dolor ipsum voluptas sed. + account_id: Rem fugit accusantium est. + etag: Dolorem asperiores autem aut aut soluta. has_credentials: true - id: Fugiat aliquid aspernatur voluptatem in cupiditate. - label: Iusto fugit non asperiores quidem natus. - login_customer_id: Id ea. - project_id: Et dolorem quod. - status: deleted - version: 8604742619872904748 + id: Eius dolor magnam necessitatibus amet. + label: Rerum tempore tempora. + login_customer_id: Et est et corporis. + project_id: Earum aut qui. + status: active + version: 6983147448769937945 required: - id - project_id @@ -5166,7 +5199,7 @@ components: account_id: type: string description: Provider account identifier - example: Rem fugit accusantium est. + example: Sed ipsam enim esse iure est. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5174,19 +5207,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Iusto eius dolor magnam necessitatibus amet. + example: Minima dolorem omnis aspernatur veritatis adipisci. label: type: string description: Optional friendly name - example: Rerum tempore tempora. + example: Voluptas ipsam iste. login_customer_id: type: string description: Manager account used for API access - example: Dolorem asperiores autem aut aut soluta. + example: Quis quod aut sunt ex et autem. project_id: type: string description: Owning project - example: Earum aut qui. + example: Repellendus adipisci sit et enim quasi ut. status: type: string description: Connection status @@ -5199,17 +5232,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6983147448769937945 + example: 5457180552368415477 format: int64 example: - account_id: Officia dolores et reprehenderit. - has_credentials: false - id: Et est et corporis. - label: Aut explicabo. - login_customer_id: Rerum rem. - project_id: Voluptate est reprehenderit consectetur accusamus eaque inventore. - status: deleted - version: 8504196254053832609 + account_id: Natus aliquam aut quas aliquid. + has_credentials: true + id: Non adipisci omnis veritatis omnis. + label: Placeat et. + login_customer_id: Laboriosam praesentium beatae quis. + project_id: Omnis reprehenderit. + status: active + version: 5939335900418206229 required: - id - project_id @@ -5223,31 +5256,31 @@ components: account_id: type: string description: Provider account identifier - example: Et vel dolorum aut inventore consequatur. + example: Vero provident voluptas consequatur iusto. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Vitae qui explicabo tempora accusantium aut. + example: Eius harum. label: type: string description: Optional friendly name - example: Nobis qui sunt laboriosam ipsa. + example: Nihil excepturi provident saepe aliquam architecto. login_customer_id: type: string description: Manager account used for API access - example: Dicta ut. + example: Ut magnam aut illum commodi placeat sed. project_id: type: string description: Owning project - example: In vel. + example: Qui est nemo ullam. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -5256,17 +5289,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5579476471615779331 + example: 8077434258112236542 format: int64 example: - account_id: Alias quod minima blanditiis. - has_credentials: true - id: Beatae error deleniti vitae molestiae qui nobis. - label: Quia enim non asperiores velit. - login_customer_id: Iure dolores dolores dolorem sit nihil. - project_id: Aut temporibus dolorem cumque quis. - status: inactive - version: 4548596825330631938 + account_id: Voluptas quasi esse corporis. + has_credentials: false + id: Minus pariatur praesentium amet. + label: Sint velit earum laboriosam dignissimos reiciendis et. + login_customer_id: Deserunt reiciendis dolorem totam voluptatem. + project_id: Libero pariatur ut. + status: active + version: 6561992588765026566 required: - id - project_id @@ -5280,7 +5313,7 @@ components: account_id: type: string description: Provider account identifier - example: Ipsam eligendi est dolore. + example: Laudantium doloremque aut eligendi perferendis aut. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5288,19 +5321,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Sit est atque qui quaerat qui vitae. + example: Amet qui provident. label: type: string description: Optional friendly name - example: Optio in ratione accusamus quasi. + example: Ut ea. login_customer_id: type: string description: Manager account used for API access - example: Quos excepturi natus est est. + example: Ea consectetur delectus. project_id: type: string description: Owning project - example: Optio non. + example: Repudiandae molestias est consectetur porro quo pariatur. status: type: string description: Connection status @@ -5313,17 +5346,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6617602369183761406 + example: 10157424754048271 format: int64 example: - account_id: Quibusdam ea nam aut. - has_credentials: false - id: Doloribus unde id aut perspiciatis. - label: Sit totam ut et. - login_customer_id: Est consequatur rerum neque velit nulla modi. - project_id: Adipisci ut. - status: active - version: 926393304108038988 + account_id: Aut earum rerum ducimus dicta velit. + has_credentials: true + id: Id officiis architecto. + label: Sit iste ea. + login_customer_id: Molestiae dolorum non perspiciatis a. + project_id: Et libero ea aut omnis. + status: error + version: 8687544223346888800 required: - id - project_id @@ -5358,25 +5391,25 @@ components: client_id: type: string description: OAuth client id - example: In consectetur et culpa quaerat vel sed. + example: Sint autem repudiandae asperiores et. client_secret: type: string description: OAuth client secret - example: Et impedit quod. + example: Quia consectetur non nulla dolore quibusdam ducimus. developer_token: type: string description: Google Ads developer token - example: Magni omnis. + example: Soluta quod. refresh_token: type: string description: OAuth refresh token - example: Ipsa nihil esse. + example: Iste explicabo minima commodi qui quia est. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Sit id incidunt. - client_secret: Non sed hic minima est distinctio. - developer_token: A perferendis. - refresh_token: Facere eum aliquid est repellat assumenda. + client_id: Omnis inventore voluptatum ab. + client_secret: Laboriosam quos omnis deserunt libero consequatur quisquam. + developer_token: Sapiente ex est modi cupiditate possimus ducimus. + refresh_token: At fugiat. required: - refresh_token - client_id @@ -5388,15 +5421,15 @@ components: account_id: type: string description: Provider account identifier - example: Error eligendi incidunt accusamus excepturi inventore. + example: Sint suscipit. brand_kit: type: string description: Per-project brand kit selector - example: Aut architecto aliquam mollitia labore sapiente. + example: Quo veritatis nisi velit distinctio animi. etag: type: string description: ETag header value (mirrors version) - example: Quod minima dolor. + example: Non neque optio. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5404,27 +5437,27 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Nihil facilis sunt. + example: Dolore voluptatem qui eveniet amet. label: type: string description: Optional friendly name - example: Ut beatae eaque quo atque. + example: Voluptate et. portal_id: type: string description: HubSpot portal/account ID - example: Molestiae id aut debitis iure. + example: Architecto molestiae cum. project_id: type: string description: Owning project - example: Vero ad ex consequatur dolore. + example: Qui pariatur odio reprehenderit nam. sender_email: type: string description: Default sender address - example: Dolore est dolorem quod enim pariatur. + example: Perspiciatis consequatur beatae sunt officiis sequi qui. sender_name: type: string description: Default sender name - example: Occaecati veritatis. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. status: type: string description: Connection status @@ -5437,21 +5470,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7262698057225531796 + example: 6078188127403523196 format: int64 example: - account_id: Ad quae nisi. - brand_kit: Incidunt voluptas non necessitatibus. - etag: Cum et ab ipsum. - has_credentials: true - id: Tenetur non accusamus qui ex. - label: Ex et amet sunt. - portal_id: Qui nemo nihil dolorum consequatur. - project_id: Quia mollitia. - sender_email: Tempora qui eum hic vel aspernatur at. - sender_name: Est ea sed sit. - status: deleted - version: 7589133128297342291 + account_id: Dolor molestiae quia voluptatem deserunt libero. + brand_kit: Molestiae soluta vel ad et in voluptatem. + etag: Aut impedit a veritatis. + has_credentials: false + id: Provident rerum et voluptas tenetur esse. + label: Quaerat ipsa voluptatem. + portal_id: Consequuntur sed ea sunt debitis. + project_id: Assumenda sed minima nihil. + sender_email: Voluptas qui voluptas veniam sint voluptas. + sender_name: Non illo ab in voluptatem minus est. + status: active + version: 1552956989772584247 required: - id - project_id @@ -5466,11 +5499,11 @@ components: account_id: type: string description: Provider account identifier - example: Non in iure dolores et quis id. + example: Eius quo. brand_kit: type: string description: Per-project brand kit selector - example: Accusamus corrupti sint molestiae occaecati est quos. + example: Dolorem impedit sint consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5478,27 +5511,27 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Sint consequuntur omnis distinctio possimus non aliquid. + example: Iusto in commodi velit in odio. label: type: string description: Optional friendly name - example: Excepturi est et est totam. + example: Non architecto. portal_id: type: string description: HubSpot portal/account ID - example: Quia sed nesciunt minus. + example: Et corrupti magnam deleniti nam laboriosam esse. project_id: type: string description: Owning project - example: Facilis neque sed alias dolore id. + example: Aliquam voluptatem sunt et eveniet. sender_email: type: string description: Default sender address - example: Non doloribus nam. + example: Eaque ut voluptatibus qui qui officia. sender_name: type: string description: Default sender name - example: Nulla suscipit. + example: Alias quis voluptates nihil odio facere magnam. status: type: string description: Connection status @@ -5511,20 +5544,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1661229305097180791 + example: 7096858184495555885 format: int64 example: - account_id: Totam non qui. - brand_kit: Sunt labore voluptate. - has_credentials: true - id: Est ut ratione nobis. - label: Qui ut ut qui sed explicabo. - portal_id: Vero nulla laboriosam vel et et iure. - project_id: Occaecati tenetur minima veritatis sed impedit laborum. - sender_email: Exercitationem voluptatum perspiciatis autem. - sender_name: Eum ut. - status: active - version: 5481070480011205228 + account_id: Officia suscipit qui molestias aliquid dolorum consequatur. + brand_kit: Hic ea et. + has_credentials: false + id: Nihil labore accusamus illum in delectus magnam. + label: Porro voluptatum nemo adipisci. + portal_id: Enim aut. + project_id: Velit sed laboriosam placeat nesciunt. + sender_email: Dolores sed. + sender_name: Optio enim repellendus commodi quia quod sit. + status: inactive + version: 3587423604677944667 required: - id - project_id @@ -5538,11 +5571,11 @@ components: account_id: type: string description: Provider account identifier - example: Consequatur laborum. + example: Eligendi corporis tenetur delectus excepturi et. brand_kit: type: string description: Per-project brand kit selector - example: Aut tempora dolorem neque assumenda sed. + example: Ut est est mollitia. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5550,31 +5583,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Cum ipsum quo possimus. + example: Aperiam impedit omnis explicabo. label: type: string description: Optional friendly name - example: Cum ipsa molestias voluptatibus nam debitis hic. + example: Enim temporibus facere. portal_id: type: string description: HubSpot portal/account ID - example: Excepturi sit minus. + example: Id libero sunt. project_id: type: string description: Owning project - example: Quam culpa. + example: Et et commodi autem. sender_email: type: string description: Default sender address - example: Et quisquam dicta. + example: Suscipit consequatur iure dolor sit quis ut. sender_name: type: string description: Default sender name - example: Eaque enim est libero enim quo. + example: Natus enim non. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5583,20 +5616,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2473646846997850541 + example: 2722095064844656519 format: int64 example: - account_id: Similique eaque autem impedit tenetur voluptatibus. - brand_kit: Et fuga veniam. + account_id: Doloribus similique et. + brand_kit: Voluptas earum provident qui. has_credentials: true - id: Aspernatur ipsam consequatur qui illo totam fuga. - label: Qui non illum expedita commodi in dolores. - portal_id: Harum molestiae cupiditate ab et eum ex. - project_id: In tempore quo consequatur. - sender_email: Quia velit adipisci. - sender_name: Aliquid eum itaque qui recusandae recusandae. - status: deleted - version: 5418486313404831501 + id: Corporis omnis. + label: Delectus nisi minima quas voluptatem consequuntur. + portal_id: Aliquam dolorem voluptas autem enim aut ut. + project_id: Ea in sunt odit aspernatur. + sender_email: Eum ut rem illum. + sender_name: Autem ratione est exercitationem sapiente a animi. + status: error + version: 6167429858997341484 required: - id - project_id @@ -5610,11 +5643,11 @@ components: account_id: type: string description: Provider account identifier - example: Praesentium eos aspernatur voluptatum facilis laboriosam. + example: Quam aliquid reiciendis maiores similique ab. brand_kit: type: string description: Per-project brand kit selector - example: Ab earum. + example: Iure consectetur libero. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5622,31 +5655,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ea et iusto doloremque odio pariatur. + example: Facere dolorum rem laborum dolor provident. label: type: string description: Optional friendly name - example: Autem aliquid ratione est omnis. + example: Vitae voluptas fuga aut minima inventore tenetur. portal_id: type: string description: HubSpot portal/account ID - example: Alias et error nobis minima fuga reprehenderit. + example: Accusamus optio consequatur excepturi rerum. project_id: type: string description: Owning project - example: Expedita animi ut velit at. + example: Odio aut suscipit. sender_email: type: string description: Default sender address - example: Impedit qui suscipit ipsa. + example: In officiis dolores delectus architecto. sender_name: type: string description: Default sender name - example: Animi fuga maxime tempora. + example: Velit eligendi omnis est vel est et. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5655,20 +5688,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2736756583759126082 + example: 7137337173165660443 format: int64 example: - account_id: Ab itaque tempore vel quia cum quas. - brand_kit: Sed commodi voluptatibus. + account_id: Ratione architecto corporis totam et. + brand_kit: Tempora reprehenderit eveniet. has_credentials: true - id: Rerum perspiciatis dolor pariatur. - label: Quo soluta maxime temporibus earum et aperiam. - portal_id: Ipsa aut est et est debitis ea. - project_id: Amet officia occaecati quam nostrum quis voluptas. - sender_email: Eum voluptatum accusamus illo eveniet eum. - sender_name: Nemo molestiae modi ut non atque. - status: deleted - version: 5960975059584485019 + id: Accusamus aut deleniti libero veritatis cum. + label: Quidem perferendis. + portal_id: Tempora magnam ea repellat qui. + project_id: Deleniti dolorem voluptas harum soluta repudiandae quisquam. + sender_email: Eveniet dolor necessitatibus est mollitia. + sender_name: Officiis dolorem necessitatibus blanditiis rerum. + status: active + version: 6334382601164890326 required: - id - project_id @@ -5682,34 +5715,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Minus voluptatem ab delectus porro. + example: Totam et voluptates atque consequatur consequuntur voluptates. brand_kit: type: string description: Per-project brand kit selector - example: Modi esse voluptatibus. + example: Adipisci minus et vero. label: type: string description: Optional friendly name - example: Mollitia nulla. + example: Commodi facere vel. portal_id: type: string description: HubSpot portal/account ID - example: Veniam molestias. + example: Quos provident. sender_email: type: string description: Default sender address - example: Accusamus quia velit commodi. + example: Et fugiat reprehenderit officiis modi quae consequatur. sender_name: type: string description: Default sender name - example: Tenetur cumque rerum. + example: Et culpa culpa veritatis. example: - account_id: Hic magni. - brand_kit: Nihil atque. - label: Fugit dolorum nulla quo veritatis id. - portal_id: Et optio sed omnis aut voluptatem voluptas. - sender_email: Eum omnis est blanditiis maxime et. - sender_name: Et eum inventore quisquam. + account_id: Ea et quidem quibusdam officiis dolor. + brand_kit: Aut mollitia pariatur perferendis placeat dolores. + label: Ea perspiciatis rerum occaecati incidunt deleniti sunt. + portal_id: Nisi sunt. + sender_email: Sint dolor eaque culpa. + sender_name: Eius omnis id itaque. required: - account_id HubspotCredentials: @@ -5718,10 +5751,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Quia omnis in qui. + example: Molestiae veniam exercitationem blanditiis ratione non. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Nihil ut. + private_app_token: Sed dolorum cupiditate quia qui dicta. required: - private_app_token InternalServerError: @@ -5747,16 +5780,16 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Ut beatae quia. + example: Alias voluptatem ut consequatur ut recusandae. platforms: type: array items: type: string - example: Minima illo dolores natus a sint. + example: Qui mollitia et eum veniam. description: Platforms this job will create on example: - - Quae et nesciunt iure quis in. - - Mollitia nihil ducimus. + - Eaque voluptatem omnis architecto cupiditate. + - Sint culpa sed minima. status: type: string description: Initial status (always 'queued' on create) @@ -5764,10 +5797,11 @@ components: enum: - queued example: - job_id: Non quo necessitatibus. + job_id: Quos enim. platforms: - - Accusantium laudantium nostrum earum dolores. - - Eos exercitationem. + - Molestiae ad voluptatum ducimus accusantium et. + - Quaerat et eius culpa magni illum consequatur. + - Soluta dolore vitae. status: queued required: - job_id @@ -5778,33 +5812,33 @@ components: error: type: string description: Terminal error, if any - example: Hic vel ut. + example: Sequi aut veniam ratione. job_id: type: string description: Job UUID - example: Illo accusamus. + example: Quia magnam culpa ipsam totam nulla. result: type: array items: $ref: '#/components/schemas/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + platform: Ut totam ut. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + platform: Ut totam ut. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. + platform: Ut totam ut. status: type: string description: Job status - example: queued + example: running enum: - queued - running @@ -5812,22 +5846,18 @@ components: - partial - failed example: - error: Dolores quidem necessitatibus voluptatem consequatur sit. - job_id: Earum minus autem omnis qui debitis eum. + error: Mollitia quidem quo et enim. + job_id: Perferendis omnis ad voluptas esse. result: - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. - ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + platform: Ut totam ut. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - status: running + platform: Ut totam ut. + status: failed required: - job_id - status @@ -5837,11 +5867,11 @@ components: account_id: type: string description: Provider account identifier - example: Quidem omnis totam eos non molestias. + example: Nobis qui sunt laboriosam ipsa. etag: type: string description: ETag header value (mirrors version) - example: Recusandae illum accusamus debitis. + example: Aut inventore consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5849,23 +5879,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Doloribus voluptas mollitia doloremque totam. + example: Rerum rem. label: type: string description: Optional friendly name - example: Quia doloremque commodi rerum. + example: In vel. org_id: type: string description: LinkedIn organization URN id - example: Praesentium sint laudantium error. + example: Autem eaque eaque dicta ut magni. project_id: type: string description: Owning project - example: Veniam et ducimus quos amet. + example: Vitae qui explicabo tempora accusantium aut. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5874,18 +5904,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6150421422111226538 + example: 3265309804259735983 format: int64 example: - account_id: Quas quis corporis. - etag: Ea ducimus ipsum dolorem dignissimos. + account_id: Alias quod minima blanditiis. + etag: Iure dolores dolores dolorem sit nihil. has_credentials: true - id: Nihil iure officiis nemo quia. - label: Et quia ex et alias ea. - org_id: Quo ullam ad iusto quos. - project_id: Ducimus id sint eius aut. + id: Error deleniti vitae molestiae qui nobis. + label: Quia enim non asperiores velit. + org_id: Sit est atque qui quaerat qui vitae. + project_id: Aut temporibus dolorem cumque quis. status: inactive - version: 2540282771582052941 + version: 4548596825330631938 required: - id - project_id @@ -5900,31 +5930,31 @@ components: account_id: type: string description: Provider account identifier - example: Sit soluta quia qui. + example: Et laboriosam veritatis saepe numquam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Optio quia similique vero est impedit quo. + example: Quas delectus a maxime consequatur iste eum. label: type: string description: Optional friendly name - example: Libero officia et quia. + example: Et at iusto optio. org_id: type: string description: LinkedIn organization URN id - example: Expedita sed velit distinctio. + example: Qui quisquam quae. project_id: type: string description: Owning project - example: Nihil at. + example: Vel impedit et unde et rerum. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -5933,17 +5963,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1438953144952054594 + example: 1129434020019069718 format: int64 example: - account_id: Optio rerum vel molestiae id. - has_credentials: false - id: Necessitatibus eos rerum. - label: Qui quas aut provident suscipit. - org_id: Reiciendis excepturi. - project_id: Veniam amet et quisquam voluptatem fuga. + account_id: Ea nostrum corrupti ipsum minima consequuntur. + has_credentials: true + id: Magni temporibus et molestias. + label: Iste ullam sunt rem non doloribus omnis. + org_id: Hic et illo aut natus et accusamus. + project_id: Molestias et officiis asperiores quibusdam accusamus. status: active - version: 8349066598252210000 + version: 8161899588231294433 required: - id - project_id @@ -5957,7 +5987,7 @@ components: account_id: type: string description: Provider account identifier - example: Aut temporibus. + example: Eos quidem debitis iusto molestias itaque consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5965,23 +5995,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aut tenetur. + example: Qui et dolorem. label: type: string description: Optional friendly name - example: Iure aut tenetur ipsum ea ad ducimus. + example: Expedita error cumque. org_id: type: string description: LinkedIn organization URN id - example: Voluptatem libero. + example: Fugit et soluta. project_id: type: string description: Owning project - example: Et et. + example: Laboriosam repellat harum expedita aut quidem beatae. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5990,17 +6020,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8572511867951081487 + example: 7037294126068689767 format: int64 example: - account_id: Accusamus eos neque velit. + account_id: Iure ut. has_credentials: true - id: Eligendi non. - label: Aut amet aut voluptatum magnam. - org_id: Quisquam perspiciatis ipsam aperiam et totam in. - project_id: Necessitatibus non eum ipsum eveniet quam. - status: error - version: 786757177338717877 + id: Et qui officiis repudiandae qui iste accusantium. + label: Consequatur provident ea sint. + org_id: Eum quibusdam et minus id deleniti placeat. + project_id: Voluptatem iste nemo numquam unde perspiciatis. + status: active + version: 3173101195127892589 required: - id - project_id @@ -6014,7 +6044,7 @@ components: account_id: type: string description: Provider account identifier - example: Debitis atque laboriosam unde facilis. + example: Autem quia velit aliquid quae. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6022,23 +6052,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Numquam voluptatem maiores ipsam dicta cum odit. + example: Quia et non id sunt adipisci consectetur. label: type: string description: Optional friendly name - example: Nam modi nostrum assumenda alias sed. + example: Soluta nostrum cumque explicabo pariatur voluptatum molestias. org_id: type: string description: LinkedIn organization URN id - example: Mollitia ducimus sunt. + example: Consequatur vero possimus. project_id: type: string description: Owning project - example: Odit illo ut ut. + example: Modi quo et inventore eum autem quia. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -6047,17 +6077,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4721820161303114412 + example: 700201239225519995 format: int64 example: - account_id: Est deserunt maiores consequatur. - has_credentials: true - id: Aliquam voluptatem. - label: Eos minima sunt. - org_id: Non ratione quo ullam dolores occaecati. - project_id: Dolore aliquam est autem. - status: deleted - version: 2899021755311679849 + account_id: Sequi dolor eos fugiat rem. + has_credentials: false + id: Maiores voluptas. + label: Qui facilis possimus. + org_id: Pariatur et et deserunt facere ea incidunt. + project_id: Corporis quam quos dolor id debitis eos. + status: inactive + version: 1986183550074348775 required: - id - project_id @@ -6075,14 +6105,14 @@ components: label: type: string description: Optional friendly name - example: Sit voluptatem ad ab. + example: Officia dolores et reprehenderit. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Tempora dolor quis totam hic quibusdam eveniet. + label: Ex dolor. org_id: "208777" required: - account_id @@ -6093,10 +6123,10 @@ components: access_token: type: string description: OAuth access token - example: Dolorem necessitatibus neque consectetur occaecati earum. + example: Voluptate est reprehenderit consectetur accusamus eaque inventore. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Ut sint non eum expedita non. + access_token: Aut explicabo. required: - access_token MetaAdsConnection: @@ -6105,15 +6135,15 @@ components: account_id: type: string description: Provider account identifier - example: Occaecati quaerat eum quia a excepturi. + example: Libero officia et quia. app_id: type: string description: Meta app ID - example: Id vel iusto optio repellendus. + example: Necessitatibus eos rerum. etag: type: string description: ETag header value (mirrors version) - example: Eos culpa quaerat culpa inventore aut molestiae. + example: Qui maxime eos deserunt. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6121,23 +6151,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Necessitatibus voluptatem incidunt et totam esse rerum. + example: Est consequatur rerum neque velit nulla modi. label: type: string description: Optional friendly name - example: Voluptatem incidunt cum. + example: Nihil at. page_id: type: string description: Facebook page ID - example: Hic quos inventore. + example: Expedita sed velit distinctio. project_id: type: string description: Owning project - example: Dolorem delectus. + example: Optio quia similique vero est impedit quo. status: type: string description: Connection status - example: deleted + example: active enum: - active - inactive @@ -6146,19 +6176,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4898302691270586418 + example: 4061552416134608654 format: int64 example: - account_id: Nisi est magni odio aut. - app_id: Et ipsa magnam cum. - etag: Ducimus voluptatem doloremque ullam consequatur. - has_credentials: false - id: Ad dolorem et. - label: Inventore impedit unde voluptatem quia ab recusandae. - page_id: Eveniet tempore est omnis iusto fugiat. - project_id: Rerum eveniet nam sunt. + account_id: Vero aut repellendus reiciendis. + app_id: Ea ad ducimus consequatur aut. + etag: Atque et. + has_credentials: true + id: Veniam amet et quisquam voluptatem fuga. + label: Optio rerum vel molestiae id. + page_id: Quia iure aut tenetur. + project_id: Qui quas aut provident suscipit. status: inactive - version: 8514774147978099222 + version: 8332327938373479794 required: - id - project_id @@ -6173,11 +6203,11 @@ components: account_id: type: string description: Provider account identifier - example: Quos qui quo et. + example: Non impedit incidunt. app_id: type: string description: Meta app ID - example: Sed voluptas fuga officia nulla. + example: Alias laudantium sit et. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6185,23 +6215,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut magnam facilis non facilis dolor consectetur. + example: Molestiae modi. label: type: string description: Optional friendly name - example: A debitis ut ea. + example: Temporibus ullam sint aliquam ea. page_id: type: string description: Facebook page ID - example: Beatae facilis dolor quod nihil quia. + example: Rerum corrupti. project_id: type: string description: Owning project - example: Error quisquam recusandae nesciunt et itaque. + example: Libero consectetur non. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6210,18 +6240,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2532070289670969642 + example: 1431900350448492398 format: int64 example: - account_id: Et nemo dicta illum omnis. - app_id: Minus est dolor. + account_id: Amet et vel ipsa ad doloremque qui. + app_id: Eum voluptatem debitis aliquid accusamus eligendi itaque. has_credentials: false - id: Recusandae consequatur nulla. - label: Consequuntur provident nostrum vel ut. - page_id: Deleniti magnam nemo cum delectus. - project_id: Non consequuntur qui qui impedit assumenda voluptas. - status: error - version: 1382848930967937507 + id: Sed eius reiciendis rerum voluptatem suscipit rerum. + label: Voluptas voluptatem eum consequuntur. + page_id: Est quidem in. + project_id: Et ex aut cupiditate qui placeat omnis. + status: inactive + version: 2895836647375905460 required: - id - project_id @@ -6235,35 +6265,35 @@ components: account_id: type: string description: Provider account identifier - example: Ipsa ut saepe beatae quasi. + example: Nam rerum omnis praesentium omnis amet quia. app_id: type: string description: Meta app ID - example: Neque voluptas doloremque nobis consectetur. + example: At explicabo reiciendis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Et voluptatem mollitia placeat aut laudantium. + example: Est temporibus explicabo doloremque possimus. label: type: string description: Optional friendly name - example: Nam sequi iste iusto. + example: Autem repellat et. page_id: type: string description: Facebook page ID - example: Corrupti ut. + example: Officia rerum eligendi ex. project_id: type: string description: Owning project - example: Ut et laborum. + example: Cupiditate ab omnis nesciunt consequatur commodi. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -6272,18 +6302,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2992056059874429339 + example: 5777051591540907893 format: int64 example: - account_id: Quis impedit. - app_id: Tempore qui repellendus. - has_credentials: false - id: Voluptas voluptatem. - label: Corrupti dicta pariatur totam quas deserunt. - page_id: Earum voluptates repellat ipsam aut et ut. - project_id: Quia facere vitae aperiam. - status: active - version: 5857417550509828993 + account_id: Voluptates voluptatem similique aut. + app_id: Natus expedita est sed. + has_credentials: true + id: At ratione unde dicta. + label: Voluptas perferendis et perferendis. + page_id: Voluptatem sit excepturi eaque. + project_id: Doloribus aspernatur quod ipsum pariatur explicabo nesciunt. + status: error + version: 4610591738843411818 required: - id - project_id @@ -6297,35 +6327,35 @@ components: account_id: type: string description: Provider account identifier - example: Accusantium est. + example: Repudiandae hic nostrum qui sed est architecto. app_id: type: string description: Meta app ID - example: Dolorem similique sapiente. + example: Eveniet magnam dolor sint. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Expedita commodi sit. + example: Ducimus qui quas neque eum voluptatem. label: type: string description: Optional friendly name - example: Quo porro. + example: Consectetur consequatur autem eveniet magnam dolor. page_id: type: string description: Facebook page ID - example: Pariatur esse. + example: Id doloremque ad dolores tempore ut est. project_id: type: string description: Owning project - example: Et porro saepe eius. + example: Velit corporis nemo. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6334,18 +6364,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8954046891574288398 + example: 3642485435905489461 format: int64 example: - account_id: Sed qui dolor illo facere ut voluptatem. - app_id: Perferendis placeat earum occaecati et. + account_id: Doloremque pariatur qui magni facere. + app_id: Ut voluptas est est accusamus. has_credentials: false - id: Ea pariatur. - label: Nam repellat. - page_id: Rerum maiores in alias est laboriosam saepe. - project_id: Aut rem molestiae assumenda ea. - status: deleted - version: 8862716294143227386 + id: Ipsa nam ipsa magnam praesentium eos cum. + label: Illum natus doloremque facere quis et beatae. + page_id: Sit animi dolor ex saepe ipsa. + project_id: Sed est recusandae enim quidem. + status: active + version: 1460268576636670658 required: - id - project_id @@ -6363,20 +6393,20 @@ components: app_id: type: string description: Meta app ID - example: Et minima. + example: Adipisci ut. label: type: string description: Optional friendly name - example: Voluptas quis nihil tempora rem asperiores. + example: Excepturi natus est est saepe doloribus unde. page_id: type: string description: Facebook page ID - example: Vero natus voluptatem. + example: Aut perspiciatis. example: account_id: act_193556282970417 - app_id: Voluptas aliquid libero sapiente aspernatur fugit eum. - label: Quas qui aut rerum illum vero. - page_id: Et neque soluta. + app_id: Dolores earum. + label: Sit totam ut et. + page_id: Quibusdam ea nam aut. required: - account_id MetaAdsCredentials: @@ -6385,15 +6415,15 @@ components: access_token: type: string description: Meta access token - example: Est placeat explicabo aliquid. + example: Optio non. app_secret: type: string description: Meta app secret - example: Tenetur ut. + example: Optio in ratione accusamus quasi. description: Meta Ads credential. Write-only; never returned. example: - access_token: Quo vel iste aut cum voluptatem. - app_secret: Et et aperiam. + access_token: Ipsam eligendi est dolore. + app_secret: Consequatur aut vero. required: - access_token - app_secret @@ -6403,15 +6433,15 @@ components: account_id: type: string description: Provider account identifier - example: Dolor ea iusto eveniet velit sint odit. + example: Ut itaque voluptatem unde adipisci aut. customer_id: type: string description: Microsoft Advertising customer ID - example: Quam enim odio quia. + example: Non laudantium quis ab non sunt. etag: type: string description: ETag header value (mirrors version) - example: Cupiditate et esse voluptate optio quis. + example: Aut praesentium eos ex laborum et doloremque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6419,19 +6449,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Et atque. + example: Et natus possimus cupiditate. label: type: string description: Optional friendly name - example: Aliquid explicabo eaque ab aut voluptas. + example: Repudiandae eum. project_id: type: string description: Owning project - example: Impedit velit omnis incidunt. + example: Molestiae quia neque atque delectus. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -6440,18 +6470,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8220727981299951228 + example: 9192676630235860462 format: int64 example: - account_id: Unde fuga voluptas ut vero. - customer_id: Velit dolorem. - etag: A pariatur omnis. + account_id: Voluptatem velit odio temporibus aut. + customer_id: Enim velit voluptates officiis tempora possimus rerum. + etag: Vitae dolor soluta beatae. has_credentials: true - id: Commodi aspernatur. - label: Velit perferendis est ipsum aut voluptas. - project_id: Nostrum numquam illo. - status: active - version: 5290138330966618163 + id: Quo est. + label: Quas quia quam voluptate nam iste. + project_id: Beatae totam. + status: error + version: 1007882038292754957 required: - id - project_id @@ -6466,27 +6496,27 @@ components: account_id: type: string description: Provider account identifier - example: Soluta et quam. + example: Quisquam sit ut aliquid consectetur. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptate est enim aut. + example: Quia assumenda aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Eaque ut. + example: Nobis ipsam blanditiis commodi accusamus maxime. label: type: string description: Optional friendly name - example: Iste et alias quis magni ad. + example: Iusto aspernatur fugit et facere eligendi. project_id: type: string description: Owning project - example: Et aspernatur delectus rem sit. + example: Quia sed eum ad sunt impedit sint. status: type: string description: Connection status @@ -6499,17 +6529,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2822393091615672408 + example: 8275500991568401541 format: int64 example: - account_id: Velit atque nam voluptatem in eveniet. - customer_id: Totam ea ut voluptatem velit eos aut. + account_id: Id voluptatem et et et eveniet. + customer_id: Ex dolor quia et dolores. has_credentials: true - id: Sequi non consequatur est. - label: Occaecati repellendus autem ullam odio quis sed. - project_id: Beatae magni est officiis enim. - status: active - version: 7510768710450776293 + id: Voluptate quam delectus optio. + label: Molestiae fuga. + project_id: Ducimus aliquam vel cum alias. + status: error + version: 2847235492838917454 required: - id - project_id @@ -6523,31 +6553,31 @@ components: account_id: type: string description: Provider account identifier - example: Itaque iure soluta autem. + example: Ipsum est a. customer_id: type: string description: Microsoft Advertising customer ID - example: Odit numquam quia. + example: Molestiae similique optio et corporis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Est eum ut ut amet et molestiae. + example: Distinctio ea. label: type: string description: Optional friendly name - example: Qui quae qui optio. + example: Velit architecto error consequatur nam. project_id: type: string description: Owning project - example: Nihil dolor exercitationem eum placeat dolores culpa. + example: Ab iste earum consequatur laboriosam maxime nemo. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -6556,17 +6586,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3577746410602694753 + example: 6583480909021941947 format: int64 example: - account_id: Ut unde dolore id. - customer_id: Dolorem ut aspernatur et ad. + account_id: Ex enim rem. + customer_id: Quo sit iure quos aut. has_credentials: false - id: Aut dolores. - label: Atque qui dignissimos aut eaque eveniet. - project_id: Voluptatem beatae quis dignissimos voluptatem et labore. + id: Eligendi voluptatem repellat consectetur alias reiciendis voluptas. + label: Dolorum enim doloribus. + project_id: Cumque est quis nostrum quod. status: active - version: 412346224570068154 + version: 2799898264679301316 required: - id - project_id @@ -6580,31 +6610,31 @@ components: account_id: type: string description: Provider account identifier - example: Aut dolorem ea veniam. + example: Repellendus et neque deserunt eligendi rerum architecto. customer_id: type: string description: Microsoft Advertising customer ID - example: Ullam dolor. + example: Sapiente dolor unde harum dolorem iusto quia. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Magnam sequi esse at. + example: Facere debitis quo. label: type: string description: Optional friendly name - example: Assumenda cum nemo esse nobis. + example: Modi eveniet. project_id: type: string description: Owning project - example: Vel aut rerum voluptatem ad minus. + example: Fuga quaerat sed. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -6613,17 +6643,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6107904235260429813 + example: 402075575675880099 format: int64 example: - account_id: Nihil deleniti dolores dignissimos perferendis tempore eum. - customer_id: Magnam saepe incidunt nisi. + account_id: Ratione ut laboriosam dolorem ut dolorem odio. + customer_id: Inventore iste nemo rerum corporis repellat nemo. has_credentials: true - id: Eum et consequatur quis. - label: Consequatur dolor quia amet vero dolorum incidunt. - project_id: Enim nisi doloremque rerum. + id: Eos doloremque qui repellendus. + label: Ea et nesciunt et culpa similique. + project_id: Incidunt in. status: deleted - version: 9143198940358453773 + version: 2480470963761289215 required: - id - project_id @@ -6637,19 +6667,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: Repudiandae facilis blanditiis libero nam. + example: Rerum maiores in alias est laboriosam saepe. customer_id: type: string description: Microsoft Advertising customer ID - example: Qui sed voluptatibus quam quia. + example: Perferendis placeat earum occaecati et. label: type: string description: Optional friendly name - example: Delectus blanditiis magnam sed iure amet. + example: Unde perspiciatis. example: - account_id: Molestiae omnis doloremque. - customer_id: Perspiciatis modi dicta quae sed ut. - label: Deserunt et quidem sapiente. + account_id: Assumenda quam possimus aut ipsa. + customer_id: Quae et perspiciatis numquam. + label: Eaque magni omnis dolorem. required: - account_id MicrosoftAdsCredentials: @@ -6658,25 +6688,25 @@ components: client_id: type: string description: OAuth client id - example: Aut est voluptatibus placeat. + example: Accusantium est. client_secret: type: string description: OAuth client secret - example: Pariatur perferendis explicabo expedita et velit accusamus. + example: Molestias reprehenderit. developer_token: type: string description: Microsoft Advertising developer token - example: Nulla eos. + example: Dolorem similique sapiente. refresh_token: type: string description: OAuth refresh token - example: Deleniti placeat rerum. + example: Pariatur esse. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Recusandae totam soluta. - client_secret: Praesentium libero. - developer_token: Quisquam animi. - refresh_token: Qui et assumenda quas. + client_id: Ea pariatur. + client_secret: Aut rem molestiae assumenda ea. + developer_token: Sed qui dolor illo facere ut voluptatem. + refresh_token: Nam repellat. required: - client_id - client_secret @@ -6705,24 +6735,24 @@ components: campaign_id: type: string description: Upstream platform campaign id (present when ok) - example: Magni atque amet omnis doloremque at. + example: Laudantium dolor ipsam recusandae maxime. error: type: string description: Failure reason (present when not ok) - example: Dolor et natus. + example: Repellendus assumenda voluptatem aut debitis. ok: type: boolean description: Whether the campaign was created (or reused) successfully - example: true + example: false platform: type: string description: Platform this result is for - example: Nihil neque quod alias ipsum. + example: In commodi et asperiores et. example: - campaign_id: Consequatur non eveniet esse officia explicabo dolor. - error: Aspernatur voluptatibus. + campaign_id: Et consequatur et et itaque qui repudiandae. + error: Atque ullam qui rerum numquam quo omnis. ok: true - platform: Cupiditate non exercitationem. + platform: Unde velit eos eius accusantium odit rerum. required: - platform - ok @@ -6766,11 +6796,11 @@ components: account_id: type: string description: Provider account identifier - example: Minima vitae illo cumque optio impedit. + example: Ut quas officiis mollitia ducimus sunt repellendus. etag: type: string description: ETag header value (mirrors version) - example: Odit autem repellendus dicta qui vel. + example: Aliquam est autem vel eos minima. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6778,15 +6808,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Enim id. + example: Odit illo ut ut. label: type: string description: Optional friendly name - example: Vel necessitatibus vel voluptates tenetur veniam repellat. + example: Debitis atque laboriosam unde facilis. project_id: type: string description: Owning project - example: Eveniet quia voluptatem impedit cumque doloribus. + example: Nam modi nostrum assumenda alias sed. status: type: string description: Connection status @@ -6799,17 +6829,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 234140326367801793 + example: 2463177480955435124 format: int64 example: - account_id: Rerum non assumenda molestiae modi impedit. - etag: Aliquam voluptatibus assumenda mollitia molestias eos nobis. + account_id: Facilis dolor consectetur sed. + etag: Et itaque. has_credentials: false - id: Earum id consequatur. - label: Adipisci ipsa. - project_id: Dolorum id ut molestias. - status: deleted - version: 948876280422508983 + id: Quas est deserunt maiores consequatur eum. + label: Occaecati hic ut magnam facilis. + project_id: Voluptatum pariatur non ratione quo ullam. + status: inactive + version: 3072744263422347458 required: - id - project_id @@ -6824,27 +6854,27 @@ components: account_id: type: string description: Provider account identifier - example: Et natus possimus cupiditate. + example: Est quia ducimus inventore. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Eaque magni omnis dolorem. + example: Nisi consequatur non quam suscipit ea ea. label: type: string description: Optional friendly name - example: Quae et perspiciatis numquam. + example: Autem aut maiores ut sint. project_id: type: string description: Owning project - example: Assumenda quam possimus aut ipsa. + example: Quia sed harum. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6853,16 +6883,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6695567399746083998 + example: 4610200042662121887 format: int64 example: - account_id: Amet itaque aut. + account_id: Impedit perspiciatis ipsam sunt distinctio consequuntur. has_credentials: true - id: Atque delectus ut. - label: Unde adipisci aut quisquam. - project_id: Eum non ut itaque. - status: inactive - version: 8672712817511304757 + id: Et mollitia exercitationem cumque. + label: Eaque omnis nihil itaque. + project_id: Similique sequi occaecati. + status: error + version: 2750059486165092858 required: - id - project_id @@ -6876,27 +6906,27 @@ components: account_id: type: string description: Provider account identifier - example: Quas quia quam voluptate nam iste. + example: Deserunt provident voluptates cumque reiciendis error minus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Et doloremque porro non. + example: Recusandae amet. label: type: string description: Optional friendly name - example: Dolores quo est ratione beatae totam. + example: Expedita nihil molestiae soluta consequuntur sapiente. project_id: type: string description: Owning project - example: Quis ab non. + example: Magni ut amet. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6905,16 +6935,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1807846651493588341 + example: 8154718885862958757 format: int64 example: - account_id: Molestiae veniam exercitationem blanditiis ratione non. - has_credentials: true - id: Temporibus aut numquam. - label: Enim velit voluptates officiis tempora possimus rerum. - project_id: Accusantium ut vitae dolor soluta beatae. - status: active - version: 8042484860326151968 + account_id: Rerum nesciunt veritatis consequatur porro. + has_credentials: false + id: Qui voluptas culpa. + label: Delectus non aut ipsum. + project_id: Iste nihil itaque et. + status: deleted + version: 1595767401527646160 required: - id - project_id @@ -6928,7 +6958,7 @@ components: account_id: type: string description: Provider account identifier - example: Quos provident. + example: Nemo aut et qui. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6936,19 +6966,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quia qui dicta. + example: Ratione provident laborum. label: type: string description: Optional friendly name - example: Totam et voluptates atque consequatur consequuntur voluptates. + example: Et quisquam dolores. project_id: type: string description: Owning project - example: Commodi facere vel. + example: Sed voluptatem repudiandae soluta. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -6957,16 +6987,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 413153877019026133 + example: 8907067316289641877 format: int64 example: - account_id: Incidunt deleniti. - has_credentials: false - id: Officiis modi quae consequatur voluptatem et. - label: Vero eum ea perspiciatis rerum. - project_id: Culpa veritatis ut adipisci minus. - status: active - version: 6279401977493721745 + account_id: Aliquid porro deserunt nostrum sed sint voluptas. + has_credentials: true + id: Officiis et error nemo iste harum. + label: Culpa est ex. + project_id: Commodi occaecati. + status: error + version: 2407825525433943238 required: - id - project_id @@ -6984,10 +7014,10 @@ components: label: type: string description: Optional friendly name - example: Numquam optio possimus velit quod. + example: Ipsam aperiam et totam in. example: account_id: t2_gv9wtbfa - label: Perspiciatis quam iste possimus ipsam. + label: Numquam voluptatem maiores ipsam dicta cum odit. required: - account_id RedditAdsCredentials: @@ -6996,20 +7026,20 @@ components: client_id: type: string description: OAuth client id - example: Mollitia vel. + example: Cumque laborum ipsum accusantium voluptatem libero. client_secret: type: string description: OAuth client secret - example: Ea eum. + example: Eligendi non. refresh_token: type: string description: OAuth refresh token - example: Qui qui. + example: Necessitatibus non eum ipsum eveniet quam. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Repudiandae quae aut. - client_secret: Tempore rem quo fuga accusantium voluptas ratione. - refresh_token: Esse et labore earum. + client_id: Aut amet aut voluptatum magnam. + client_secret: Accusamus eos neque velit. + refresh_token: In iure molestiae quisquam. required: - client_id - client_secret @@ -7038,10 +7068,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - credentials SetCredentialHubspotRequestBody: @@ -7051,7 +7081,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -7061,7 +7091,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7071,8 +7101,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7082,9 +7112,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7094,10 +7124,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - credentials TwitterAdsConnection: @@ -7106,31 +7136,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo repudiandae. + example: Temporibus in qui provident corrupti ut similique. etag: type: string description: ETag header value (mirrors version) - example: Vel aut aliquam rerum et quidem. + example: Consectetur voluptas voluptas voluptatem. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Enim voluptatem inventore quasi. + example: Quia facere vitae aperiam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatem possimus veniam dignissimos consequatur. + example: Laudantium eligendi ut et. label: type: string description: Optional friendly name - example: Est porro eos ipsa quia. + example: Saepe beatae. project_id: type: string description: Owning project - example: Delectus enim quas id porro. + example: Maiores nam sequi iste iusto reiciendis ipsa. status: type: string description: Connection status @@ -7143,18 +7173,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1500674714869504232 + example: 4247878238148524808 format: int64 example: - account_id: Sequi non et. - etag: Quibusdam repellendus qui numquam. - funding_instrument_id: Necessitatibus quaerat minima a voluptatem ipsa et. + account_id: Aut et ut dolorem tempore. + etag: Commodi sit omnis. + funding_instrument_id: Porro saepe eius earum quo porro. has_credentials: true - id: Aut omnis itaque ut vero voluptatibus. - label: Vero dolorem qui. - project_id: Eum provident velit voluptatibus. - status: active - version: 3990374454753155356 + id: Corrupti dicta pariatur totam quas deserunt. + label: In voluptate debitis earum voluptates repellat. + project_id: Quis impedit. + status: error + version: 1517802020058879691 required: - id - project_id @@ -7169,31 +7199,31 @@ components: account_id: type: string description: Provider account identifier - example: Eius omnis id itaque. + example: Est aut et rem eos quia et. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Perferendis placeat dolores. + example: Facere dolorum ab laboriosam placeat atque cumque. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quidem quibusdam officiis dolor. + example: Quam fugiat adipisci non rerum et. label: type: string description: Optional friendly name - example: Sint dolor eaque culpa. + example: Quaerat laborum voluptatibus accusamus. project_id: type: string description: Owning project - example: Nisi sunt. + example: Et eum tenetur. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -7202,17 +7232,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1134950045517095139 + example: 942544011211036746 format: int64 example: - account_id: Sint suscipit. - funding_instrument_id: Non neque optio. - has_credentials: false - id: Dolore voluptatem qui eveniet amet. - label: Voluptate et. - project_id: Qui pariatur odio reprehenderit nam. + account_id: Eaque eos veniam quidem maiores adipisci. + funding_instrument_id: Molestias ullam aut odit repellat nihil at. + has_credentials: true + id: Alias nihil. + label: Voluptas ullam optio. + project_id: Temporibus error incidunt. status: deleted - version: 6078188127403523196 + version: 5983859909197428373 required: - id - project_id @@ -7226,31 +7256,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo veritatis nisi velit distinctio animi. + example: Aliquam perspiciatis libero est ratione pariatur. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Voluptas tenetur esse. + example: Corrupti quam unde nemo ipsum et illum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Architecto molestiae cum. + example: Reprehenderit nemo voluptatibus. label: type: string description: Optional friendly name - example: Sapiente perspiciatis dolores dignissimos soluta non vel. + example: Ipsa quis animi aliquam sunt. project_id: type: string description: Owning project - example: Perspiciatis consequatur beatae sunt officiis sequi qui. + example: Perferendis corrupti mollitia tempore aut. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -7259,17 +7289,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8298836967576578537 + example: 3919079788188515327 format: int64 example: - account_id: Eveniet aliquid quia aut impedit a veritatis. - funding_instrument_id: Sunt debitis enim voluptas qui voluptas veniam. - has_credentials: false - id: Assumenda sed minima nihil. - label: Dolor molestiae quia voluptatem deserunt libero. - project_id: Quaerat ipsa voluptatem. + account_id: Repellendus voluptatem. + funding_instrument_id: Saepe quo quis ut in voluptatem. + has_credentials: true + id: Rerum est. + label: Minus aut ut non. + project_id: Enim est sapiente. status: error - version: 5039507493953656552 + version: 6704106453019920248 required: - id - project_id @@ -7283,31 +7313,31 @@ components: account_id: type: string description: Provider account identifier - example: Dolor cumque dolores. + example: Qui doloremque magni est error maiores. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Neque aspernatur culpa sed non. + example: Est eum nemo architecto est aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptas maxime non illo ab in voluptatem. + example: Nesciunt magnam omnis est unde. label: type: string description: Optional friendly name - example: Ad et in voluptatem et perspiciatis. + example: Eum animi sed explicabo et quo et. project_id: type: string description: Owning project - example: Est magnam molestiae soluta. + example: Rerum eius vitae perferendis quod. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -7316,17 +7346,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 889781010736384145 + example: 7817365326411446744 format: int64 example: - account_id: Deleniti reprehenderit saepe quas commodi qui qui. - funding_instrument_id: Excepturi reiciendis numquam consequatur amet dolorem. + account_id: Ut et sit quae similique inventore. + funding_instrument_id: Illum laboriosam debitis aut vitae est est. has_credentials: false - id: Ad cumque voluptas. - label: Non minima possimus totam occaecati enim eaque. - project_id: Facere rerum voluptatem saepe eligendi. - status: deleted - version: 2150669320812381725 + id: Ab culpa consequatur. + label: Excepturi et eveniet sunt ut. + project_id: Veniam omnis. + status: active + version: 328362383505116272 required: - id - project_id @@ -7344,15 +7374,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Est perferendis eos et cumque nulla. + example: Dolor et aliquam deleniti. label: type: string description: Optional friendly name - example: Iste exercitationem voluptate quia esse nihil sed. + example: Et nemo dicta illum omnis. example: account_id: 8r7gb - funding_instrument_id: In autem neque nihil laborum omnis. - label: Neque maiores quo aliquam in rem. + funding_instrument_id: Est dolor velit et voluptatem mollitia placeat. + label: Nemo cum delectus laudantium. required: - account_id TwitterAdsCredentials: @@ -7361,25 +7391,25 @@ components: access_token: type: string description: OAuth 1.0a access token - example: Hic voluptatem ad similique sunt ratione. + example: Perferendis et. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Dicta et ratione impedit recusandae dolor. + example: Beatae facilis dolor quod nihil quia. consumer_key: type: string description: OAuth 1.0a consumer key - example: Nemo sint et consequatur vel quisquam libero. + example: A debitis ut ea. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Eum et sint possimus omnis dolorem. + example: Quos qui quo et. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Facere sed ea qui pariatur adipisci. - access_token_secret: Enim esse dolores. - consumer_key: Mollitia vel temporibus sunt nulla esse. - consumer_secret: Sunt voluptatem beatae repellat veritatis perferendis veritatis. + access_token: Non consequuntur qui qui impedit assumenda voluptas. + access_token_secret: Consequuntur provident nostrum vel ut. + consumer_key: Sed voluptas fuga officia nulla. + consumer_secret: Recusandae consequatur nulla. required: - consumer_key - consumer_secret @@ -7392,9 +7422,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Alias ullam fugiat deserunt sint nihil iusto. - config: Necessitatibus expedita. - status: Voluptas inventore sit. + campaign_name: Itaque quos voluptatibus quos accusantium fugit. + config: Qui molestias. + status: Excepturi saepe sit vel perspiciatis neque. required: - campaign UpdateGoogleAdsRequestBody: @@ -7416,12 +7446,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. required: - config UpdateLinkedinAdsRequestBody: @@ -7432,7 +7462,7 @@ components: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" required: - config @@ -7444,9 +7474,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. required: - config UpdateMicrosoftAdsRequestBody: @@ -7456,9 +7486,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. required: - config UpdateRedditAdsRequestBody: @@ -7469,7 +7499,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. required: - config UpdateTwitterAdsRequestBody: @@ -7480,8 +7510,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. required: - config securitySchemes: diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 845971ea..4f657680 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -41,20 +41,19 @@ func StartServer(ctx context.Context, cfg *config.Config) error { // NOTE: debug.LogPayloads() is intentionally NOT applied. Every authenticated // payload carries a BearerToken (a valid JWT), and the connection service's - // create/set-credential payloads carry plaintext provider credentials, so - // enabling it would leak those secrets into logs. debug.HTTP() IS still - // applied below, but in clue v1.2.1 it does not log headers or statuses — it - // only propagates the runtime /debug toggle into each request's context (so - // debug-level logs elsewhere activate); it decodes no payload. + // create/set-credential payloads carry plaintext provider credentials (OAuth + // refresh tokens, client secrets), so enabling it would leak those secrets + // into logs. debug.HTTP() IS still applied below, but in clue v1.2.1 it does + // not log headers or statuses — it only propagates the runtime /debug toggle + // into each request's context (so debug-level logs elsewhere activate); it + // decodes no payload. endpoints := svc.NewEndpoints(cont.Service) // The container always initializes Connections and Briefs (NewContainer wires // them in both the DB and no-DB paths), so construct the endpoints // unconditionally. Fail loudly if either is unexpectedly nil rather than // silently skipping the mount — a mis-wired container should crash at startup, - // not serve 404s on the connection/brief routes. debug.LogPayloads is - // intentionally NOT applied to any endpoint set: connection/brief payloads - // carry BearerTokens and plaintext provider credentials that would leak. + // not serve 404s on the connection/brief routes. if cont.Connections == nil { return fmt.Errorf("container misconfigured: Connections service is nil") } diff --git a/design/brief.go b/design/brief.go index fa927acb..4f7b7757 100644 --- a/design/brief.go +++ b/design/brief.go @@ -193,15 +193,21 @@ var _ = Service("lfx-v2-campaign-service-briefs", func() { bearerToken() projectIDAttr() briefIDAttr() + Attribute("if_match", String, "Version being approved (ETag); approval is rejected if the brief changed") Required("project_id", "brief_id") }) Result(Brief) commonBriefErrors(false) + Error("PreconditionFailed", PreconditionFailedError, "ETag mismatch") + Error("PreconditionRequired", PreconditionRequiredError, "If-Match header required") HTTP(func() { POST("/projects/{project_id}/briefs/{brief_id}/approve") Header("bearer_token:Authorization") + Header("if_match:If-Match") Response(StatusOK, func() { Header("etag:ETag") }) briefErrorResponses(false) + Response("PreconditionFailed", StatusPreconditionFailed) + Response("PreconditionRequired", StatusPreconditionRequired) }) }) @@ -291,7 +297,7 @@ var _ = Service("lfx-v2-campaign-service-briefs", func() { Payload(func() { bearerToken() projectIDAttr() - Attribute("job_id", String, "Job UUID") + Attribute("job_id", String, "Job UUID", func() { Format(FormatUUID) }) Required("project_id", "job_id") }) Result(JobPollResponse) @@ -308,11 +314,11 @@ var _ = Service("lfx-v2-campaign-service-briefs", func() { // ─── shared DSL helpers for briefs ─── func briefIDAttr() { - Attribute("brief_id", String, "Brief UUID") + Attribute("brief_id", String, "Brief UUID", func() { Format(FormatUUID) }) } func campaignIDAttr() { - Attribute("campaign_id", String, "Campaign UUID") + Attribute("campaign_id", String, "Campaign UUID", func() { Format(FormatUUID) }) } // commonBriefErrors declares the standard error set for a brief method. diff --git a/docs/api-catalog.md b/docs/api-catalog.md index ec178dcc..15e8d6b5 100644 --- a/docs/api-catalog.md +++ b/docs/api-catalog.md @@ -32,7 +32,7 @@ A brief is the funnel unit: it carries the **program** (`program_type` = events | GET | `/projects/{projectId}/briefs/{id}` | `campaign_manager` | JSON | Get a brief (full copy, keywords, targeting); returns ETag. | | PUT | `/projects/{projectId}/briefs/{id}` | `campaign_manager` | JSON | Replace a brief (requires `If-Match`). | | POST | `/projects/{projectId}/briefs/{id}/refresh` | `campaign_manager` | JSON | Re-run generation against latest event data, producing a new version. | -| POST | `/projects/{projectId}/briefs/{id}/approve` | `campaign_manager` | JSON | Approve a brief for campaign creation. | +| POST | `/projects/{projectId}/briefs/{id}/approve` | `campaign_manager` | JSON | Approve a brief for campaign creation (requires `If-Match`; approval is version-gated so a brief replaced since it was fetched cannot be approved on stale content). | | DELETE | `/projects/{projectId}/briefs/{id}` | `campaign_manager` | JSON | Archive a brief (soft delete). | > Listing briefs and viewing a brief's version history are served by the Query Service, not by dedicated endpoints here. @@ -294,7 +294,13 @@ Per-platform errors are carried inside each `result` entry rather than in a separate top-level array; the job's own start/finish times are available from the job record's timestamps and are not echoed in the poll payload. -### CampaignCreateResult (per-platform result, embedded in JobPollResponse.results) +### CampaignCreateResult (future, richer per-platform result) + +> Not yet emitted. Today the job result carries the minimal `PlatformResult` +> shape above (`platform`/`ok`/`campaignId`/`error`). Once the per-provider +> dispatchers land, each result is expected to grow into the richer shape below +> (counts, creation log, direct UI URL); this section documents that intended +> end-state, not the current payload. ``` platform: CampaignPlatform diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index 96a2a541..2880a358 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -26,6 +26,15 @@ must also be mounted in `server.go`, or its routes 404 despite compiling. **Creation** — Added the `internal/platform/reddit` concept doc for the new Reddit Ads API v3 client (OAuth2 token refresh + Campaign -> Ad Group -> Ad creation) and listed it in the code index. +**Update** — PR #11 review round 3: validate brief_id/campaign_id/job_id path +params as UUIDs (400 instead of a PostgreSQL cast 500); make brief approval +version-gated via If-Match (rejects approving stale content, 412/428); type the +job-poll result (PlatformResult array, replacing Any); and stop applying +debug.LogPayloads to the connection/brief/health endpoints so DEBUG can't leak +BearerTokens or plaintext provider credentials into logs (debug.HTTP header/status +logging is retained). Reconciled api-catalog (PlatformResult; CampaignCreateResult +marked as the future richer shape). + **Update** — Brief + campaign API and async orchestrator (LFXV2-2626): updated `design`, `internal/service`, and `internal/container` concepts for the Project → Brief → Campaigns hierarchy, async job dispatch, and idempotent diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index 94bf7659..10017f7a 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -33,8 +33,8 @@ func UsageCommands() []string { // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + - os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + os.Args[0] + " " + "lfx-v2-campaign-service-svc readyz" + "\n" + "" } @@ -72,6 +72,7 @@ func ParseEndpoint( lfxV2CampaignServiceBriefsApproveBriefProjectIDFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") lfxV2CampaignServiceBriefsApproveBriefBriefIDFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("brief-id", "REQUIRED", "Brief UUID") lfxV2CampaignServiceBriefsApproveBriefBearerTokenFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("bearer-token", "", "") + lfxV2CampaignServiceBriefsApproveBriefIfMatchFlag = lfxV2CampaignServiceBriefsApproveBriefFlags.String("if-match", "", "") lfxV2CampaignServiceBriefsDeleteBriefFlags = flag.NewFlagSet("delete-brief", flag.ExitOnError) lfxV2CampaignServiceBriefsDeleteBriefProjectIDFlag = lfxV2CampaignServiceBriefsDeleteBriefFlags.String("project-id", "REQUIRED", "Project UUID or slug that scopes the connection") @@ -607,7 +608,7 @@ func ParseEndpoint( data, err = lfxv2campaignservicebriefsc.BuildUpdateBriefPayload(*lfxV2CampaignServiceBriefsUpdateBriefBodyFlag, *lfxV2CampaignServiceBriefsUpdateBriefProjectIDFlag, *lfxV2CampaignServiceBriefsUpdateBriefBriefIDFlag, *lfxV2CampaignServiceBriefsUpdateBriefBearerTokenFlag, *lfxV2CampaignServiceBriefsUpdateBriefIfMatchFlag) case "approve-brief": endpoint = c.ApproveBrief() - data, err = lfxv2campaignservicebriefsc.BuildApproveBriefPayload(*lfxV2CampaignServiceBriefsApproveBriefProjectIDFlag, *lfxV2CampaignServiceBriefsApproveBriefBriefIDFlag, *lfxV2CampaignServiceBriefsApproveBriefBearerTokenFlag) + data, err = lfxv2campaignservicebriefsc.BuildApproveBriefPayload(*lfxV2CampaignServiceBriefsApproveBriefProjectIDFlag, *lfxV2CampaignServiceBriefsApproveBriefBriefIDFlag, *lfxV2CampaignServiceBriefsApproveBriefBearerTokenFlag, *lfxV2CampaignServiceBriefsApproveBriefIfMatchFlag) case "delete-brief": endpoint = c.DeleteBrief() data, err = lfxv2campaignservicebriefsc.BuildDeleteBriefPayload(*lfxV2CampaignServiceBriefsDeleteBriefProjectIDFlag, *lfxV2CampaignServiceBriefsDeleteBriefBriefIDFlag, *lfxV2CampaignServiceBriefsDeleteBriefBearerTokenFlag) @@ -809,7 +810,7 @@ func lfxV2CampaignServiceBriefsCreateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetBriefUsage() { @@ -831,7 +832,7 @@ func lfxV2CampaignServiceBriefsGetBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"Rem provident itaque labore voluptas.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"feb32fc3-d9b4-40fc-8753-f31916725c92\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateBriefUsage() { @@ -857,7 +858,7 @@ func lfxV2CampaignServiceBriefsUpdateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }' --project-id \"cncf\" --brief-id \"Id qui repudiandae veniam soluta alias.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --brief-id \"3d8699f7-a485-463f-b50e-693e64cc8a6a\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsApproveBriefUsage() { @@ -866,6 +867,7 @@ func lfxV2CampaignServiceBriefsApproveBriefUsage() { fmt.Fprint(os.Stderr, " -project-id STRING") fmt.Fprint(os.Stderr, " -brief-id STRING") fmt.Fprint(os.Stderr, " -bearer-token STRING") + fmt.Fprint(os.Stderr, " -if-match STRING") fmt.Fprintln(os.Stderr) // Description @@ -876,10 +878,11 @@ func lfxV2CampaignServiceBriefsApproveBriefUsage() { fmt.Fprintln(os.Stderr, ` -project-id STRING: Project UUID or slug that scopes the connection`) fmt.Fprintln(os.Stderr, ` -brief-id STRING: Brief UUID`) fmt.Fprintln(os.Stderr, ` -bearer-token STRING: `) + fmt.Fprintln(os.Stderr, ` -if-match STRING: `) fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"Sed ea.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"91872672-ab36-4453-a7d4-69973cfe0c1f\" --bearer-token \"eyJhbGci...\" --if-match \"Voluptatem doloremque consequatur deleniti.\"") } func lfxV2CampaignServiceBriefsDeleteBriefUsage() { @@ -901,7 +904,7 @@ func lfxV2CampaignServiceBriefsDeleteBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"Possimus ea.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"20b26aa7-5f88-4b2d-9499-ce300dcd9cfb\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { @@ -925,7 +928,7 @@ func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Vitae reiciendis voluptatem.\",\n \"platforms\": [\n \"reddit-ads\",\n \"microsoft-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"Non voluptas ut enim.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Adipisci consequuntur omnis a.\",\n \"platforms\": [\n \"reddit-ads\",\n \"meta-ads\",\n \"google-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"573e8048-aec7-40df-b549-3aef92a9ab18\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetCampaignUsage() { @@ -949,7 +952,7 @@ func lfxV2CampaignServiceBriefsGetCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"Hic voluptas debitis error.\" --campaign-id \"Veniam eum ut libero quibusdam debitis.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"31d1d48d-eb06-4aa8-ad40-96fc5692c038\" --campaign-id \"2737989f-c758-47d8-96c2-994234417827\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { @@ -977,7 +980,7 @@ func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Alias ullam fugiat deserunt sint nihil iusto.\",\n \"config\": \"Necessitatibus expedita.\",\n \"status\": \"Voluptas inventore sit.\"\n }\n }' --project-id \"cncf\" --brief-id \"Beatae autem autem.\" --campaign-id \"Enim ea.\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Itaque quos voluptatibus quos accusantium fugit.\",\n \"config\": \"Qui molestias.\",\n \"status\": \"Excepturi saepe sit vel perspiciatis neque.\"\n }\n }' --project-id \"cncf\" --brief-id \"b6c4c830-3832-42db-832b-03028366023c\" --campaign-id \"65f21722-e8b5-454f-aa83-3f4f0e926aeb\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsGetJobUsage() { @@ -999,7 +1002,7 @@ func lfxV2CampaignServiceBriefsGetJobUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"Consequatur quos atque voluptates quo sit.\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"9f5dd792-556c-463d-97d4-33c1852e49e3\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceConnectionsUsage displays the usage of the @@ -1073,7 +1076,7 @@ func lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetGoogleAdsUsage() { @@ -1179,7 +1182,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { @@ -1201,7 +1204,7 @@ func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetLinkedinAdsUsage() { @@ -1245,7 +1248,7 @@ func lfxV2CampaignServiceConnectionsUpdateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteLinkedinAdsUsage() { @@ -1307,7 +1310,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { @@ -1329,7 +1332,7 @@ func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n },\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMetaAdsUsage() { @@ -1373,7 +1376,7 @@ func lfxV2CampaignServiceConnectionsUpdateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMetaAdsUsage() { @@ -1435,7 +1438,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { @@ -1457,7 +1460,7 @@ func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n },\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n },\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetRedditAdsUsage() { @@ -1501,7 +1504,7 @@ func lfxV2CampaignServiceConnectionsUpdateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteRedditAdsUsage() { @@ -1563,7 +1566,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { @@ -1585,7 +1588,7 @@ func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n },\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n },\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetTwitterAdsUsage() { @@ -1629,7 +1632,7 @@ func lfxV2CampaignServiceConnectionsUpdateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteTwitterAdsUsage() { @@ -1691,7 +1694,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { @@ -1713,7 +1716,7 @@ func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMicrosoftAdsUsage() { @@ -1757,7 +1760,7 @@ func lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMicrosoftAdsUsage() { @@ -1819,7 +1822,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { @@ -1841,7 +1844,7 @@ func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetHubspotUsage() { @@ -1885,7 +1888,7 @@ func lfxV2CampaignServiceConnectionsUpdateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteHubspotUsage() { @@ -1947,7 +1950,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceSvcUsage displays the usage of the diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go index 160ddd18..60fefdc2 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -23,7 +23,7 @@ func BuildCreateBriefPayload(lfxV2CampaignServiceBriefsCreateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -60,6 +60,7 @@ func BuildCreateBriefPayload(lfxV2CampaignServiceBriefsCreateBriefBody string, l // BuildGetBriefPayload builds the payload for the // lfx-v2-campaign-service-briefs get-brief endpoint from CLI flags. func BuildGetBriefPayload(lfxV2CampaignServiceBriefsGetBriefProjectID string, lfxV2CampaignServiceBriefsGetBriefBriefID string, lfxV2CampaignServiceBriefsGetBriefBearerToken string) (*lfxv2campaignservicebriefs.GetBriefPayload, error) { + var err error var projectID string { projectID = lfxV2CampaignServiceBriefsGetBriefProjectID @@ -67,6 +68,10 @@ func BuildGetBriefPayload(lfxV2CampaignServiceBriefsGetBriefProjectID string, lf var briefID string { briefID = lfxV2CampaignServiceBriefsGetBriefBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -90,7 +95,7 @@ func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Expedita unde molestiae.\",\n \"event_details\": \"Mollitia molestiae saepe qui ex commodi.\",\n \"event_slug\": \"Nesciunt unde ullam occaecati maxime.\",\n \"keywords\": \"Voluptas dolor et incidunt pariatur quod odit.\",\n \"platforms\": [\n \"Ut expedita voluptatum sit.\",\n \"Quasi voluptas corporis velit et.\",\n \"Quia ut atque.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Velit ullam.\",\n \"url\": \"Similique vel nobis non molestias.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -111,6 +116,10 @@ func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, l var briefID string { briefID = lfxV2CampaignServiceBriefsUpdateBriefBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -138,7 +147,8 @@ func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, l // BuildApproveBriefPayload builds the payload for the // lfx-v2-campaign-service-briefs approve-brief endpoint from CLI flags. -func BuildApproveBriefPayload(lfxV2CampaignServiceBriefsApproveBriefProjectID string, lfxV2CampaignServiceBriefsApproveBriefBriefID string, lfxV2CampaignServiceBriefsApproveBriefBearerToken string) (*lfxv2campaignservicebriefs.ApproveBriefPayload, error) { +func BuildApproveBriefPayload(lfxV2CampaignServiceBriefsApproveBriefProjectID string, lfxV2CampaignServiceBriefsApproveBriefBriefID string, lfxV2CampaignServiceBriefsApproveBriefBearerToken string, lfxV2CampaignServiceBriefsApproveBriefIfMatch string) (*lfxv2campaignservicebriefs.ApproveBriefPayload, error) { + var err error var projectID string { projectID = lfxV2CampaignServiceBriefsApproveBriefProjectID @@ -146,6 +156,10 @@ func BuildApproveBriefPayload(lfxV2CampaignServiceBriefsApproveBriefProjectID st var briefID string { briefID = lfxV2CampaignServiceBriefsApproveBriefBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -153,10 +167,17 @@ func BuildApproveBriefPayload(lfxV2CampaignServiceBriefsApproveBriefProjectID st bearerToken = &lfxV2CampaignServiceBriefsApproveBriefBearerToken } } + var ifMatch *string + { + if lfxV2CampaignServiceBriefsApproveBriefIfMatch != "" { + ifMatch = &lfxV2CampaignServiceBriefsApproveBriefIfMatch + } + } v := &lfxv2campaignservicebriefs.ApproveBriefPayload{} v.ProjectID = projectID v.BriefID = briefID v.BearerToken = bearerToken + v.IfMatch = ifMatch return v, nil } @@ -164,6 +185,7 @@ func BuildApproveBriefPayload(lfxV2CampaignServiceBriefsApproveBriefProjectID st // BuildDeleteBriefPayload builds the payload for the // lfx-v2-campaign-service-briefs delete-brief endpoint from CLI flags. func BuildDeleteBriefPayload(lfxV2CampaignServiceBriefsDeleteBriefProjectID string, lfxV2CampaignServiceBriefsDeleteBriefBriefID string, lfxV2CampaignServiceBriefsDeleteBriefBearerToken string) (*lfxv2campaignservicebriefs.DeleteBriefPayload, error) { + var err error var projectID string { projectID = lfxV2CampaignServiceBriefsDeleteBriefProjectID @@ -171,6 +193,10 @@ func BuildDeleteBriefPayload(lfxV2CampaignServiceBriefsDeleteBriefProjectID stri var briefID string { briefID = lfxV2CampaignServiceBriefsDeleteBriefBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -194,7 +220,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Vitae reiciendis voluptatem.\",\n \"platforms\": [\n \"reddit-ads\",\n \"microsoft-ads\"\n ]\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Adipisci consequuntur omnis a.\",\n \"platforms\": [\n \"reddit-ads\",\n \"meta-ads\",\n \"google-ads\"\n ]\n }\n }'") } if body.Input == nil { err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) @@ -215,6 +241,10 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s var briefID string { briefID = lfxV2CampaignServiceBriefsCreateCampaignsBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -236,6 +266,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s // BuildGetCampaignPayload builds the payload for the // lfx-v2-campaign-service-briefs get-campaign endpoint from CLI flags. func BuildGetCampaignPayload(lfxV2CampaignServiceBriefsGetCampaignProjectID string, lfxV2CampaignServiceBriefsGetCampaignBriefID string, lfxV2CampaignServiceBriefsGetCampaignCampaignID string, lfxV2CampaignServiceBriefsGetCampaignBearerToken string) (*lfxv2campaignservicebriefs.GetCampaignPayload, error) { + var err error var projectID string { projectID = lfxV2CampaignServiceBriefsGetCampaignProjectID @@ -243,10 +274,18 @@ func BuildGetCampaignPayload(lfxV2CampaignServiceBriefsGetCampaignProjectID stri var briefID string { briefID = lfxV2CampaignServiceBriefsGetCampaignBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var campaignID string { campaignID = lfxV2CampaignServiceBriefsGetCampaignCampaignID + err = goa.MergeErrors(err, goa.ValidateFormat("campaign_id", campaignID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -271,7 +310,7 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateCampaignBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Alias ullam fugiat deserunt sint nihil iusto.\",\n \"config\": \"Necessitatibus expedita.\",\n \"status\": \"Voluptas inventore sit.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Itaque quos voluptatibus quos accusantium fugit.\",\n \"config\": \"Qui molestias.\",\n \"status\": \"Excepturi saepe sit vel perspiciatis neque.\"\n }\n }'") } if body.Campaign == nil { err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) @@ -287,10 +326,18 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str var briefID string { briefID = lfxV2CampaignServiceBriefsUpdateCampaignBriefID + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var campaignID string { campaignID = lfxV2CampaignServiceBriefsUpdateCampaignCampaignID + err = goa.MergeErrors(err, goa.ValidateFormat("campaign_id", campaignID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { @@ -320,6 +367,7 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str // BuildGetJobPayload builds the payload for the lfx-v2-campaign-service-briefs // get-job endpoint from CLI flags. func BuildGetJobPayload(lfxV2CampaignServiceBriefsGetJobProjectID string, lfxV2CampaignServiceBriefsGetJobJobID string, lfxV2CampaignServiceBriefsGetJobBearerToken string) (*lfxv2campaignservicebriefs.GetJobPayload, error) { + var err error var projectID string { projectID = lfxV2CampaignServiceBriefsGetJobProjectID @@ -327,6 +375,10 @@ func BuildGetJobPayload(lfxV2CampaignServiceBriefsGetJobProjectID string, lfxV2C var jobID string { jobID = lfxV2CampaignServiceBriefsGetJobJobID + err = goa.MergeErrors(err, goa.ValidateFormat("job_id", jobID, goa.FormatUUID)) + if err != nil { + return nil, err + } } var bearerToken *string { diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go index 42fe5c55..c314f15d 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/encode_decode.go @@ -618,6 +618,10 @@ func EncodeApproveBriefRequest(encoder func(*http.Request) goahttp.Encoder) func req.Header.Set("Authorization", head) } } + if p.IfMatch != nil { + head := *p.IfMatch + req.Header.Set("If-Match", head) + } return nil } } @@ -631,6 +635,8 @@ func EncodeApproveBriefRequest(encoder func(*http.Request) goahttp.Encoder) func // - "ServiceUnavailable" (type *lfxv2campaignservicebriefs.ConnServiceUnavailableError): http.StatusServiceUnavailable // - "InternalServerError" (type *lfxv2campaignservicebriefs.InternalServerError): http.StatusInternalServerError // - "NotFound" (type *lfxv2campaignservicebriefs.NotFoundError): http.StatusNotFound +// - "PreconditionFailed" (type *lfxv2campaignservicebriefs.PreconditionFailedError): http.StatusPreconditionFailed +// - "PreconditionRequired" (type *lfxv2campaignservicebriefs.PreconditionRequiredError): http.StatusPreconditionRequired // - error: internal error func DecodeApproveBriefResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { return func(resp *http.Response) (any, error) { @@ -739,6 +745,34 @@ func DecodeApproveBriefResponse(decoder func(*http.Response) goahttp.Decoder, re return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) } return nil, NewApproveBriefNotFound(&body) + case http.StatusPreconditionFailed: + var ( + body ApproveBriefPreconditionFailedResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefPreconditionFailedResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefPreconditionFailed(&body) + case http.StatusPreconditionRequired: + var ( + body ApproveBriefPreconditionRequiredResponseBody + err error + ) + err = decoder(resp).Decode(&body) + if err != nil { + return nil, goahttp.ErrDecodingError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + err = ValidateApproveBriefPreconditionRequiredResponseBody(&body) + if err != nil { + return nil, goahttp.ErrValidationError("lfx-v2-campaign-service-briefs", "approve-brief", err) + } + return nil, NewApproveBriefPreconditionRequired(&body) default: body, _ := io.ReadAll(resp.Body) return nil, goahttp.ErrInvalidResponse("lfx-v2-campaign-service-briefs", "approve-brief", resp.StatusCode, string(body)) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index f88456a2..d738017e 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -442,6 +442,26 @@ type ApproveBriefNotFoundResponseBody struct { Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` } +// ApproveBriefPreconditionFailedResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "PreconditionFailed" error. +type ApproveBriefPreconditionFailedResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + +// ApproveBriefPreconditionRequiredResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "PreconditionRequired" error. +type ApproveBriefPreconditionRequiredResponseBody struct { + // HTTP status code + Code *string `form:"code,omitempty" json:"code,omitempty" xml:"code,omitempty"` + // Error message + Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` +} + // DeleteBriefBadRequestResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP // response body for the "BadRequest" error. @@ -1157,6 +1177,28 @@ func NewApproveBriefNotFound(body *ApproveBriefNotFoundResponseBody) *lfxv2campa return v } +// NewApproveBriefPreconditionFailed builds a lfx-v2-campaign-service-briefs +// service approve-brief endpoint PreconditionFailed error. +func NewApproveBriefPreconditionFailed(body *ApproveBriefPreconditionFailedResponseBody) *lfxv2campaignservicebriefs.PreconditionFailedError { + v := &lfxv2campaignservicebriefs.PreconditionFailedError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + +// NewApproveBriefPreconditionRequired builds a lfx-v2-campaign-service-briefs +// service approve-brief endpoint PreconditionRequired error. +func NewApproveBriefPreconditionRequired(body *ApproveBriefPreconditionRequiredResponseBody) *lfxv2campaignservicebriefs.PreconditionRequiredError { + v := &lfxv2campaignservicebriefs.PreconditionRequiredError{ + Code: *body.Code, + Message: *body.Message, + } + + return v +} + // NewDeleteBriefBadRequest builds a lfx-v2-campaign-service-briefs service // delete-brief endpoint BadRequest error. func NewDeleteBriefBadRequest(body *DeleteBriefBadRequestResponseBody) *lfxv2campaignservicebriefs.BadRequestError { @@ -2007,6 +2049,30 @@ func ValidateApproveBriefNotFoundResponseBody(body *ApproveBriefNotFoundResponse return } +// ValidateApproveBriefPreconditionFailedResponseBody runs the validations +// defined on approve-brief_PreconditionFailed_response_body +func ValidateApproveBriefPreconditionFailedResponseBody(body *ApproveBriefPreconditionFailedResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + +// ValidateApproveBriefPreconditionRequiredResponseBody runs the validations +// defined on approve-brief_PreconditionRequired_response_body +func ValidateApproveBriefPreconditionRequiredResponseBody(body *ApproveBriefPreconditionRequiredResponseBody) (err error) { + if body.Code == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("code", "body")) + } + if body.Message == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) + } + return +} + // ValidateDeleteBriefBadRequestResponseBody runs the validations defined on // delete-brief_BadRequest_response_body func ValidateDeleteBriefBadRequestResponseBody(body *DeleteBriefBadRequestResponseBody) (err error) { diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go index f2d8974a..d26afdc1 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/encode_decode.go @@ -188,15 +188,20 @@ func DecodeGetBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt projectID string briefID string bearerToken *string + err error params = mux.Vars(r) ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw } + if err != nil { + return payload, err + } payload = NewGetBriefPayload(projectID, briefID, bearerToken) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { @@ -341,6 +346,7 @@ func DecodeUpdateBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goa ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw @@ -349,6 +355,9 @@ func DecodeUpdateBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goa if ifMatchRaw != "" { ifMatch = &ifMatchRaw } + if err != nil { + return payload, err + } payload = NewUpdateBriefPayload(&body, projectID, briefID, bearerToken, ifMatch) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { @@ -493,16 +502,26 @@ func DecodeApproveBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) go projectID string briefID string bearerToken *string + ifMatch *string + err error params = mux.Vars(r) ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw } - payload = NewApproveBriefPayload(projectID, briefID, bearerToken) + ifMatchRaw := r.Header.Get("If-Match") + if ifMatchRaw != "" { + ifMatch = &ifMatchRaw + } + if err != nil { + return payload, err + } + payload = NewApproveBriefPayload(projectID, briefID, bearerToken, ifMatch) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { // Remove authorization scheme prefix (e.g. "Bearer") @@ -590,6 +609,32 @@ func EncodeApproveBriefError(encoder func(context.Context, http.ResponseWriter) w.Header().Set("goa-error", res.GoaErrorName()) w.WriteHeader(http.StatusNotFound) return enc.Encode(body) + case "PreconditionFailed": + var res *lfxv2campaignservicebriefs.PreconditionFailedError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefPreconditionFailedResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusPreconditionFailed) + return enc.Encode(body) + case "PreconditionRequired": + var res *lfxv2campaignservicebriefs.PreconditionRequiredError + errors.As(v, &res) + enc := encoder(ctx, w) + var body any + if formatter != nil { + body = formatter(ctx, res) + } else { + body = NewApproveBriefPreconditionRequiredResponseBody(res) + } + w.Header().Set("goa-error", res.GoaErrorName()) + w.WriteHeader(http.StatusPreconditionRequired) + return enc.Encode(body) default: return encodeError(ctx, w, v) } @@ -614,15 +659,20 @@ func DecodeDeleteBriefRequest(mux goahttp.Muxer, decoder func(*http.Request) goa projectID string briefID string bearerToken *string + err error params = mux.Vars(r) ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw } + if err != nil { + return payload, err + } payload = NewDeleteBriefPayload(projectID, briefID, bearerToken) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { @@ -763,10 +813,14 @@ func DecodeCreateCampaignsRequest(mux goahttp.Muxer, decoder func(*http.Request) ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw } + if err != nil { + return payload, err + } payload = NewCreateCampaignsPayload(&body, projectID, briefID, bearerToken) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { @@ -886,16 +940,22 @@ func DecodeGetCampaignRequest(mux goahttp.Muxer, decoder func(*http.Request) goa briefID string campaignID string bearerToken *string + err error params = mux.Vars(r) ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) campaignID = params["campaign_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("campaign_id", campaignID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw } + if err != nil { + return payload, err + } payload = NewGetCampaignPayload(projectID, briefID, campaignID, bearerToken) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { @@ -1041,7 +1101,9 @@ func DecodeUpdateCampaignRequest(mux goahttp.Muxer, decoder func(*http.Request) ) projectID = params["project_id"] briefID = params["brief_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("brief_id", briefID, goa.FormatUUID)) campaignID = params["campaign_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("campaign_id", campaignID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw @@ -1050,6 +1112,9 @@ func DecodeUpdateCampaignRequest(mux goahttp.Muxer, decoder func(*http.Request) if ifMatchRaw != "" { ifMatch = &ifMatchRaw } + if err != nil { + return payload, err + } payload = NewUpdateCampaignPayload(&body, projectID, briefID, campaignID, bearerToken, ifMatch) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { @@ -1191,15 +1256,20 @@ func DecodeGetJobRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp. projectID string jobID string bearerToken *string + err error params = mux.Vars(r) ) projectID = params["project_id"] jobID = params["job_id"] + err = goa.MergeErrors(err, goa.ValidateFormat("job_id", jobID, goa.FormatUUID)) bearerTokenRaw := r.Header.Get("Authorization") if bearerTokenRaw != "" { bearerToken = &bearerTokenRaw } + if err != nil { + return payload, err + } payload = NewGetJobPayload(projectID, jobID, bearerToken) if payload.BearerToken != nil { if strings.Contains(*payload.BearerToken, " ") { diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 3f38a6c9..9c03c078 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -442,6 +442,26 @@ type ApproveBriefNotFoundResponseBody struct { Message string `form:"message" json:"message" xml:"message"` } +// ApproveBriefPreconditionFailedResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "PreconditionFailed" error. +type ApproveBriefPreconditionFailedResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + +// ApproveBriefPreconditionRequiredResponseBody is the type of the +// "lfx-v2-campaign-service-briefs" service "approve-brief" endpoint HTTP +// response body for the "PreconditionRequired" error. +type ApproveBriefPreconditionRequiredResponseBody struct { + // HTTP status code + Code string `form:"code" json:"code" xml:"code"` + // Error message + Message string `form:"message" json:"message" xml:"message"` +} + // DeleteBriefBadRequestResponseBody is the type of the // "lfx-v2-campaign-service-briefs" service "delete-brief" endpoint HTTP // response body for the "BadRequest" error. @@ -1178,6 +1198,28 @@ func NewApproveBriefNotFoundResponseBody(res *lfxv2campaignservicebriefs.NotFoun return body } +// NewApproveBriefPreconditionFailedResponseBody builds the HTTP response body +// from the result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefPreconditionFailedResponseBody(res *lfxv2campaignservicebriefs.PreconditionFailedError) *ApproveBriefPreconditionFailedResponseBody { + body := &ApproveBriefPreconditionFailedResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + +// NewApproveBriefPreconditionRequiredResponseBody builds the HTTP response +// body from the result of the "approve-brief" endpoint of the +// "lfx-v2-campaign-service-briefs" service. +func NewApproveBriefPreconditionRequiredResponseBody(res *lfxv2campaignservicebriefs.PreconditionRequiredError) *ApproveBriefPreconditionRequiredResponseBody { + body := &ApproveBriefPreconditionRequiredResponseBody{ + Code: res.Code, + Message: res.Message, + } + return body +} + // NewDeleteBriefBadRequestResponseBody builds the HTTP response body from the // result of the "delete-brief" endpoint of the // "lfx-v2-campaign-service-briefs" service. @@ -1510,11 +1552,12 @@ func NewUpdateBriefPayload(body *UpdateBriefRequestBody, projectID string, brief // NewApproveBriefPayload builds a lfx-v2-campaign-service-briefs service // approve-brief endpoint payload. -func NewApproveBriefPayload(projectID string, briefID string, bearerToken *string) *lfxv2campaignservicebriefs.ApproveBriefPayload { +func NewApproveBriefPayload(projectID string, briefID string, bearerToken *string, ifMatch *string) *lfxv2campaignservicebriefs.ApproveBriefPayload { v := &lfxv2campaignservicebriefs.ApproveBriefPayload{} v.ProjectID = projectID v.BriefID = briefID v.BearerToken = bearerToken + v.IfMatch = ifMatch return v } diff --git a/gen/http/lfx_v2_campaign_service_connections/client/cli.go b/gen/http/lfx_v2_campaign_service_connections/client/cli.go index 5f53aff3..0ebcc5b4 100644 --- a/gen/http/lfx_v2_campaign_service_connections/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_connections/client/cli.go @@ -24,7 +24,7 @@ func BuildCreateGoogleAdsPayload(lfxV2CampaignServiceConnectionsCreateGoogleAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -174,7 +174,7 @@ func BuildSetCredentialGoogleAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Nihil quia omnis eaque aperiam eum.\",\n \"client_secret\": \"Quam et voluptatibus illum dolorem.\",\n \"developer_token\": \"Eum dolorum.\",\n \"refresh_token\": \"Et illo beatae soluta.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -212,7 +212,7 @@ func BuildCreateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsCreateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -276,7 +276,7 @@ func BuildUpdateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsUpdateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Et placeat.\",\n \"org_id\": \"208777\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -363,7 +363,7 @@ func BuildSetCredentialLinkedinAdsPayload(lfxV2CampaignServiceConnectionsSetCred { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Qui esse.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -400,7 +400,7 @@ func BuildCreateMetaAdsPayload(lfxV2CampaignServiceConnectionsCreateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n },\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -463,7 +463,7 @@ func BuildUpdateMetaAdsPayload(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Non praesentium voluptas saepe sit.\",\n \"label\": \"Aut assumenda unde occaecati eum tenetur nam.\",\n \"page_id\": \"Aliquid voluptatibus iste mollitia commodi libero atque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -548,7 +548,7 @@ func BuildSetCredentialMetaAdsPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Sed qui.\",\n \"app_secret\": \"Reiciendis qui id tenetur exercitationem aperiam incidunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -586,7 +586,7 @@ func BuildCreateRedditAdsPayload(lfxV2CampaignServiceConnectionsCreateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n },\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n },\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -650,7 +650,7 @@ func BuildUpdateRedditAdsPayload(lfxV2CampaignServiceConnectionsUpdateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Aut sed fugiat adipisci eos.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -736,7 +736,7 @@ func BuildSetCredentialRedditAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Ea ipsam temporibus.\",\n \"client_secret\": \"Et necessitatibus dolorem ut.\",\n \"refresh_token\": \"Expedita accusantium dolorum qui sed fugiat.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -774,7 +774,7 @@ func BuildCreateTwitterAdsPayload(lfxV2CampaignServiceConnectionsCreateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n },\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n },\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -838,7 +838,7 @@ func BuildUpdateTwitterAdsPayload(lfxV2CampaignServiceConnectionsUpdateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Non possimus quos voluptatem doloremque consequatur deleniti.\",\n \"label\": \"Quaerat ut neque expedita nostrum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -924,7 +924,7 @@ func BuildSetCredentialTwitterAdsPayload(lfxV2CampaignServiceConnectionsSetCrede { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Numquam quia.\",\n \"access_token_secret\": \"Dolorem autem ipsa autem provident est.\",\n \"consumer_key\": \"Pariatur voluptas odit fuga illo.\",\n \"consumer_secret\": \"Sit ex commodi sapiente a illum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -962,7 +962,7 @@ func BuildCreateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsCreateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1027,7 +1027,7 @@ func BuildUpdateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsUpdateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Perferendis quia possimus dolore vel qui et.\",\n \"customer_id\": \"Vero quis consequuntur.\",\n \"label\": \"Accusantium aspernatur facere tempora voluptatem dicta rerum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1114,7 +1114,7 @@ func BuildSetCredentialMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsSetCre { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Quis quo illum cum quod.\",\n \"client_secret\": \"Ut fugiat magnam quia.\",\n \"developer_token\": \"Distinctio beatae.\",\n \"refresh_token\": \"Ut tempora consequuntur cumque repudiandae omnis ut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -1151,7 +1151,7 @@ func BuildCreateHubspotPayload(lfxV2CampaignServiceConnectionsCreateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1214,7 +1214,7 @@ func BuildUpdateHubspotPayload(lfxV2CampaignServiceConnectionsUpdateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Velit labore non.\",\n \"brand_kit\": \"Dolorem sapiente.\",\n \"label\": \"Sit quibusdam nulla adipisci aperiam dolorem molestias.\",\n \"portal_id\": \"Odit est esse.\",\n \"sender_email\": \"Ea cum et magni adipisci magnam.\",\n \"sender_name\": \"Atque labore qui odio et corporis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1299,7 +1299,7 @@ func BuildSetCredentialHubspotPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Aut natus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 5daf0890..b95b913e 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui alias ea."},"event_details":{"description":"Extracted event/course details","example":"Eos nesciunt ipsum et delectus dolorum."},"event_slug":{"type":"string","description":"Event/course slug","example":"Adipisci quaerat est nobis."},"id":{"type":"string","description":"Brief UUID","example":"Repellendus quo quidem."},"keywords":{"description":"Keyword list","example":"Tempore maxime."},"platforms":{"type":"array","items":{"type":"string","example":"Et veritatis quisquam sed ratione et."},"description":"Suggested default platforms","example":["Molestiae eos.","Aut iusto quos impedit eos.","Adipisci rerum consequatur placeat ea odio."]},"program_type":{"type":"string","description":"Funnel context","example":"Illum rerum error incidunt."},"project_id":{"type":"string","description":"Owning project","example":"Cumque totam nulla aut reprehenderit."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Porro enim dolorum nobis."},"url":{"type":"string","description":"Event/course page URL","example":"Fugit non fuga rem adipisci."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6324133014862191516,"format":"int64"}},"example":{"copy":"Aut facilis porro dolor ipsa velit.","event_details":"Ut mollitia tempora minima voluptas quod.","event_slug":"Aperiam voluptates.","id":"Magnam pariatur explicabo est.","keywords":"Hic quis facere exercitationem.","platforms":["Aut perferendis natus.","Eaque ipsam harum nisi nobis et et.","Excepturi corporis ut.","Odio eius sed qui deserunt perspiciatis."],"program_type":"Adipisci ullam pariatur ex voluptas.","project_id":"Qui praesentium ipsam officiis cum ipsum recusandae.","status":"archived","targeting":"Exercitationem aut eaque.","url":"Vero ducimus.","version":5743767113243123162},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Commodi dicta."},"event_details":{"description":"Extracted event/course details","example":"Consequatur non cumque laudantium quod modi voluptas."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Accusamus et provident provident."},"keywords":{"description":"Keyword list","example":"Ad non."},"platforms":{"type":"array","items":{"type":"string","example":"Sed voluptatum laborum."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Quas sunt eos nulla et perferendis qui.","Aut reiciendis ullam laborum.","Et quidem nisi quasi.","Ab deserunt quia magnam temporibus minus et."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Dolores voluptatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Odit iusto ad animi eos doloribus autem."}},"example":{"copy":"Quos accusantium fugit.","event_details":"Et expedita itaque quos.","event_slug":"Consequatur est unde nihil.","keywords":"Excepturi saepe sit vel perspiciatis neque.","platforms":["Qui eveniet laboriosam possimus.","Facere velit dolores eligendi.","Ad voluptatem.","Tempore impedit."],"program_type":"education","targeting":"Qui molestias.","url":"Laudantium quod est voluptas sequi voluptatem."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Nihil dolore suscipit reprehenderit et aut animi."},"campaign_name":{"type":"string","description":"Campaign name","example":"Et aut consequatur inventore enim reiciendis."},"id":{"type":"string","description":"Campaign UUID","example":"Aut molestiae exercitationem et impedit at."},"platform":{"type":"string","description":"Channel","example":"Ullam omnis autem."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Id laboriosam nihil ea."},"project_id":{"type":"string","description":"Owning project","example":"Quisquam perferendis autem ut alias."},"status":{"type":"string","description":"Campaign status","example":"Neque ut rerum facilis quia molestiae ratione."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3905678301175813319,"format":"int64"}},"example":{"brief_id":"Consequatur qui molestiae velit ratione nesciunt et.","campaign_name":"Enim qui officia id necessitatibus mollitia soluta.","id":"Provident officia officiis.","platform":"Rerum ut necessitatibus illum ratione.","platform_campaign_id":"Mollitia atque atque dolores accusantium non dolor.","project_id":"Ut mollitia accusantium dignissimos.","status":"Nobis labore dicta.","version":6819175354933615501},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Sunt totam incidunt sunt id ipsa."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["linkedin-ads","hubspot","meta-ads","meta-ads"]}},"example":{"config":"Voluptatibus aut.","platforms":["hubspot","microsoft-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Incidunt qui aut tempora dolor sequi quia."},"config":{"description":"Campaign configuration snapshot","example":"Culpa iste."},"status":{"type":"string","description":"Campaign status","example":"Consequatur velit odio."}},"example":{"campaign_name":"Sit incidunt.","config":"Qui quisquam voluptatibus sint quia.","status":"Officiis est."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Sunt assumenda."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Officia eligendi tempore provident dicta temporibus debitis.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est officia et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit in recusandae maiores et voluptatem voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ex quo praesentium voluptas."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Eos et architecto voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Mollitia omnis doloribus qui consequatur et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5274458285620360301,"format":"int64"}},"example":{"account_id":"Nihil nihil quae porro qui rem autem.","has_credentials":true,"id":"Vel natus provident.","label":"Ut non error aut et fuga.","login_customer_id":"Vitae perspiciatis eveniet quibusdam nobis ut asperiores.","project_id":"Perspiciatis id.","status":"deleted","version":4918506778223386612},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Quis dicta voluptate aut in corporis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Nobis soluta."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Vitae accusantium excepturi deleniti voluptas."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut enim et."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Laboriosam non id temporibus et provident.","client_secret":"Neque quis illo minima.","developer_token":"Earum eligendi.","refresh_token":"Vel quae laudantium amet veritatis rerum itaque."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt repellendus corrupti itaque quo sit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Perspiciatis porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Blanditiis mollitia dolores illo nostrum magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Omnis nobis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Eum et ipsum expedita reprehenderit eos."},"project_id":{"type":"string","description":"Owning project","example":"Nostrum tempore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolorum ut architecto deleniti nostrum."},"sender_name":{"type":"string","description":"Default sender name","example":"Aperiam et nihil."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6605548766358472787,"format":"int64"}},"example":{"account_id":"Aperiam quos perferendis nisi blanditiis eveniet.","brand_kit":"Optio labore omnis.","has_credentials":true,"id":"Distinctio amet enim.","label":"Deserunt quod.","portal_id":"Corporis dolorum consequatur eius perferendis.","project_id":"Rem error.","sender_email":"Omnis vel voluptate necessitatibus enim et et.","sender_name":"Sunt omnis mollitia aut rerum quis et.","status":"active","version":7462268971443661923},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Rem ab corporis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Eaque dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil aut rerum est vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Non dolorem."},"sender_email":{"type":"string","description":"Default sender address","example":"Porro et."},"sender_name":{"type":"string","description":"Default sender name","example":"Dolor aut assumenda fugiat."}},"example":{"account_id":"Aut quas suscipit eos.","brand_kit":"Dolor et corrupti voluptas neque vitae.","label":"Inventore alias error aut maxime dicta.","portal_id":"Ipsa rerum velit et impedit.","sender_email":"Quaerat labore dolor.","sender_name":"Velit quam omnis."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Omnis autem accusamus."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Est assumenda aut."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Molestiae minus dolor accusantium."},"platforms":{"type":"array","items":{"type":"string","example":"Molestias fuga voluptatibus quis adipisci."},"description":"Platforms this job will create on","example":["Ut blanditiis dolor modi nobis aliquid.","Consequatur officiis velit quasi dolores assumenda.","Mollitia fugiat dolore similique et.","Voluptates quaerat molestiae."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Cum porro architecto doloremque aperiam doloribus aut.","platforms":["Cumque iure veritatis cumque nisi.","Distinctio ipsum ab.","Natus placeat esse est in deserunt aliquid."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Distinctio voluptas ut ut nisi."},"job_id":{"type":"string","description":"Job UUID","example":"Tempore nemo illum ut maiores."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}]},"status":{"type":"string","description":"Job status","example":"partial","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Et atque dolor odio labore pariatur.","job_id":"Nostrum velit hic excepturi omnis reprehenderit distinctio.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"queued"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"At odio incidunt distinctio sint qui."},"label":{"type":"string","description":"Optional friendly name","example":"Cumque saepe sint quidem odio ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Esse praesentium voluptatibus deserunt aliquam."},"project_id":{"type":"string","description":"Owning project","example":"Quis quis reprehenderit non quae omnis qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1342488242351916696,"format":"int64"}},"example":{"account_id":"Necessitatibus magni et molestiae.","has_credentials":true,"id":"Eos ut et eligendi.","label":"Est et eum est.","org_id":"Dolorum quas.","project_id":"Numquam dolorum consequatur.","status":"active","version":6946177746341876830},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Nulla fuga fugit repellendus et accusamus sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Sequi error.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Quam deleniti et et."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Quia aperiam sunt est labore."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Delectus voluptatem iste nisi in."},"app_id":{"type":"string","description":"Meta app ID","example":"Iste qui rerum est sed sed similique."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut est rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Natus expedita aspernatur consequuntur quod ducimus molestias."},"page_id":{"type":"string","description":"Facebook page ID","example":"Dolor occaecati earum iusto rerum sit cupiditate."},"project_id":{"type":"string","description":"Owning project","example":"Occaecati et."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3681253484013323435,"format":"int64"}},"example":{"account_id":"Qui quidem exercitationem.","app_id":"Necessitatibus laudantium est ut.","has_credentials":false,"id":"Ea maiores quidem molestiae deleniti omnis.","label":"Nostrum corporis quasi magnam.","page_id":"Architecto quas eligendi impedit qui sed.","project_id":"Expedita voluptatum commodi fuga ipsa.","status":"active","version":8272760528024179326},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Exercitationem illum et quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Neque facilis est qui possimus eligendi."},"page_id":{"type":"string","description":"Facebook page ID","example":"Possimus et corrupti et nobis voluptas."}},"example":{"account_id":"act_193556282970417","app_id":"Quia quisquam corrupti distinctio voluptas eius.","label":"Est facilis qui.","page_id":"Modi ut culpa excepturi blanditiis."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Autem est est distinctio sunt aliquid harum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Nam rerum eaque eius."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Rerum illo mollitia odio et dolor.","app_secret":"Consectetur sint error ipsam maiores."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et rerum in expedita."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Repellat assumenda nesciunt distinctio eaque aliquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Consequatur dolore unde illum."},"label":{"type":"string","description":"Optional friendly name","example":"Quo veritatis quis delectus est."},"project_id":{"type":"string","description":"Owning project","example":"Dolores tenetur ut illum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4673192311933251173,"format":"int64"}},"example":{"account_id":"Aperiam cum possimus.","customer_id":"Omnis sed dolore dolorem voluptatibus quod.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Ullam ab suscipit et labore harum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Deleniti doloribus debitis assumenda dignissimos."},"label":{"type":"string","description":"Optional friendly name","example":"Non iste ad rem quidem sunt qui."}},"example":{"account_id":"Quisquam quam officiis aut.","customer_id":"Architecto ut unde.","label":"Vitae aut ea."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sapiente possimus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Voluptates atque."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Praesentium tenetur quas at ut necessitatibus dolor."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Eaque voluptate reprehenderit sed voluptatem sed illo."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Cum nisi numquam.","client_secret":"Id unde veritatis officiis aut fugiat.","developer_token":"Quo corporis recusandae dicta quibusdam.","refresh_token":"Ut commodi et voluptas tenetur nobis facere."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Sed sit repudiandae aut aut."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolores vel dolorum minus voluptatem."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"Enim temporibus."}},"example":{"campaign_id":"Qui culpa deleniti.","error":"Et atque enim quis sed.","ok":true,"platform":"Architecto itaque doloribus voluptatem consequatur quis fugiat."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Facilis suscipit."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Maiores laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Non sint inventore iste iure ut."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis deleniti."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4582993025544492856,"format":"int64"}},"example":{"account_id":"Expedita dignissimos non sed omnis officiis et.","has_credentials":false,"id":"Ad inventore voluptatum eligendi quasi.","label":"Velit dolores omnis placeat unde distinctio ducimus.","project_id":"Ipsa et dolore.","status":"active","version":4526728339972318921},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Enim repellendus magni repudiandae inventore."}},"example":{"account_id":"t2_gv9wtbfa","label":"Corrupti repellat eius ut qui nobis."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Delectus quam et eos."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Rem aut fuga."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Est dolor ut corporis."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Cupiditate ut illo dolor quaerat totam.","client_secret":"Illo vitae occaecati omnis.","refresh_token":"Pariatur debitis."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eum et sint corrupti eos."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Qui unde dicta autem dolorem qui explicabo."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Explicabo possimus consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Neque autem ex eos."},"project_id":{"type":"string","description":"Owning project","example":"Quos hic doloribus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4374149818121411294,"format":"int64"}},"example":{"account_id":"Sit est dolores est et.","funding_instrument_id":"Velit atque laudantium ullam rerum.","has_credentials":false,"id":"Repellat non suscipit veritatis sit tempore.","label":"Ut quo iure.","project_id":"Magnam ut similique ea minima magnam.","status":"deleted","version":7309957715046801903},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim accusantium labore esse numquam."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum adipisci."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Dolorum deserunt.","label":"Non laudantium sunt minima repudiandae illo harum."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Saepe voluptatem reiciendis pariatur."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Et ut quis ut."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Sit dolor sunt eos nihil ipsam."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Odio totam cum deleniti placeat fuga."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Aut autem sint minus voluptatum.","access_token_secret":"Tempore quae.","consumer_key":"Iusto omnis.","consumer_secret":"Quia cum non."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 35626754..63414314 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -111,6 +111,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -188,6 +189,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -291,6 +293,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -356,11 +359,17 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall required: false type: string + - name: If-Match + in: header + description: Version being approved (ETag); approval is rejected if the brief changed + required: false + type: string responses: "200": description: OK response. @@ -398,6 +407,20 @@ paths: required: - code - message + "412": + description: Precondition Failed response. + schema: + $ref: '#/definitions/PreconditionFailedError' + required: + - code + - message + "428": + description: Precondition Required response. + schema: + $ref: '#/definitions/PreconditionRequiredError' + required: + - code + - message "500": description: Internal Server Error response. schema: @@ -434,6 +457,7 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -511,11 +535,13 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: campaign_id in: path description: Campaign UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -594,11 +620,13 @@ paths: description: Brief UUID required: true type: string + format: uuid - name: campaign_id in: path description: Campaign UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -3350,6 +3378,7 @@ paths: description: Job UUID required: true type: string + format: uuid - name: Authorization in: header description: JWT token issued by Heimdall @@ -3428,76 +3457,74 @@ definitions: properties: copy: description: Ad copy - example: Qui alias ea. + example: Molestiae est accusantium laudantium nostrum. event_details: description: Extracted event/course details - example: Eos nesciunt ipsum et delectus dolorum. + example: Non quo necessitatibus. event_slug: type: string description: Event/course slug - example: Adipisci quaerat est nobis. + example: Facere qui omnis. id: type: string description: Brief UUID - example: Repellendus quo quidem. + example: Beatae harum similique corporis id eum. keywords: description: Keyword list - example: Tempore maxime. + example: Dolores sit. platforms: type: array items: type: string - example: Et veritatis quisquam sed ratione et. + example: Beatae quia qui excepturi minima. description: Suggested default platforms example: - - Molestiae eos. - - Aut iusto quos impedit eos. - - Adipisci rerum consequatur placeat ea odio. + - Natus a. + - Quod sunt quae et nesciunt iure quis. + - Ut mollitia nihil ducimus. program_type: type: string description: Funnel context - example: Illum rerum error incidunt. + example: Facilis qui libero. project_id: type: string description: Owning project - example: Cumque totam nulla aut reprehenderit. + example: Et itaque rem eos et deleniti dolores. status: type: string description: Lifecycle status - example: draft + example: approved enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Porro enim dolorum nobis. + example: Exercitationem accusantium nihil. url: type: string description: Event/course page URL - example: Fugit non fuga rem adipisci. + example: Enim vitae officia dolorem odio. version: type: integer description: Optimistic-concurrency version - example: 6324133014862191516 + example: 8012662392626135551 format: int64 example: - copy: Aut facilis porro dolor ipsa velit. - event_details: Ut mollitia tempora minima voluptas quod. - event_slug: Aperiam voluptates. - id: Magnam pariatur explicabo est. - keywords: Hic quis facere exercitationem. + copy: Sed veniam dolores quidem necessitatibus voluptatem. + event_details: Earum minus autem omnis qui debitis eum. + event_slug: Modi possimus consequatur. + id: Ipsum voluptates pariatur magni atque. + keywords: Sit reiciendis et vel beatae molestiae. platforms: - - Aut perferendis natus. - - Eaque ipsam harum nisi nobis et et. - - Excepturi corporis ut. - - Odio eius sed qui deserunt perspiciatis. - program_type: Adipisci ullam pariatur ex voluptas. - project_id: Qui praesentium ipsam officiis cum ipsum recusandae. - status: archived - targeting: Exercitationem aut eaque. - url: Vero ducimus. - version: 5743767113243123162 + - Aspernatur illo accusamus. + - Cupiditate mollitia hic vel ut. + program_type: Sit cupiditate non. + project_id: Omnis doloremque at fugit dolor et. + status: approved + targeting: Natus vitae consequatur eos sit aut ut. + url: Eveniet esse officia explicabo dolor deserunt. + version: 6761108389050444243 required: - id - project_id @@ -3511,56 +3538,53 @@ definitions: properties: copy: description: Ad copy - example: Commodi dicta. + example: Vel inventore aliquid aut non eligendi accusamus. event_details: description: Extracted event/course details - example: Consequatur non cumque laudantium quod modi voluptas. + example: Explicabo repudiandae aut reiciendis recusandae molestias. event_slug: type: string description: Event/course slug (unique within the project) - example: Accusamus et provident provident. + example: Eos labore quia esse consectetur tenetur. keywords: description: Keyword list - example: Ad non. + example: Quod impedit accusamus incidunt minus veritatis enim. platforms: type: array items: type: string - example: Sed voluptatum laborum. + example: Et recusandae possimus. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Quas sunt eos nulla et perferendis qui. - - Aut reiciendis ullam laborum. - - Et quidem nisi quasi. - - Ab deserunt quia magnam temporibus minus et. + - Praesentium voluptate. + - Qui impedit temporibus eveniet eos omnis cumque. + - Ipsam ut sed natus et unde. program_type: type: string description: Funnel context - example: events + example: education enum: - events - education - membership targeting: description: Targeting recommendation - example: Dolores voluptatibus. + example: Hic est quia pariatur odit ullam. url: type: string description: Event/course page URL - example: Odit iusto ad animi eos doloribus autem. + example: Aliquam aut ut sit nisi architecto iure. example: - copy: Quos accusantium fugit. - event_details: Et expedita itaque quos. - event_slug: Consequatur est unde nihil. - keywords: Excepturi saepe sit vel perspiciatis neque. + copy: In aut nam rerum. + event_details: Quae qui inventore dolorem deserunt. + event_slug: Id corrupti sed quo perferendis nemo. + keywords: Distinctio magnam. platforms: - - Qui eveniet laboriosam possimus. - - Facere velit dolores eligendi. - - Ad voluptatem. - - Tempore impedit. - program_type: education - targeting: Qui molestias. - url: Laudantium quod est voluptas sequi voluptatem. + - Voluptatem nihil quaerat asperiores pariatur. + - Vel veritatis hic rerum accusamus velit error. + program_type: membership + targeting: Architecto deserunt vero ducimus distinctio. + url: Quisquam nisi repellendus quos magnam aut. required: - program_type - event_slug @@ -3571,45 +3595,45 @@ definitions: brief_id: type: string description: Parent brief - example: Nihil dolore suscipit reprehenderit et aut animi. + example: Et dolorem quod. campaign_name: type: string description: Campaign name - example: Et aut consequatur inventore enim reiciendis. + example: Consequatur hic voluptatem. id: type: string description: Campaign UUID - example: Aut molestiae exercitationem et impedit at. + example: Placeat et minus et. platform: type: string description: Channel - example: Ullam omnis autem. + example: Iusto fugit non asperiores quidem natus. platform_campaign_id: type: string description: ID returned by the ad platform - example: Id laboriosam nihil ea. + example: Nostrum atque illum nesciunt adipisci odit corrupti. project_id: type: string description: Owning project - example: Quisquam perferendis autem ut alias. + example: Fugiat aliquid aspernatur voluptatem in cupiditate. status: type: string description: Campaign status - example: Neque ut rerum facilis quia molestiae ratione. + example: Omnis quidem dolor ipsum voluptas. version: type: integer description: Optimistic-concurrency version - example: 3905678301175813319 + example: 3737008917467127208 format: int64 example: - brief_id: Consequatur qui molestiae velit ratione nesciunt et. - campaign_name: Enim qui officia id necessitatibus mollitia soluta. - id: Provident officia officiis. - platform: Rerum ut necessitatibus illum ratione. - platform_campaign_id: Mollitia atque atque dolores accusantium non dolor. - project_id: Ut mollitia accusantium dignissimos. - status: Nobis labore dicta. - version: 6819175354933615501 + brief_id: Ut sint non eum expedita non. + campaign_name: Doloribus voluptas mollitia doloremque totam. + id: Id ea. + platform: Sit voluptatem ad ab. + platform_campaign_id: Tempora dolor quis totam hic quibusdam eveniet. + project_id: Dolorem necessitatibus neque consectetur occaecati earum. + status: Veniam et ducimus quos amet. + version: 1836828122944842672 required: - id - project_id @@ -3624,7 +3648,7 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Sunt totam incidunt sunt id ipsa. + example: Nobis nam velit quis rem. platforms: type: array items: @@ -3640,15 +3664,14 @@ definitions: - hubspot description: Platforms to create campaigns on (binding selection) example: - - linkedin-ads - - hubspot - - meta-ads - meta-ads + - google-ads + - reddit-ads example: - config: Voluptatibus aut. + config: Architecto quae error. platforms: - - hubspot - - microsoft-ads + - reddit-ads + - twitter-ads required: - platforms CampaignUpdateInput: @@ -3658,18 +3681,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Incidunt qui aut tempora dolor sequi quia. + example: Doloremque commodi rerum esse. config: description: Campaign configuration snapshot - example: Culpa iste. + example: Laudantium quia. status: type: string description: Campaign status - example: Consequatur velit odio. + example: Omnis totam eos non. example: - campaign_name: Sit incidunt. - config: Qui quisquam voluptatibus sint quia. - status: Officiis est. + campaign_name: Maxime recusandae. + config: Laudantium error sit nihil iure officiis nemo. + status: Accusamus debitis explicabo praesentium. required: - campaign_name - status @@ -3718,14 +3741,14 @@ definitions: message: type: string description: Human-readable detail - example: Sunt assumenda. + example: Est omnis iusto fugiat ad et ipsa. ok: type: boolean description: Whether the credential authenticated against the provider - example: true + example: false example: - message: Officia eligendi tempore provident dicta temporibus debitis. - ok: false + message: Veritatis mollitia. + ok: true required: - ok GoogleAdsConnection: @@ -3735,31 +3758,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Est officia et. + example: Vero ut et neque soluta distinctio voluptas. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Velit in recusandae maiores et voluptatem voluptatem. + example: Rem asperiores eligendi vero. label: type: string description: Optional friendly name - example: Ex quo praesentium voluptas. + example: Facere quas qui aut rerum. login_customer_id: type: string description: Manager account used for API access - example: Eos et architecto voluptas. + example: Fugit eum. project_id: type: string description: Owning project - example: Mollitia omnis doloribus qui consequatur et. + example: Voluptatem fugiat et. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -3768,17 +3791,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 5274458285620360301 + example: 5717670313645740058 format: int64 example: - account_id: Nihil nihil quae porro qui rem autem. + account_id: Occaecati quaerat eum quia a excepturi. has_credentials: true - id: Vel natus provident. - label: Ut non error aut et fuga. - login_customer_id: Vitae perspiciatis eveniet quibusdam nobis ut asperiores. - project_id: Perspiciatis id. + id: Necessitatibus voluptatem incidunt et totam esse rerum. + label: Voluptatem incidunt cum. + login_customer_id: Eos culpa quaerat culpa inventore aut molestiae. + project_id: Dolorem delectus. status: deleted - version: 4918506778223386612 + version: 4898302691270586418 required: - id - project_id @@ -3815,25 +3838,25 @@ definitions: client_id: type: string description: OAuth client id - example: Quis dicta voluptate aut in corporis. + example: Id vel iusto optio repellendus. client_secret: type: string description: OAuth client secret - example: Nobis soluta. + example: Ad dolorem et. developer_token: type: string description: Google Ads developer token - example: Vitae accusantium excepturi deleniti voluptas. + example: Rerum eveniet nam sunt. refresh_token: type: string description: OAuth refresh token - example: Aut enim et. + example: Hic quos inventore. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Laboriosam non id temporibus et provident. - client_secret: Neque quis illo minima. - developer_token: Earum eligendi. - refresh_token: Vel quae laudantium amet veritatis rerum itaque. + client_id: Nisi est magni odio aut. + client_secret: Vel omnis iure. + developer_token: Voluptatem doloremque ullam consequatur ut. + refresh_token: Inventore impedit unde voluptatem quia ab recusandae. required: - refresh_token - client_id @@ -3846,39 +3869,39 @@ definitions: account_id: type: string description: Provider account identifier - example: Deserunt repellendus corrupti itaque quo sit. + example: Incidunt voluptas non necessitatibus. brand_kit: type: string description: Per-project brand kit selector - example: Perspiciatis porro. + example: Provident porro. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Blanditiis mollitia dolores illo nostrum magnam. + example: Qui nemo nihil dolorum consequatur. label: type: string description: Optional friendly name - example: Omnis nobis. + example: Est ea sed sit. portal_id: type: string description: HubSpot portal/account ID - example: Eum et ipsum expedita reprehenderit eos. + example: Deserunt nostrum consectetur et sed praesentium libero. project_id: type: string description: Owning project - example: Nostrum tempore. + example: Tempora qui eum hic vel aspernatur at. sender_email: type: string description: Default sender address - example: Dolorum ut architecto deleniti nostrum. + example: Qui minima in nulla sunt autem eos. sender_name: type: string description: Default sender name - example: Aperiam et nihil. + example: Provident dicta tenetur voluptatem voluptate dolor. status: type: string description: Connection status @@ -3891,20 +3914,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6605548766358472787 + example: 5710646536103854438 format: int64 example: - account_id: Aperiam quos perferendis nisi blanditiis eveniet. - brand_kit: Optio labore omnis. + account_id: Est quis impedit. + brand_kit: Dolor quam dolor consectetur eos iste. has_credentials: true - id: Distinctio amet enim. - label: Deserunt quod. - portal_id: Corporis dolorum consequatur eius perferendis. - project_id: Rem error. - sender_email: Omnis vel voluptate necessitatibus enim et et. - sender_name: Sunt omnis mollitia aut rerum quis et. - status: active - version: 7462268971443661923 + id: Odio sunt esse mollitia incidunt. + label: Veritatis itaque. + portal_id: Consequatur eligendi eum necessitatibus alias. + project_id: Dolores laborum sed. + sender_email: Ut aperiam voluptate voluptates. + sender_name: Sapiente molestiae dolorum repellat expedita ut. + status: inactive + version: 6098388766312520476 required: - id - project_id @@ -3919,34 +3942,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Rem ab corporis. + example: Veniam iusto consequatur quia sed officia eligendi. brand_kit: type: string description: Per-project brand kit selector - example: Eaque dolor. + example: Veniam delectus repellendus omnis. label: type: string description: Optional friendly name - example: Nihil aut rerum est vel. + example: Praesentium et. portal_id: type: string description: HubSpot portal/account ID - example: Non dolorem. + example: Qui impedit. sender_email: type: string description: Default sender address - example: Porro et. + example: Ea alias. sender_name: type: string description: Default sender name - example: Dolor aut assumenda fugiat. + example: Reprehenderit dignissimos aut velit quis at sint. example: - account_id: Aut quas suscipit eos. - brand_kit: Dolor et corrupti voluptas neque vitae. - label: Inventore alias error aut maxime dicta. - portal_id: Ipsa rerum velit et impedit. - sender_email: Quaerat labore dolor. - sender_name: Velit quam omnis. + account_id: Quo necessitatibus necessitatibus. + brand_kit: Repudiandae tenetur aperiam saepe vel. + label: Amet cum. + portal_id: Sint dicta. + sender_email: Omnis voluptatem rerum praesentium. + sender_name: Blanditiis non totam temporibus. required: - account_id HubspotCredentials: @@ -3956,10 +3979,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Omnis autem accusamus. + example: Animi sit esse ratione aliquid. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Est assumenda aut. + private_app_token: Laborum est quasi dignissimos. required: - private_app_token InternalServerError: @@ -3988,18 +4011,18 @@ definitions: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Molestiae minus dolor accusantium. + example: Quia magni aut nisi est. platforms: type: array items: type: string - example: Molestias fuga voluptatibus quis adipisci. + example: Est sed. description: Platforms this job will create on example: - - Ut blanditiis dolor modi nobis aliquid. - - Consequatur officiis velit quasi dolores assumenda. - - Mollitia fugiat dolore similique et. - - Voluptates quaerat molestiae. + - Dolorem necessitatibus illum. + - Ex ipsa nihil esse voluptate in consectetur. + - Culpa quaerat. + - Sed voluptatum et impedit quod rem. status: type: string description: Initial status (always 'queued' on create) @@ -4007,11 +4030,11 @@ definitions: enum: - queued example: - job_id: Cum porro architecto doloremque aperiam doloribus aut. + job_id: Omnis corrupti facere eum aliquid est repellat. platforms: - - Cumque iure veritatis cumque nisi. - - Distinctio ipsum ab. - - Natus placeat esse est in deserunt aliquid. + - Id incidunt mollitia non sed. + - Minima est distinctio accusamus. + - Perferendis culpa voluptatem nostrum eaque deleniti. status: queued required: - job_id @@ -4023,29 +4046,33 @@ definitions: error: type: string description: Terminal error, if any - example: Distinctio voluptas ut ut nisi. + example: Ut voluptatem. job_id: type: string description: Job UUID - example: Tempore nemo illum ut maiores. + example: Molestias ducimus id. result: type: array items: $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. + ok: false + platform: Consequatur et dignissimos ex quo praesentium voluptas. status: type: string description: Job status - example: partial + example: queued enum: - queued - running @@ -4053,26 +4080,22 @@ definitions: - partial - failed example: - error: Et atque dolor odio labore pariatur. - job_id: Nostrum velit hic excepturi omnis reprehenderit distinctio. + error: Aperiam facere voluptas quis nihil. + job_id: Vel iste aut cum voluptatem. result: - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. - ok: false - platform: Dolor molestias ipsa dolorum est. - status: queued + platform: Consequatur et dignissimos ex quo praesentium voluptas. + status: partial required: - job_id - status @@ -4084,17 +4107,18 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. required: - brief LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: @@ -4105,10 +4129,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Vitae reiciendis voluptatem. + config: Adipisci consequuntur omnis a. platforms: - reddit-ads - - microsoft-ads + - meta-ads + - google-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4119,17 +4144,18 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. required: - brief LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: @@ -4140,9 +4166,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Alias ullam fugiat deserunt sint nihil iusto. - config: Necessitatibus expedita. - status: Voluptas inventore sit. + campaign_name: Itaque quos voluptatibus quos accusantium fugit. + config: Qui molestias. + status: Excepturi saepe sit vel perspiciatis neque. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4159,10 +4185,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - config - credentials @@ -4176,14 +4202,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - config - credentials @@ -4198,10 +4224,10 @@ definitions: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - config - credentials @@ -4216,12 +4242,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - config - credentials @@ -4235,14 +4261,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. required: - config - credentials @@ -4257,11 +4283,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - config - credentials @@ -4276,13 +4302,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - config - credentials @@ -4294,10 +4320,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4308,7 +4334,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4319,7 +4345,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4330,8 +4356,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4342,10 +4368,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4356,9 +4382,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4369,10 +4395,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4396,12 +4422,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4413,7 +4439,7 @@ definitions: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" required: - config @@ -4426,9 +4452,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4439,9 +4465,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4453,7 +4479,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4465,8 +4491,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. required: - config LinkedinAdsConnection: @@ -4476,7 +4502,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Aut est. + example: Esse et labore earum. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4484,23 +4510,23 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: At odio incidunt distinctio sint qui. + example: Velit ea eum perferendis qui qui. label: type: string description: Optional friendly name - example: Cumque saepe sint quidem odio ab. + example: Tempore rem quo fuga accusantium voluptas ratione. org_id: type: string description: LinkedIn organization URN id - example: Esse praesentium voluptatibus deserunt aliquam. + example: Velit quod cumque perspiciatis. project_id: type: string description: Owning project - example: Quis quis reprehenderit non quae omnis qui. + example: Repudiandae quae aut. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4509,17 +4535,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 1342488242351916696 + example: 7189689836865162887 format: int64 example: - account_id: Necessitatibus magni et molestiae. - has_credentials: true - id: Eos ut et eligendi. - label: Est et eum est. - org_id: Dolorum quas. - project_id: Numquam dolorum consequatur. - status: active - version: 6946177746341876830 + account_id: Tenetur veniam repellat. + has_credentials: false + id: Iste possimus ipsam perspiciatis enim id expedita. + label: Doloribus at vel necessitatibus vel. + org_id: Cumque optio impedit. + project_id: Quia voluptatem impedit. + status: error + version: 5803043317553025654 required: - id - project_id @@ -4538,14 +4564,14 @@ definitions: label: type: string description: Optional friendly name - example: Nulla fuga fugit repellendus et accusamus sed. + example: Aut repudiandae voluptatibus odit autem. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Sequi error. + label: Dicta qui. org_id: "208777" required: - account_id @@ -4557,10 +4583,10 @@ definitions: access_token: type: string description: OAuth access token - example: Quam deleniti et et. + example: Et earum id. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Quia aperiam sunt est labore. + access_token: Voluptate dolorum id ut molestias id. required: - access_token MetaAdsConnection: @@ -4570,35 +4596,35 @@ definitions: account_id: type: string description: Provider account identifier - example: Delectus voluptatem iste nisi in. + example: Autem aliquam voluptatibus assumenda mollitia molestias eos. app_id: type: string description: Meta app ID - example: Iste qui rerum est sed sed similique. + example: Fugit eum et sint possimus omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut est rerum. + example: Ipsa aut. label: type: string description: Optional friendly name - example: Natus expedita aspernatur consequuntur quod ducimus molestias. + example: Impedit vitae molestiae. page_id: type: string description: Facebook page ID - example: Dolor occaecati earum iusto rerum sit cupiditate. + example: Et consequatur vel quisquam. project_id: type: string description: Owning project - example: Occaecati et. + example: Non assumenda molestiae. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -4607,18 +4633,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 3681253484013323435 + example: 1948493999542129316 format: int64 example: - account_id: Qui quidem exercitationem. - app_id: Necessitatibus laudantium est ut. + account_id: Vel temporibus sunt nulla esse sed. + app_id: Sed ea qui pariatur adipisci doloremque. has_credentials: false - id: Ea maiores quidem molestiae deleniti omnis. - label: Nostrum corporis quasi magnam. - page_id: Architecto quas eligendi impedit qui sed. - project_id: Expedita voluptatum commodi fuga ipsa. - status: active - version: 8272760528024179326 + id: Neque hic voluptatem ad similique sunt. + label: Ratione impedit recusandae dolor consequatur. + page_id: Veritatis perferendis veritatis libero. + project_id: Doloremque dicta. + status: deleted + version: 8079523500580416969 required: - id - project_id @@ -4637,20 +4663,20 @@ definitions: app_id: type: string description: Meta app ID - example: Exercitationem illum et quisquam. + example: Recusandae est perferendis eos et cumque. label: type: string description: Optional friendly name - example: Neque facilis est qui possimus eligendi. + example: Esse dolores aut. page_id: type: string description: Facebook page ID - example: Possimus et corrupti et nobis voluptas. + example: Exercitationem voluptate quia esse nihil. example: account_id: act_193556282970417 - app_id: Quia quisquam corrupti distinctio voluptas eius. - label: Est facilis qui. - page_id: Modi ut culpa excepturi blanditiis. + app_id: Laborum omnis. + label: Esse neque maiores quo aliquam. + page_id: Rem eveniet in autem neque. required: - account_id MetaAdsCredentials: @@ -4660,15 +4686,15 @@ definitions: access_token: type: string description: Meta access token - example: Autem est est distinctio sunt aliquid harum. + example: Voluptatem possimus veniam dignissimos consequatur. app_secret: type: string description: Meta app secret - example: Nam rerum eaque eius. + example: Delectus enim quas id porro. description: Meta Ads credential. Write-only; never returned. example: - access_token: Rerum illo mollitia odio et dolor. - app_secret: Consectetur sint error ipsam maiores. + access_token: Est porro eos ipsa quia. + app_secret: Quo repudiandae. required: - access_token - app_secret @@ -4679,31 +4705,31 @@ definitions: account_id: type: string description: Provider account identifier - example: Et rerum in expedita. + example: Modi esse voluptatibus. customer_id: type: string description: Microsoft Advertising customer ID - example: Repellat assumenda nesciunt distinctio eaque aliquam. + example: Quo veritatis id accusamus hic. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Consequatur dolore unde illum. + example: Veniam molestias. label: type: string description: Optional friendly name - example: Quo veritatis quis delectus est. + example: Tenetur cumque rerum. project_id: type: string description: Owning project - example: Dolores tenetur ut illum. + example: Accusamus quia velit commodi. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -4712,17 +4738,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4673192311933251173 + example: 2983004504871549622 format: int64 example: - account_id: Aperiam cum possimus. - customer_id: Omnis sed dolore dolorem voluptatibus quod. - has_credentials: false - id: Veniam consectetur deserunt in hic dolorum facere. - label: Magni consequatur dignissimos itaque quia. - project_id: Et reprehenderit dignissimos. - status: error - version: 3475949958922975875 + account_id: Inventore quisquam praesentium nihil atque et nihil. + customer_id: Ad ex. + has_credentials: true + id: Officia et optio sed omnis aut voluptatem. + label: Maxime et ea et. + project_id: Nisi eum omnis est. + status: inactive + version: 3453857184328446715 required: - id - project_id @@ -4737,19 +4763,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Ullam ab suscipit et labore harum. + example: Atque reprehenderit. customer_id: type: string description: Microsoft Advertising customer ID - example: Deleniti doloribus debitis assumenda dignissimos. + example: Eligendi incidunt accusamus excepturi. label: type: string description: Optional friendly name - example: Non iste ad rem quidem sunt qui. + example: Dolore delectus ut beatae eaque. example: - account_id: Quisquam quam officiis aut. - customer_id: Architecto ut unde. - label: Vitae aut ea. + account_id: Molestiae id aut debitis iure. + customer_id: Dolore est dolorem quod enim pariatur. + label: Qui est ut voluptas quod minima dolor. required: - account_id MicrosoftAdsCredentials: @@ -4759,25 +4785,25 @@ definitions: client_id: type: string description: OAuth client id - example: Sapiente possimus. + example: Occaecati veritatis. client_secret: type: string description: OAuth client secret - example: Voluptates atque. + example: Aut architecto aliquam mollitia labore sapiente. developer_token: type: string description: Microsoft Advertising developer token - example: Praesentium tenetur quas at ut necessitatibus dolor. + example: Quia mollitia. refresh_token: type: string description: OAuth refresh token - example: Eaque voluptate reprehenderit sed voluptatem sed illo. + example: Tenetur non accusamus qui ex. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Cum nisi numquam. - client_secret: Id unde veritatis officiis aut fugiat. - developer_token: Quo corporis recusandae dicta quibusdam. - refresh_token: Ut commodi et voluptas tenetur nobis facere. + client_id: Ex et amet sunt. + client_secret: Ad quae nisi. + developer_token: Cum et ab ipsum. + refresh_token: Reiciendis enim. required: - client_id - client_secret @@ -4809,24 +4835,24 @@ definitions: campaign_id: type: string description: Upstream platform campaign id (present when ok) - example: Sed sit repudiandae aut aut. + example: Ex et alias ea asperiores quas. error: type: string description: Failure reason (present when not ok) - example: Dolores vel dolorum minus voluptatem. + example: Corporis dolorem laborum maiores est ea ducimus. ok: type: boolean description: Whether the campaign was created (or reused) successfully - example: false + example: true platform: type: string description: Platform this result is for - example: Enim temporibus. + example: Aut quo. example: - campaign_id: Qui culpa deleniti. - error: Et atque enim quis sed. - ok: true - platform: Architecto itaque doloribus voluptatem consequatur quis fugiat. + campaign_id: Ullam ad iusto quos et est. + error: Explicabo aliquid. + ok: false + platform: Dolorem dignissimos. required: - platform - ok @@ -4875,27 +4901,27 @@ definitions: account_id: type: string description: Provider account identifier - example: Facilis suscipit. + example: Aut omnis itaque ut vero voluptatibus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Maiores laudantium. + example: Non eos. label: type: string description: Optional friendly name - example: Non sint inventore iste iure ut. + example: Enim voluptatem inventore quasi. project_id: type: string description: Owning project - example: Perspiciatis deleniti. + example: Vel aut aliquam rerum et quidem. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -4904,16 +4930,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4582993025544492856 + example: 6330819027913820088 format: int64 example: - account_id: Expedita dignissimos non sed omnis officiis et. - has_credentials: false - id: Ad inventore voluptatum eligendi quasi. - label: Velit dolores omnis placeat unde distinctio ducimus. - project_id: Ipsa et dolore. - status: active - version: 4526728339972318921 + account_id: Quibusdam repellendus qui numquam. + has_credentials: true + id: Voluptatibus voluptatem vero dolorem qui. + label: Vero vel. + project_id: Sequi non et. + status: inactive + version: 4305260724068280609 required: - id - project_id @@ -4932,10 +4958,10 @@ definitions: label: type: string description: Optional friendly name - example: Enim repellendus magni repudiandae inventore. + example: A voluptatem ipsa et voluptatem. example: account_id: t2_gv9wtbfa - label: Corrupti repellat eius ut qui nobis. + label: Est voluptatibus placeat sint pariatur. required: - account_id RedditAdsCredentials: @@ -4945,20 +4971,20 @@ definitions: client_id: type: string description: OAuth client id - example: Delectus quam et eos. + example: Explicabo expedita et velit accusamus. client_secret: type: string description: OAuth client secret - example: Rem aut fuga. + example: Deleniti placeat rerum. refresh_token: type: string description: OAuth refresh token - example: Est dolor ut corporis. + example: Nulla eos. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Cupiditate ut illo dolor quaerat totam. - client_secret: Illo vitae occaecati omnis. - refresh_token: Pariatur debitis. + client_id: Recusandae totam soluta. + client_secret: Praesentium libero. + refresh_token: Qui et assumenda quas. required: - client_id - client_secret @@ -4970,11 +4996,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Eum et sint corrupti eos. + example: Qui sed voluptatibus quam quia. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Qui unde dicta autem dolorem qui explicabo. + example: Sapiente laudantium molestiae omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4982,19 +5008,19 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Explicabo possimus consequatur. + example: Quisquam animi. label: type: string description: Optional friendly name - example: Neque autem ex eos. + example: Repudiandae facilis blanditiis libero nam. project_id: type: string description: Owning project - example: Quos hic doloribus. + example: Delectus blanditiis magnam sed iure amet. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -5003,17 +5029,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 4374149818121411294 + example: 9048631027735279786 format: int64 example: - account_id: Sit est dolores est et. - funding_instrument_id: Velit atque laudantium ullam rerum. - has_credentials: false - id: Repellat non suscipit veritatis sit tempore. - label: Ut quo iure. - project_id: Magnam ut similique ea minima magnam. - status: deleted - version: 7309957715046801903 + account_id: Officiis aliquid explicabo eaque ab. + funding_instrument_id: Ea iusto eveniet velit sint odit sed. + has_credentials: true + id: Consequuntur perspiciatis modi. + label: Vero et atque in impedit velit omnis. + project_id: Quae sed. + status: inactive + version: 187687687190489160 required: - id - project_id @@ -5032,15 +5058,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Enim accusantium labore esse numquam. + example: Esse voluptate optio quis quae quam. label: type: string description: Optional friendly name - example: Rerum adipisci. + example: Eos nemo cupiditate. example: account_id: 8r7gb - funding_instrument_id: Dolorum deserunt. - label: Non laudantium sunt minima repudiandae illo harum. + funding_instrument_id: Pariatur nostrum. + label: Odio quia omnis commodi. required: - account_id TwitterAdsCredentials: @@ -5050,25 +5076,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Saepe voluptatem reiciendis pariatur. + example: Voluptas ut vero autem consequuntur optio omnis. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Et ut quis ut. + example: Pariatur omnis ut velit dolorem dolor. consumer_key: type: string description: OAuth 1.0a consumer key - example: Sit dolor sunt eos nihil ipsam. + example: Illo porro velit perferendis. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Odio totam cum deleniti placeat fuga. + example: Ipsum aut voluptas molestias unde. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Aut autem sint minus voluptatum. - access_token_secret: Tempore quae. - consumer_key: Iusto omnis. - consumer_secret: Quia cum non. + access_token: Mollitia nulla. + access_token_secret: Minus voluptatem ab delectus porro. + consumer_key: Omnis in qui. + consumer_secret: Nihil ut. required: - consumer_key - consumer_secret diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index 819d47c6..dd5372bd 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Nobis est fugit ratione consectetur exercitationem."},"example":"Aperiam quia doloribus omnis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Ut temporibus aliquam animi unde.","event_details":"Et architecto voluptas ratione delectus ut.","event_slug":"Magni autem.","id":"Laboriosam tempore vero voluptatum a quos.","keywords":"Ut est nobis aspernatur.","platforms":["Tempore nihil quos.","Eum dignissimos iure praesentium ea.","Quis quas qui mollitia perferendis eveniet voluptas."],"program_type":"Nemo perspiciatis et qui aliquam doloremque itaque.","project_id":"Sed exercitationem ut totam ut minus.","status":"draft","targeting":"Fugit qui tempora commodi reiciendis sit alias.","url":"Ullam tenetur quia totam magni sunt repellat.","version":958049424855577225}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Sit ut repellat voluptas."},"example":"Eligendi consequatur officia labore eos."}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Excepturi fugit."},"example":"Aut quia voluptates voluptates nisi."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut molestias aut excepturi cumque."},"example":"Ut hic distinctio non recusandae et qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Quaerat ea accusantium.","event_details":"Amet iusto provident sequi est.","event_slug":"Ut ea alias.","id":"Explicabo cupiditate rerum.","keywords":"Voluptatem iure vero.","platforms":["Accusantium quis architecto.","Enim magnam eius voluptas voluptatibus deleniti.","Dolorum excepturi quibusdam."],"program_type":"Hic vero et.","project_id":"Incidunt ipsum est perspiciatis soluta voluptas est.","status":"draft","targeting":"Consequatur neque tempore voluptatibus quo quod nesciunt.","url":"Nam aspernatur qui quidem est eligendi.","version":7881322722259816896}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Exercitationem officia corrupti tempora ea."},"example":"Totam unde."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsa sint optio nobis quae corporis."},"example":"Voluptas ut nostrum officiis et accusamus provident."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Rerum ut culpa totam sequi sit.","event_details":"Sit et quod porro sed minus.","event_slug":"Et ratione sit.","id":"Et assumenda recusandae.","keywords":"Excepturi dolor labore.","platforms":["Omnis veritatis omnis.","Officia et pariatur molestias autem ratione.","Ut et veniam maiores."],"program_type":"Totam id incidunt.","project_id":"Sint eveniet dicta numquam doloremque ab cumque.","status":"draft","targeting":"Iusto dolores.","url":"Sed ipsum quia.","version":7723389563281978281}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Odio eos earum fuga non est."},"example":"Rerum reiciendis similique."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempora qui incidunt tempora."},"example":"Vero voluptates soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Sint qui praesentium ea praesentium magni.","event_details":"Consequuntur neque mollitia quia.","event_slug":"Tempora veritatis harum ab nobis fuga atque.","id":"Et tempore.","keywords":"Iure dolore et et aut nam.","platforms":["Blanditiis et qui est dolorem eos.","Dolorem sed atque.","Provident id quia porro rerum.","Quo aliquid nobis."],"program_type":"Ratione incidunt est saepe.","project_id":"Eligendi earum qui est et id laudantium.","status":"archived","targeting":"Voluptates odit consequatur quis.","url":"Fugiat aut laboriosam maxime facere culpa modi.","version":317664992246136086}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Repudiandae odit."},"example":"Cupiditate est illo repellat et cum repellat."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Rerum sint optio.","platforms":["Quos tempora dolorem dolor fugiat quia.","Exercitationem rerum iste ducimus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Temporibus ipsum necessitatibus ratione possimus."},"example":"Facilis repellat eveniet reiciendis."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Consequatur sint et vel molestiae."},"example":"Non placeat."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus pariatur et et sed debitis."},"example":"Necessitatibus reprehenderit illum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Est qui molestiae rerum adipisci minima quibusdam.","campaign_name":"Harum distinctio reiciendis architecto atque maxime soluta.","id":"Commodi quam voluptates.","platform":"Accusantium sunt culpa libero quisquam.","platform_campaign_id":"Rerum amet aut tempora recusandae aspernatur.","project_id":"Optio dolorem omnis.","status":"Ducimus porro maxime.","version":5829797402937558935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"Minima adipisci aut quia quisquam."},"example":"Quia facilis sit."},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"Magnam nihil qui doloremque nam magnam aliquid."},"example":"Possimus accusantium expedita alias."},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Incidunt sit."},"example":"Totam tempora quod expedita."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Exercitationem consectetur.","campaign_name":"Modi asperiores ut libero vel.","id":"Laboriosam quis facere.","platform":"Nesciunt necessitatibus ex ea ullam corrupti sunt.","platform_campaign_id":"Omnis accusantium ad.","project_id":"Totam sapiente vitae numquam ut nesciunt voluptas.","status":"Voluptates iste autem veniam et enim unde.","version":1765361339666375563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas ipsam iste."},"example":"Delectus libero necessitatibus quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis sapiente ut sit quod.","has_credentials":true,"id":"Ea minus enim ut.","label":"Magnam ut et ab.","login_customer_id":"Quae nihil magni.","project_id":"Nostrum veniam qui rerum ipsum eum fugit.","status":"error","version":7243034772713915274}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Commodi et nihil et."},"example":"Repellendus adipisci sit et enim quasi ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Magni et rerum sed voluptatum.","has_credentials":false,"id":"Veniam velit sequi sit impedit dolorum voluptas.","label":"Enim est occaecati sed non dolorem distinctio.","login_customer_id":"Nostrum tenetur repellendus.","project_id":"Ipsum quaerat delectus cupiditate sit et.","status":"deleted","version":5181448788196437025}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut sunt ex et autem delectus."},"example":"Occaecati placeat et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Deserunt magni voluptas odio assumenda totam.","has_credentials":true,"id":"Laudantium expedita ut ipsum id commodi nobis.","label":"Velit sapiente qui iusto quis magni et.","login_customer_id":"Officiis deleniti ipsam nam.","project_id":"Vitae aut voluptatem inventore ab.","status":"deleted","version":6633489521806040497}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aut id molestiae sit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem quia."},"example":"Adipisci consectetur ut modi quo et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Non ut voluptas et accusamus natus id.","brand_kit":"Eos voluptatibus.","has_credentials":true,"id":"Sit similique ut minima ut.","label":"Quia enim illo et eligendi.","portal_id":"Et quam architecto vero.","project_id":"Voluptatum officia quod error amet quia inventore.","sender_email":"Vero labore laudantium maiores.","sender_name":"Reiciendis dignissimos consequatur iste qui minima.","status":"deleted","version":4350724330275405551}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure ut."},"example":"Minus id deleniti."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Debitis soluta sed quod dicta aperiam eveniet.","brand_kit":"Voluptas expedita omnis ex.","has_credentials":true,"id":"Deleniti itaque voluptas magnam.","label":"Consequuntur sit libero autem ut.","portal_id":"Accusantium sequi modi corrupti esse mollitia.","project_id":"Voluptatem modi velit vitae optio ut.","sender_email":"Saepe rerum sunt eum et qui aut.","sender_name":"Ut quia harum.","status":"error","version":6360555217771164808}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum autem quia quis soluta nostrum cumque."},"example":"Quia velit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Autem recusandae totam.","brand_kit":"Similique deserunt iusto.","has_credentials":true,"id":"Ex delectus.","label":"Officia quidem non qui voluptates natus cum.","portal_id":"Odit necessitatibus veritatis amet ut rerum quidem.","project_id":"Voluptas ullam dolores rem.","sender_email":"Iusto velit quo voluptatibus modi reiciendis aliquam.","sender_name":"Quidem explicabo expedita sunt.","status":"active","version":3951189417473657674}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Aut natus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Aspernatur possimus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Tempore qui est."},"example":"Provident saepe aliquam architecto non vero."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Accusamus vero et voluptas accusamus sunt.","has_credentials":true,"id":"Minus voluptas asperiores debitis labore aut.","label":"Distinctio ipsa nihil ad hic repellendus nobis.","org_id":"Vel blanditiis sunt ut facere.","project_id":"Porro ab id necessitatibus consequatur natus tempora.","status":"error","version":4876542408988375571}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus aliquam aut quas aliquid."},"example":"Praesentium beatae quis ut eius."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Facere harum enim consequatur id voluptatem.","has_credentials":true,"id":"Ducimus sequi.","label":"Quia tenetur ducimus.","org_id":"Consequatur dolorum sint voluptatem voluptas omnis est.","project_id":"Autem ab voluptas culpa.","status":"active","version":4064850428710517856}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas consequatur iusto nostrum pariatur."},"example":"Quidem minus pariatur praesentium."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Et corporis officia sint.","has_credentials":false,"id":"Consequatur omnis quidem est non tenetur.","label":"Voluptatibus qui cupiditate voluptatem.","org_id":"Quia nulla autem ratione.","project_id":"Deleniti dolores commodi.","status":"error","version":874315130556833044}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Qui esse."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Mollitia a magni vel consequatur ea deserunt.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Deserunt reiciendis dolorem totam voluptatem."},"example":"Repudiandae molestias est consectetur porro quo pariatur."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Aut et.","app_id":"Quia laboriosam magnam unde hic.","has_credentials":false,"id":"Facilis facilis aut suscipit aut odio iste.","label":"Tenetur velit quaerat aut.","page_id":"Distinctio ea totam rem harum provident.","project_id":"Deleniti earum magni quibusdam.","status":"deleted","version":5896744453366252956}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas libero pariatur ut qui sint."},"example":"Quasi esse corporis molestiae excepturi suscipit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Quibusdam vel autem modi id facere.","app_id":"Possimus expedita qui.","has_credentials":true,"id":"Eius voluptatem molestiae qui suscipit rerum.","label":"Rem architecto.","page_id":"Et maxime.","project_id":"Eligendi tempora quos.","status":"deleted","version":8688592599556109682}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut ea."},"example":"Aliquam eum molestiae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Vero commodi est qui asperiores velit enim.","app_id":"Architecto dicta.","has_credentials":true,"id":"Atque rerum et officiis sapiente et et.","label":"Eligendi ea vel consequatur nihil.","page_id":"Ut est recusandae aspernatur eum fugit voluptas.","project_id":"Dolores in hic rem.","status":"deleted","version":2446786767075191046}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Numquam doloremque et qui perferendis ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis iusto molestias itaque."},"example":"Fugit et soluta."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Doloremque architecto ea et.","customer_id":"Exercitationem soluta possimus a.","has_credentials":false,"id":"Sed maiores qui sed exercitationem quam.","label":"Et et veritatis voluptas nobis.","project_id":"Non sint praesentium quia.","status":"active","version":2312965176389631300}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem labore laboriosam repellat harum."},"example":"Aut eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Quia sed omnis quaerat aut.","customer_id":"Magnam cumque quasi magni ducimus.","has_credentials":true,"id":"Ducimus debitis nesciunt quas quibusdam occaecati cum.","label":"Nostrum laborum minima.","project_id":"Iste voluptatem et voluptatem ut ut.","status":"error","version":3654633208585641813}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et qui officiis repudiandae qui iste accusantium."},"example":"Consequatur provident ea sint."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Quis possimus placeat.","customer_id":"Et qui et.","has_credentials":true,"id":"Dignissimos voluptate iste.","label":"Ad esse neque earum modi.","project_id":"Aut qui est iste.","status":"active","version":280885210133145304}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Quo quae aut culpa.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Corrupti aut earum rerum ducimus dicta."},"example":"Perspiciatis a aut quas delectus a."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Incidunt aut aperiam et ipsam.","has_credentials":true,"id":"Pariatur consequatur iste sed illo.","label":"Consectetur porro quo.","project_id":"Sunt ipsa.","status":"error","version":6549464945762782488}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur delectus libero id."},"example":"Aut sit iste."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Neque ipsum nihil cumque repellendus.","has_credentials":true,"id":"Sit iusto.","label":"Architecto unde rerum quisquam ut.","project_id":"Voluptates neque expedita.","status":"inactive","version":3464454785938965677}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur iste eum amet vel impedit et."},"example":"Adipisci et laboriosam veritatis saepe numquam rem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Est consequatur eveniet in fuga ut.","has_credentials":false,"id":"Recusandae beatae aliquam quia officiis hic ea.","label":"Vitae quae debitis sunt aperiam ex voluptatibus.","project_id":"Ut dolor velit.","status":"active","version":2352400902970282412}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ratione consequuntur aut et corrupti.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ullam sunt rem non doloribus."},"example":"Corrupti ipsum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Dignissimos necessitatibus consequuntur.","funding_instrument_id":"Ipsum voluptatem et quam beatae laborum omnis.","has_credentials":true,"id":"Error necessitatibus et autem doloribus est.","label":"Repudiandae voluptatem vitae iste maxime modi laborum.","project_id":"Maxime labore illo maxime provident.","status":"error","version":1380295609570133746}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptas esse qui quisquam quae est magni."},"example":"Quibusdam accusamus possimus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","funding_instrument_id":"Eaque animi molestias error laudantium.","has_credentials":true,"id":"Quis et odio tenetur optio.","label":"Iste eveniet laudantium rerum.","project_id":"Ut sint.","status":"error","version":7980949958307848867}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequuntur quia et saepe aperiam."},"example":"Accusamus ipsa qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Nobis nam.","funding_instrument_id":"Reiciendis pariatur quisquam.","has_credentials":true,"id":"Aut quis qui laudantium dolore.","label":"Non quidem doloribus debitis itaque itaque dolores.","project_id":"Possimus nihil qui enim ratione voluptatem eos.","status":"error","version":7616558197057713508}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ea voluptatem eum voluptas eveniet.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"Sit harum ipsa et."},"example":"Dignissimos fugiat voluptatibus natus."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Reiciendis et perspiciatis saepe consequatur doloribus.","job_id":"Velit minus.","result":[{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."},{"campaign_id":"Quidem qui iusto sed quaerat vel fuga.","error":"Odio nulla ut laboriosam vel rerum.","ok":false,"platform":"Dolor molestias ipsa dolorum est."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Odit odio praesentium."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eaque ratione debitis nam blanditiis."},"event_details":{"description":"Extracted event/course details","example":"Dolorem fugiat et aspernatur voluptatem nobis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Nihil sunt doloremque."},"id":{"type":"string","description":"Brief UUID","example":"Vero at ut quis."},"keywords":{"description":"Keyword list","example":"Eveniet sint voluptatibus quam dicta."},"platforms":{"type":"array","items":{"type":"string","example":"Ea architecto autem iste."},"description":"Suggested default platforms","example":["Ipsa tempore incidunt velit provident.","Magni tempore sunt itaque omnis.","Ex sunt sit beatae.","Modi voluptatum veniam molestiae quibusdam."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui maiores quia non unde deserunt."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae aut fugit alias."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Consequuntur voluptatem est qui."},"url":{"type":"string","description":"Event/course page URL","example":"Ut ut odio odio sed minus quia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6644792324746576285,"format":"int64"}},"example":{"copy":"Iure culpa est possimus dolores dignissimos.","etag":"Id eum aut et itaque.","event_details":"Itaque est fugiat aut dicta.","event_slug":"Magnam quisquam et consequuntur ut sunt.","id":"Ex aut quia distinctio consequatur.","keywords":"Velit laudantium error.","platforms":["Beatae sed aut quia nihil est.","Qui fugiat."],"program_type":"Provident repudiandae sit qui aut aut.","project_id":"Dolor corporis consequatur voluptatem voluptates sed.","status":"draft","targeting":"Et aut quia beatae.","url":"Et velit fuga quos est.","version":9139670973455309725},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut aperiam voluptate voluptates."},"event_details":{"description":"Extracted event/course details","example":"Eum necessitatibus alias."},"event_slug":{"type":"string","description":"Event/course slug","example":"Provident dicta tenetur voluptatem voluptate dolor."},"id":{"type":"string","description":"Brief UUID","example":"Ad quis aperiam deserunt nostrum."},"keywords":{"description":"Keyword list","example":"Sapiente molestiae dolorum repellat expedita ut."},"platforms":{"type":"array","items":{"type":"string","example":"Odio sunt esse mollitia incidunt."},"description":"Suggested default platforms","example":["Laborum sed molestias veritatis itaque.","Est quis impedit.","Illo harum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Qui minima in nulla sunt autem eos."},"project_id":{"type":"string","description":"Owning project","example":"Et sed praesentium libero."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Dolor quam dolor consectetur eos iste."},"url":{"type":"string","description":"Event/course page URL","example":"Provident porro."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":709937816203366628,"format":"int64"}},"example":{"copy":"Animi sit esse ratione aliquid.","event_details":"Repudiandae tenetur aperiam saepe vel.","event_slug":"Alias minus reprehenderit dignissimos aut velit.","id":"Quis veniam iusto consequatur quia.","keywords":"Laborum est quasi dignissimos.","platforms":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."],"program_type":"Impedit dolores.","project_id":"Officia eligendi alias.","status":"draft","targeting":"Velit quis harum recusandae est ipsum.","url":"At sint laborum veniam.","version":285293330655778463},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Reiciendis sit minima."},"event_details":{"description":"Extracted event/course details","example":"Eligendi ipsam aut vel atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Perspiciatis alias et amet ex molestiae."},"id":{"type":"string","description":"Brief UUID","example":"Modi repellat eum."},"keywords":{"description":"Keyword list","example":"Unde et."},"platforms":{"type":"array","items":{"type":"string","example":"Pariatur mollitia incidunt autem."},"description":"Suggested default platforms","example":["Voluptate fuga ea distinctio maiores mollitia aut.","Rerum cum eaque nesciunt est totam inventore."]},"program_type":{"type":"string","description":"Funnel context","example":"Eligendi magni quidem sit in quia."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem eos doloribus sint."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut dolores in voluptas."},"url":{"type":"string","description":"Event/course page URL","example":"Minus libero et consequuntur suscipit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3896136867528920326,"format":"int64"}},"example":{"copy":"Sapiente harum aliquam sunt eum rerum eaque.","event_details":"Voluptatem sint hic.","event_slug":"Aut omnis labore et quis consequatur dolores.","id":"Numquam molestias quibusdam aliquid deleniti.","keywords":"Facere voluptatibus.","platforms":["Minima aut fugit eos et iure laudantium.","Est molestiae voluptates ipsum neque sapiente aliquid.","Velit sunt molestiae eius.","Reprehenderit nobis hic eos magni."],"program_type":"Est natus sequi beatae.","project_id":"Est aliquam debitis natus.","status":"approved","targeting":"Nisi repudiandae.","url":"Nostrum similique omnis iste.","version":7605661861379582739},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Delectus veniam vel est et magni."},"event_details":{"description":"Extracted event/course details","example":"Vero consequatur possimus aut assumenda."},"event_slug":{"type":"string","description":"Event/course slug","example":"Recusandae ut ullam aliquam dolore iure."},"id":{"type":"string","description":"Brief UUID","example":"Velit omnis dolorem est aut."},"keywords":{"description":"Keyword list","example":"Et provident illo non quisquam iure doloremque."},"platforms":{"type":"array","items":{"type":"string","example":"Officia natus quia labore."},"description":"Suggested default platforms","example":["Dolores et incidunt voluptatem ipsa.","Assumenda excepturi.","Tempora est eveniet sequi ea."]},"program_type":{"type":"string","description":"Funnel context","example":"Consequuntur esse culpa."},"project_id":{"type":"string","description":"Owning project","example":"Recusandae dignissimos dolore harum totam tempora vitae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut aliquid."},"url":{"type":"string","description":"Event/course page URL","example":"Minus nostrum iste nemo fugiat sunt."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1796419171074064120,"format":"int64"}},"example":{"copy":"Commodi qui mollitia et eum veniam.","event_details":"Alias voluptatem ut consequatur ut recusandae.","event_slug":"Ab laboriosam sunt quis omnis.","id":"Veritatis impedit aut.","keywords":"Aliquam eaque voluptatem omnis.","platforms":["Alias temporibus illum impedit ullam.","Suscipit harum.","Neque quia.","Et veniam itaque optio consequatur nulla sint."],"program_type":"Exercitationem accusamus pariatur saepe ab qui.","project_id":"Earum doloribus.","status":"approved","targeting":"Cupiditate aut.","url":"Sunt quis odio enim nam id voluptatem.","version":232152934679383541},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Qui rerum numquam quo omnis a quia."},"event_details":{"description":"Extracted event/course details","example":"Itaque qui repudiandae magnam atque."},"event_slug":{"type":"string","description":"Event/course slug","example":"Soluta dolore vitae."},"id":{"type":"string","description":"Brief UUID","example":"Minima iure quos enim occaecati beatae."},"keywords":{"description":"Keyword list","example":"Culpa ipsam totam nulla."},"platforms":{"type":"array","items":{"type":"string","example":"Reiciendis laudantium dolor ipsam recusandae maxime nesciunt."},"description":"Suggested default platforms","example":["Voluptatem aut debitis vitae unde velit eos.","Accusantium odit rerum commodi ea.","Consequatur et."]},"program_type":{"type":"string","description":"Funnel context","example":"Quaerat et eius culpa magni illum consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae ad voluptatum ducimus accusantium et."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestias sint sequi."},"url":{"type":"string","description":"Event/course page URL","example":"In commodi et asperiores et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":122602759626083426,"format":"int64"}},"example":{"copy":"Fuga atque.","event_details":"Qui omnis nesciunt qui consequuntur.","event_slug":"Minima dolorem sit est tempora qui.","id":"Placeat perferendis omnis ad voluptas.","keywords":"Sequi culpa.","platforms":["Praesentium cumque illum pariatur odio molestias voluptatum.","Nulla perferendis possimus deserunt iure et.","Ea quidem ducimus tempora ea molestias."],"program_type":"Enim totam.","project_id":"Voluptates laboriosam cumque mollitia quidem quo.","status":"draft","targeting":"Odit provident sed quo aperiam.","url":"Voluptas necessitatibus cumque non porro qui molestias.","version":4353559979947303924},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Voluptas aperiam."},"event_details":{"description":"Extracted event/course details","example":"Dolores enim."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Rerum numquam amet deserunt rem quia."},"keywords":{"description":"Keyword list","example":"Assumenda harum eos eveniet ut et laboriosam."},"platforms":{"type":"array","items":{"type":"string","example":"Numquam omnis ullam facilis ab sapiente."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Esse voluptate eum laboriosam distinctio non.","Deserunt labore et id aut et adipisci.","Ut molestiae.","Voluptates ut culpa saepe necessitatibus."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Quos expedita voluptas qui eaque."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsam dolores et et qui ut."}},"example":{"copy":"Porro ut et cupiditate.","event_details":"Non assumenda perspiciatis.","event_slug":"Nostrum ratione id.","keywords":"Ea ullam minima voluptatem vel deleniti.","platforms":["Quae molestiae suscipit non iusto.","Consequatur in vero soluta.","Eius dicta.","Ullam distinctio dolore velit."],"program_type":"education","targeting":"Repudiandae necessitatibus dolorem enim beatae quia.","url":"Laborum aspernatur voluptate itaque fugit."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Aut ut."},"campaign_name":{"type":"string","description":"Campaign name","example":"Aut ut sit nisi architecto."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptate enim qui impedit temporibus."},"id":{"type":"string","description":"Campaign UUID","example":"Et vel beatae molestiae fuga."},"platform":{"type":"string","description":"Channel","example":"Sed corrupti sit."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Labore quia esse consectetur tenetur eum."},"project_id":{"type":"string","description":"Owning project","example":"Vitae consequatur eos."},"status":{"type":"string","description":"Campaign status","example":"Rerum et recusandae possimus quis."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9161333083936888105,"format":"int64"}},"example":{"brief_id":"Explicabo repudiandae aut reiciendis recusandae molestias.","campaign_name":"Hic est quia pariatur odit ullam.","etag":"Quisquam nisi repellendus quos magnam aut.","id":"Eos omnis cumque nemo ipsam ut.","platform":"Vel inventore aliquid aut non eligendi accusamus.","platform_campaign_id":"Quod impedit accusamus incidunt minus veritatis enim.","project_id":"Natus et unde.","status":"Ex id corrupti sed quo perferendis.","version":7863921121752869750},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptates sit est corporis molestiae voluptatem."},"campaign_name":{"type":"string","description":"Campaign name","example":"Ratione ipsum."},"id":{"type":"string","description":"Campaign UUID","example":"Et incidunt."},"platform":{"type":"string","description":"Channel","example":"Expedita inventore qui necessitatibus ut necessitatibus in."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Autem maxime hic."},"project_id":{"type":"string","description":"Owning project","example":"Dolor sed excepturi delectus."},"status":{"type":"string","description":"Campaign status","example":"Amet hic est."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":906675377577277444,"format":"int64"}},"example":{"brief_id":"Magnam voluptates molestiae libero autem quod.","campaign_name":"Sunt accusantium totam quia.","id":"Occaecati rerum reiciendis.","platform":"Ullam ipsum.","platform_campaign_id":"Dolores dolore id dolore sed.","project_id":"Esse mollitia et dolorum accusantium aspernatur quos.","status":"Accusantium debitis adipisci qui iste explicabo.","version":9006499932988805057},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Dolor quia consectetur non nulla dolore."},"campaign_name":{"type":"string","description":"Campaign name","example":"Quos omnis."},"id":{"type":"string","description":"Campaign UUID","example":"Qui quia."},"platform":{"type":"string","description":"Channel","example":"Ducimus voluptas soluta quod qui."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Fugiat est omnis inventore voluptatum ab totam."},"project_id":{"type":"string","description":"Owning project","example":"Ipsam sint autem repudiandae asperiores."},"status":{"type":"string","description":"Campaign status","example":"Libero consequatur."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3986034538934721868,"format":"int64"}},"example":{"brief_id":"Reiciendis odit eos et quidem.","campaign_name":"Quae voluptatem velit mollitia dolorem ea.","id":"Sapiente ex est modi cupiditate possimus ducimus.","platform":"Atque hic quam impedit placeat.","platform_campaign_id":"Voluptatibus aliquam et.","project_id":"Modi consequatur molestias et et deleniti.","status":"Enim voluptas numquam.","version":616047483519279742},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Qui libero natus."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["microsoft-ads","meta-ads","twitter-ads","hubspot"]}},"example":{"config":"Vitae officia dolorem.","platforms":["meta-ads","twitter-ads","hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Id voluptatem nihil quaerat asperiores."},"config":{"description":"Campaign configuration snapshot","example":"Error perferendis quae qui inventore dolorem."},"status":{"type":"string","description":"Campaign status","example":"Repellat vel veritatis hic rerum accusamus."}},"example":{"campaign_name":"Quasi in aut nam rerum.","config":"Architecto deserunt vero ducimus distinctio.","status":"Distinctio magnam."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Magni aut nisi est sit sint."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Et voluptas dolorem necessitatibus illum quisquam.","ok":true},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Expedita unde molestiae.","event_details":"Mollitia molestiae saepe qui ex commodi.","event_slug":"Nesciunt unde ullam occaecati maxime.","keywords":"Voluptas dolor et incidunt pariatur quod odit.","platforms":["Ut expedita voluptatum sit.","Quasi voluptas corporis velit et.","Quia ut atque."],"program_type":"education","targeting":"Velit ullam.","url":"Similique vel nobis non molestias."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Vitae reiciendis voluptatem.","platforms":["reddit-ads","microsoft-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."},"credentials":{"private_app_token":"Aut natus."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"},"credentials":{"access_token":"Qui esse."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."},"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."},"credentials":{"client_id":"Quis quo illum cum quod.","client_secret":"Ut fugiat magnam quia.","developer_token":"Distinctio beatae.","refresh_token":"Ut tempora consequuntur cumque repudiandae omnis ut."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."},"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."},"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Velit quis."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel architecto quae error dolor placeat."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem nostrum."},"label":{"type":"string","description":"Optional friendly name","example":"Ut nobis."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Minus et."},"project_id":{"type":"string","description":"Owning project","example":"Deleniti voluptas quo nostrum quia."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7197135224651925465,"format":"int64"}},"example":{"account_id":"Nostrum atque illum nesciunt adipisci odit corrupti.","etag":"Voluptas omnis quidem dolor ipsum voluptas sed.","has_credentials":true,"id":"Fugiat aliquid aspernatur voluptatem in cupiditate.","label":"Iusto fugit non asperiores quidem natus.","login_customer_id":"Id ea.","project_id":"Et dolorem quod.","status":"deleted","version":8604742619872904748},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rem fugit accusantium est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto eius dolor magnam necessitatibus amet."},"label":{"type":"string","description":"Optional friendly name","example":"Rerum tempore tempora."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dolorem asperiores autem aut aut soluta."},"project_id":{"type":"string","description":"Owning project","example":"Earum aut qui."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6983147448769937945,"format":"int64"}},"example":{"account_id":"Officia dolores et reprehenderit.","has_credentials":false,"id":"Et est et corporis.","label":"Aut explicabo.","login_customer_id":"Rerum rem.","project_id":"Voluptate est reprehenderit consectetur accusamus eaque inventore.","status":"deleted","version":8504196254053832609},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et vel dolorum aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vitae qui explicabo tempora accusantium aut."},"label":{"type":"string","description":"Optional friendly name","example":"Nobis qui sunt laboriosam ipsa."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Dicta ut."},"project_id":{"type":"string","description":"Owning project","example":"In vel."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5579476471615779331,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","has_credentials":true,"id":"Beatae error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","login_customer_id":"Iure dolores dolores dolorem sit nihil.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsam eligendi est dolore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sit est atque qui quaerat qui vitae."},"label":{"type":"string","description":"Optional friendly name","example":"Optio in ratione accusamus quasi."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quos excepturi natus est est."},"project_id":{"type":"string","description":"Owning project","example":"Optio non."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6617602369183761406,"format":"int64"}},"example":{"account_id":"Quibusdam ea nam aut.","has_credentials":false,"id":"Doloribus unde id aut perspiciatis.","label":"Sit totam ut et.","login_customer_id":"Est consequatur rerum neque velit nulla modi.","project_id":"Adipisci ut.","status":"active","version":926393304108038988},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"In consectetur et culpa quaerat vel sed."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Et impedit quod."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Magni omnis."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Ipsa nihil esse."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Sit id incidunt.","client_secret":"Non sed hic minima est distinctio.","developer_token":"A perferendis.","refresh_token":"Facere eum aliquid est repellat assumenda."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Error eligendi incidunt accusamus excepturi inventore."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut architecto aliquam mollitia labore sapiente."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Quod minima dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nihil facilis sunt."},"label":{"type":"string","description":"Optional friendly name","example":"Ut beatae eaque quo atque."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Molestiae id aut debitis iure."},"project_id":{"type":"string","description":"Owning project","example":"Vero ad ex consequatur dolore."},"sender_email":{"type":"string","description":"Default sender address","example":"Dolore est dolorem quod enim pariatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Occaecati veritatis."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7262698057225531796,"format":"int64"}},"example":{"account_id":"Ad quae nisi.","brand_kit":"Incidunt voluptas non necessitatibus.","etag":"Cum et ab ipsum.","has_credentials":true,"id":"Tenetur non accusamus qui ex.","label":"Ex et amet sunt.","portal_id":"Qui nemo nihil dolorum consequatur.","project_id":"Quia mollitia.","sender_email":"Tempora qui eum hic vel aspernatur at.","sender_name":"Est ea sed sit.","status":"deleted","version":7589133128297342291},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non in iure dolores et quis id."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Accusamus corrupti sint molestiae occaecati est quos."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Sint consequuntur omnis distinctio possimus non aliquid."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi est et est totam."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quia sed nesciunt minus."},"project_id":{"type":"string","description":"Owning project","example":"Facilis neque sed alias dolore id."},"sender_email":{"type":"string","description":"Default sender address","example":"Non doloribus nam."},"sender_name":{"type":"string","description":"Default sender name","example":"Nulla suscipit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1661229305097180791,"format":"int64"}},"example":{"account_id":"Totam non qui.","brand_kit":"Sunt labore voluptate.","has_credentials":true,"id":"Est ut ratione nobis.","label":"Qui ut ut qui sed explicabo.","portal_id":"Vero nulla laboriosam vel et et iure.","project_id":"Occaecati tenetur minima veritatis sed impedit laborum.","sender_email":"Exercitationem voluptatum perspiciatis autem.","sender_name":"Eum ut.","status":"active","version":5481070480011205228},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur laborum."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Aut tempora dolorem neque assumenda sed."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Cum ipsum quo possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Excepturi sit minus."},"project_id":{"type":"string","description":"Owning project","example":"Quam culpa."},"sender_email":{"type":"string","description":"Default sender address","example":"Et quisquam dicta."},"sender_name":{"type":"string","description":"Default sender name","example":"Eaque enim est libero enim quo."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2473646846997850541,"format":"int64"}},"example":{"account_id":"Similique eaque autem impedit tenetur voluptatibus.","brand_kit":"Et fuga veniam.","has_credentials":true,"id":"Aspernatur ipsam consequatur qui illo totam fuga.","label":"Qui non illum expedita commodi in dolores.","portal_id":"Harum molestiae cupiditate ab et eum ex.","project_id":"In tempore quo consequatur.","sender_email":"Quia velit adipisci.","sender_name":"Aliquid eum itaque qui recusandae recusandae.","status":"deleted","version":5418486313404831501},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Praesentium eos aspernatur voluptatum facilis laboriosam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ab earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ea et iusto doloremque odio pariatur."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aliquid ratione est omnis."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Alias et error nobis minima fuga reprehenderit."},"project_id":{"type":"string","description":"Owning project","example":"Expedita animi ut velit at."},"sender_email":{"type":"string","description":"Default sender address","example":"Impedit qui suscipit ipsa."},"sender_name":{"type":"string","description":"Default sender name","example":"Animi fuga maxime tempora."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2736756583759126082,"format":"int64"}},"example":{"account_id":"Ab itaque tempore vel quia cum quas.","brand_kit":"Sed commodi voluptatibus.","has_credentials":true,"id":"Rerum perspiciatis dolor pariatur.","label":"Quo soluta maxime temporibus earum et aperiam.","portal_id":"Ipsa aut est et est debitis ea.","project_id":"Amet officia occaecati quam nostrum quis voluptas.","sender_email":"Eum voluptatum accusamus illo eveniet eum.","sender_name":"Nemo molestiae modi ut non atque.","status":"deleted","version":5960975059584485019},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Minus voluptatem ab delectus porro."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Modi esse voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Mollitia nulla."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Veniam molestias."},"sender_email":{"type":"string","description":"Default sender address","example":"Accusamus quia velit commodi."},"sender_name":{"type":"string","description":"Default sender name","example":"Tenetur cumque rerum."}},"example":{"account_id":"Hic magni.","brand_kit":"Nihil atque.","label":"Fugit dolorum nulla quo veritatis id.","portal_id":"Et optio sed omnis aut voluptatem voluptas.","sender_email":"Eum omnis est blanditiis maxime et.","sender_name":"Et eum inventore quisquam."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Quia omnis in qui."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Nihil ut."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Ut beatae quia."},"platforms":{"type":"array","items":{"type":"string","example":"Minima illo dolores natus a sint."},"description":"Platforms this job will create on","example":["Quae et nesciunt iure quis in.","Mollitia nihil ducimus."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Non quo necessitatibus.","platforms":["Accusantium laudantium nostrum earum dolores.","Eos exercitationem."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Hic vel ut."},"job_id":{"type":"string","description":"Job UUID","example":"Illo accusamus."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Dolores quidem necessitatibus voluptatem consequatur sit.","job_id":"Earum minus autem omnis qui debitis eum.","result":[{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."},{"campaign_id":"Autem ratione sit nam aliquam.","error":"Repellendus in corporis doloribus labore.","ok":false,"platform":"Modi rem voluptatem."}],"status":"running"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quidem omnis totam eos non molestias."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Recusandae illum accusamus debitis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Doloribus voluptas mollitia doloremque totam."},"label":{"type":"string","description":"Optional friendly name","example":"Quia doloremque commodi rerum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Praesentium sint laudantium error."},"project_id":{"type":"string","description":"Owning project","example":"Veniam et ducimus quos amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6150421422111226538,"format":"int64"}},"example":{"account_id":"Quas quis corporis.","etag":"Ea ducimus ipsum dolorem dignissimos.","has_credentials":true,"id":"Nihil iure officiis nemo quia.","label":"Et quia ex et alias ea.","org_id":"Quo ullam ad iusto quos.","project_id":"Ducimus id sint eius aut.","status":"inactive","version":2540282771582052941},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit soluta quia qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio quia similique vero est impedit quo."},"label":{"type":"string","description":"Optional friendly name","example":"Libero officia et quia."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil at."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1438953144952054594,"format":"int64"}},"example":{"account_id":"Optio rerum vel molestiae id.","has_credentials":false,"id":"Necessitatibus eos rerum.","label":"Qui quas aut provident suscipit.","org_id":"Reiciendis excepturi.","project_id":"Veniam amet et quisquam voluptatem fuga.","status":"active","version":8349066598252210000},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut temporibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut tenetur."},"label":{"type":"string","description":"Optional friendly name","example":"Iure aut tenetur ipsum ea ad ducimus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Voluptatem libero."},"project_id":{"type":"string","description":"Owning project","example":"Et et."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8572511867951081487,"format":"int64"}},"example":{"account_id":"Accusamus eos neque velit.","has_credentials":true,"id":"Eligendi non.","label":"Aut amet aut voluptatum magnam.","org_id":"Quisquam perspiciatis ipsam aperiam et totam in.","project_id":"Necessitatibus non eum ipsum eveniet quam.","status":"error","version":786757177338717877},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Debitis atque laboriosam unde facilis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Numquam voluptatem maiores ipsam dicta cum odit."},"label":{"type":"string","description":"Optional friendly name","example":"Nam modi nostrum assumenda alias sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Mollitia ducimus sunt."},"project_id":{"type":"string","description":"Owning project","example":"Odit illo ut ut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4721820161303114412,"format":"int64"}},"example":{"account_id":"Est deserunt maiores consequatur.","has_credentials":true,"id":"Aliquam voluptatem.","label":"Eos minima sunt.","org_id":"Non ratione quo ullam dolores occaecati.","project_id":"Dolore aliquam est autem.","status":"deleted","version":2899021755311679849},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Sit voluptatem ad ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Tempora dolor quis totam hic quibusdam eveniet.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Dolorem necessitatibus neque consectetur occaecati earum."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Ut sint non eum expedita non."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Occaecati quaerat eum quia a excepturi."},"app_id":{"type":"string","description":"Meta app ID","example":"Id vel iusto optio repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Eos culpa quaerat culpa inventore aut molestiae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem incidunt cum."},"page_id":{"type":"string","description":"Facebook page ID","example":"Hic quos inventore."},"project_id":{"type":"string","description":"Owning project","example":"Dolorem delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4898302691270586418,"format":"int64"}},"example":{"account_id":"Nisi est magni odio aut.","app_id":"Et ipsa magnam cum.","etag":"Ducimus voluptatem doloremque ullam consequatur.","has_credentials":false,"id":"Ad dolorem et.","label":"Inventore impedit unde voluptatem quia ab recusandae.","page_id":"Eveniet tempore est omnis iusto fugiat.","project_id":"Rerum eveniet nam sunt.","status":"inactive","version":8514774147978099222},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos qui quo et."},"app_id":{"type":"string","description":"Meta app ID","example":"Sed voluptas fuga officia nulla."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut magnam facilis non facilis dolor consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"A debitis ut ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Beatae facilis dolor quod nihil quia."},"project_id":{"type":"string","description":"Owning project","example":"Error quisquam recusandae nesciunt et itaque."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2532070289670969642,"format":"int64"}},"example":{"account_id":"Et nemo dicta illum omnis.","app_id":"Minus est dolor.","has_credentials":false,"id":"Recusandae consequatur nulla.","label":"Consequuntur provident nostrum vel ut.","page_id":"Deleniti magnam nemo cum delectus.","project_id":"Non consequuntur qui qui impedit assumenda voluptas.","status":"error","version":1382848930967937507},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsa ut saepe beatae quasi."},"app_id":{"type":"string","description":"Meta app ID","example":"Neque voluptas doloremque nobis consectetur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et voluptatem mollitia placeat aut laudantium."},"label":{"type":"string","description":"Optional friendly name","example":"Nam sequi iste iusto."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corrupti ut."},"project_id":{"type":"string","description":"Owning project","example":"Ut et laborum."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2992056059874429339,"format":"int64"}},"example":{"account_id":"Quis impedit.","app_id":"Tempore qui repellendus.","has_credentials":false,"id":"Voluptas voluptatem.","label":"Corrupti dicta pariatur totam quas deserunt.","page_id":"Earum voluptates repellat ipsam aut et ut.","project_id":"Quia facere vitae aperiam.","status":"active","version":5857417550509828993},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Accusantium est."},"app_id":{"type":"string","description":"Meta app ID","example":"Dolorem similique sapiente."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Expedita commodi sit."},"label":{"type":"string","description":"Optional friendly name","example":"Quo porro."},"page_id":{"type":"string","description":"Facebook page ID","example":"Pariatur esse."},"project_id":{"type":"string","description":"Owning project","example":"Et porro saepe eius."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8954046891574288398,"format":"int64"}},"example":{"account_id":"Sed qui dolor illo facere ut voluptatem.","app_id":"Perferendis placeat earum occaecati et.","has_credentials":false,"id":"Ea pariatur.","label":"Nam repellat.","page_id":"Rerum maiores in alias est laboriosam saepe.","project_id":"Aut rem molestiae assumenda ea.","status":"deleted","version":8862716294143227386},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Et minima."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas quis nihil tempora rem asperiores."},"page_id":{"type":"string","description":"Facebook page ID","example":"Vero natus voluptatem."}},"example":{"account_id":"act_193556282970417","app_id":"Voluptas aliquid libero sapiente aspernatur fugit eum.","label":"Quas qui aut rerum illum vero.","page_id":"Et neque soluta."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Est placeat explicabo aliquid."},"app_secret":{"type":"string","description":"Meta app secret","example":"Tenetur ut."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Quo vel iste aut cum voluptatem.","app_secret":"Et et aperiam."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor ea iusto eveniet velit sint odit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quam enim odio quia."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Cupiditate et esse voluptate optio quis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et atque."},"label":{"type":"string","description":"Optional friendly name","example":"Aliquid explicabo eaque ab aut voluptas."},"project_id":{"type":"string","description":"Owning project","example":"Impedit velit omnis incidunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8220727981299951228,"format":"int64"}},"example":{"account_id":"Unde fuga voluptas ut vero.","customer_id":"Velit dolorem.","etag":"A pariatur omnis.","has_credentials":true,"id":"Commodi aspernatur.","label":"Velit perferendis est ipsum aut voluptas.","project_id":"Nostrum numquam illo.","status":"active","version":5290138330966618163},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Soluta et quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Voluptate est enim aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque ut."},"label":{"type":"string","description":"Optional friendly name","example":"Iste et alias quis magni ad."},"project_id":{"type":"string","description":"Owning project","example":"Et aspernatur delectus rem sit."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2822393091615672408,"format":"int64"}},"example":{"account_id":"Velit atque nam voluptatem in eveniet.","customer_id":"Totam ea ut voluptatem velit eos aut.","has_credentials":true,"id":"Sequi non consequatur est.","label":"Occaecati repellendus autem ullam odio quis sed.","project_id":"Beatae magni est officiis enim.","status":"active","version":7510768710450776293},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Itaque iure soluta autem."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Odit numquam quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est eum ut ut amet et molestiae."},"label":{"type":"string","description":"Optional friendly name","example":"Qui quae qui optio."},"project_id":{"type":"string","description":"Owning project","example":"Nihil dolor exercitationem eum placeat dolores culpa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3577746410602694753,"format":"int64"}},"example":{"account_id":"Ut unde dolore id.","customer_id":"Dolorem ut aspernatur et ad.","has_credentials":false,"id":"Aut dolores.","label":"Atque qui dignissimos aut eaque eveniet.","project_id":"Voluptatem beatae quis dignissimos voluptatem et labore.","status":"active","version":412346224570068154},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut dolorem ea veniam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Ullam dolor."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Magnam sequi esse at."},"label":{"type":"string","description":"Optional friendly name","example":"Assumenda cum nemo esse nobis."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut rerum voluptatem ad minus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6107904235260429813,"format":"int64"}},"example":{"account_id":"Nihil deleniti dolores dignissimos perferendis tempore eum.","customer_id":"Magnam saepe incidunt nisi.","has_credentials":true,"id":"Eum et consequatur quis.","label":"Consequatur dolor quia amet vero dolorum incidunt.","project_id":"Enim nisi doloremque rerum.","status":"deleted","version":9143198940358453773},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Repudiandae facilis blanditiis libero nam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Qui sed voluptatibus quam quia."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus blanditiis magnam sed iure amet."}},"example":{"account_id":"Molestiae omnis doloremque.","customer_id":"Perspiciatis modi dicta quae sed ut.","label":"Deserunt et quidem sapiente."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Aut est voluptatibus placeat."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Pariatur perferendis explicabo expedita et velit accusamus."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Nulla eos."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Deleniti placeat rerum."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","developer_token":"Quisquam animi.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Magni atque amet omnis doloremque at."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Dolor et natus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Nihil neque quod alias ipsum."}},"example":{"campaign_id":"Consequatur non eveniet esse officia explicabo dolor.","error":"Aspernatur voluptatibus.","ok":true,"platform":"Cupiditate non exercitationem."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minima vitae illo cumque optio impedit."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Odit autem repellendus dicta qui vel."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Enim id."},"label":{"type":"string","description":"Optional friendly name","example":"Vel necessitatibus vel voluptates tenetur veniam repellat."},"project_id":{"type":"string","description":"Owning project","example":"Eveniet quia voluptatem impedit cumque doloribus."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":234140326367801793,"format":"int64"}},"example":{"account_id":"Rerum non assumenda molestiae modi impedit.","etag":"Aliquam voluptatibus assumenda mollitia molestias eos nobis.","has_credentials":false,"id":"Earum id consequatur.","label":"Adipisci ipsa.","project_id":"Dolorum id ut molestias.","status":"deleted","version":948876280422508983},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et natus possimus cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque magni omnis dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Quae et perspiciatis numquam."},"project_id":{"type":"string","description":"Owning project","example":"Assumenda quam possimus aut ipsa."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6695567399746083998,"format":"int64"}},"example":{"account_id":"Amet itaque aut.","has_credentials":true,"id":"Atque delectus ut.","label":"Unde adipisci aut quisquam.","project_id":"Eum non ut itaque.","status":"inactive","version":8672712817511304757},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quas quia quam voluptate nam iste."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et doloremque porro non."},"label":{"type":"string","description":"Optional friendly name","example":"Dolores quo est ratione beatae totam."},"project_id":{"type":"string","description":"Owning project","example":"Quis ab non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1807846651493588341,"format":"int64"}},"example":{"account_id":"Molestiae veniam exercitationem blanditiis ratione non.","has_credentials":true,"id":"Temporibus aut numquam.","label":"Enim velit voluptates officiis tempora possimus rerum.","project_id":"Accusantium ut vitae dolor soluta beatae.","status":"active","version":8042484860326151968},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quos provident."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia qui dicta."},"label":{"type":"string","description":"Optional friendly name","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"project_id":{"type":"string","description":"Owning project","example":"Commodi facere vel."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":413153877019026133,"format":"int64"}},"example":{"account_id":"Incidunt deleniti.","has_credentials":false,"id":"Officiis modi quae consequatur voluptatem et.","label":"Vero eum ea perspiciatis rerum.","project_id":"Culpa veritatis ut adipisci minus.","status":"active","version":6279401977493721745},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Numquam optio possimus velit quod."}},"example":{"account_id":"t2_gv9wtbfa","label":"Perspiciatis quam iste possimus ipsam."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Mollitia vel."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ea eum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Qui qui."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Repudiandae quae aut.","client_secret":"Tempore rem quo fuga accusantium voluptas ratione.","refresh_token":"Esse et labore earum."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Nihil quia omnis eaque aperiam eum.","client_secret":"Quam et voluptatibus illum dolorem.","developer_token":"Eum dolorum.","refresh_token":"Et illo beatae soluta."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Aut natus."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Qui esse."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Sed qui.","app_secret":"Reiciendis qui id tenetur exercitationem aperiam incidunt."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Ea ipsam temporibus.","client_secret":"Et necessitatibus dolorem ut.","refresh_token":"Expedita accusantium dolorum qui sed fugiat."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Numquam quia.","access_token_secret":"Dolorem autem ipsa autem provident est.","consumer_key":"Pariatur voluptas odit fuga illo.","consumer_secret":"Sit ex commodi sapiente a illum."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo repudiandae."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel aut aliquam rerum et quidem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Enim voluptatem inventore quasi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptatem possimus veniam dignissimos consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est porro eos ipsa quia."},"project_id":{"type":"string","description":"Owning project","example":"Delectus enim quas id porro."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1500674714869504232,"format":"int64"}},"example":{"account_id":"Sequi non et.","etag":"Quibusdam repellendus qui numquam.","funding_instrument_id":"Necessitatibus quaerat minima a voluptatem ipsa et.","has_credentials":true,"id":"Aut omnis itaque ut vero voluptatibus.","label":"Vero dolorem qui.","project_id":"Eum provident velit voluptatibus.","status":"active","version":3990374454753155356},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius omnis id itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Perferendis placeat dolores."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quidem quibusdam officiis dolor."},"label":{"type":"string","description":"Optional friendly name","example":"Sint dolor eaque culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nisi sunt."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1134950045517095139,"format":"int64"}},"example":{"account_id":"Sint suscipit.","funding_instrument_id":"Non neque optio.","has_credentials":false,"id":"Dolore voluptatem qui eveniet amet.","label":"Voluptate et.","project_id":"Qui pariatur odio reprehenderit nam.","status":"deleted","version":6078188127403523196},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo veritatis nisi velit distinctio animi."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Voluptas tenetur esse."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Architecto molestiae cum."},"label":{"type":"string","description":"Optional friendly name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"project_id":{"type":"string","description":"Owning project","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8298836967576578537,"format":"int64"}},"example":{"account_id":"Eveniet aliquid quia aut impedit a veritatis.","funding_instrument_id":"Sunt debitis enim voluptas qui voluptas veniam.","has_credentials":false,"id":"Assumenda sed minima nihil.","label":"Dolor molestiae quia voluptatem deserunt libero.","project_id":"Quaerat ipsa voluptatem.","status":"error","version":5039507493953656552},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Dolor cumque dolores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Neque aspernatur culpa sed non."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas maxime non illo ab in voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Ad et in voluptatem et perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Est magnam molestiae soluta."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":889781010736384145,"format":"int64"}},"example":{"account_id":"Deleniti reprehenderit saepe quas commodi qui qui.","funding_instrument_id":"Excepturi reiciendis numquam consequatur amet dolorem.","has_credentials":false,"id":"Ad cumque voluptas.","label":"Non minima possimus totam occaecati enim eaque.","project_id":"Facere rerum voluptatem saepe eligendi.","status":"deleted","version":2150669320812381725},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est perferendis eos et cumque nulla."},"label":{"type":"string","description":"Optional friendly name","example":"Iste exercitationem voluptate quia esse nihil sed."}},"example":{"account_id":"8r7gb","funding_instrument_id":"In autem neque nihil laborum omnis.","label":"Neque maiores quo aliquam in rem."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Hic voluptatem ad similique sunt ratione."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Dicta et ratione impedit recusandae dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Nemo sint et consequatur vel quisquam libero."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Eum et sint possimus omnis dolorem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Facere sed ea qui pariatur adipisci.","access_token_secret":"Enim esse dolores.","consumer_key":"Mollitia vel temporibus sunt nulla esse.","consumer_secret":"Sunt voluptatem beatae repellat veritatis perferendis veritatis."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Alias ullam fugiat deserunt sint nihil iusto.","config":"Necessitatibus expedita.","status":"Voluptas inventore sit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Velit labore non.","brand_kit":"Dolorem sapiente.","label":"Sit quibusdam nulla adipisci aperiam dolorem molestias.","portal_id":"Odit est esse.","sender_email":"Ea cum et magni adipisci magnam.","sender_name":"Atque labore qui odio et corporis."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Et placeat.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Non praesentium voluptas saepe sit.","label":"Aut assumenda unde occaecati eum tenetur nam.","page_id":"Aliquid voluptatibus iste mollitia commodi libero atque."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Perferendis quia possimus dolore vel qui et.","customer_id":"Vero quis consequuntur.","label":"Accusantium aspernatur facere tempora voluptatem dicta rerum."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Aut sed fugiat adipisci eos."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Non possimus quos voluptatem doloremque consequatur deleniti.","label":"Quaerat ut neque expedita nostrum."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 0ae17c6a..8eb9fff0 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -32,17 +32,18 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. responses: "201": description: Created response. @@ -52,28 +53,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Nobis est fugit ratione consectetur exercitationem. - example: Aperiam quia doloribus omnis. + example: Aliquid qui omnis et. + example: Asperiores recusandae deserunt ratione eius culpa sit. content: application/json: schema: $ref: '#/components/schemas/Brief2' example: - copy: Ut temporibus aliquam animi unde. - event_details: Et architecto voluptas ratione delectus ut. - event_slug: Magni autem. - id: Laboriosam tempore vero voluptatum a quos. - keywords: Ut est nobis aspernatur. + copy: Magni et rerum sed voluptatum. + event_details: Enim est occaecati sed non dolorem distinctio. + event_slug: Aperiam eum. + id: Omnis suscipit corrupti reiciendis. + keywords: Aut ratione sunt nostrum tenetur. platforms: - - Tempore nihil quos. - - Eum dignissimos iure praesentium ea. - - Quis quas qui mollitia perferendis eveniet voluptas. - program_type: Nemo perspiciatis et qui aliquam doloremque itaque. - project_id: Sed exercitationem ut totam ut minus. + - Dolorum aut distinctio vel. + - Veniam velit sequi sit impedit dolorum voluptas. + - Ipsum quaerat delectus cupiditate sit et. + program_type: Beatae soluta molestiae nihil quia omnis. + project_id: Perspiciatis saepe consequatur doloribus sequi et. status: draft - targeting: Fugit qui tempora commodi reiciendis sit alias. - url: Ullam tenetur quia totam magni sunt repellat. - version: 958049424855577225 + targeting: Dolorem cum. + url: Quam et voluptatibus illum dolorem. + version: 1135469282733514180 "400": description: 'BadRequest: Bad request' content: @@ -145,8 +146,9 @@ paths: schema: type: string description: Brief UUID - example: Sit ut repellat voluptas. - example: Eligendi consequatur officia labore eos. + example: b6261fa8-da11-47f0-b13d-8ff0dc6aaffd + format: uuid + example: 52ae4742-df9c-4ce6-ab10-c9bd7ccebd74 responses: "204": description: No Content response. @@ -220,8 +222,9 @@ paths: schema: type: string description: Brief UUID - example: Excepturi fugit. - example: Aut quia voluptates voluptates nisi. + example: 2df7b380-3594-4323-92b0-9a8e5a8fedcc + format: uuid + example: 6d67841a-f263-4343-acd9-5ea22a27e47d responses: "200": description: OK response. @@ -231,28 +234,27 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut molestias aut excepturi cumque. - example: Ut hic distinctio non recusandae et qui. + example: Libero repudiandae aliquid ex. + example: Eveniet suscipit odio ratione. content: application/json: schema: $ref: '#/components/schemas/Brief3' example: - copy: Quaerat ea accusantium. - event_details: Amet iusto provident sequi est. - event_slug: Ut ea alias. - id: Explicabo cupiditate rerum. - keywords: Voluptatem iure vero. + copy: Dolores commodi aperiam voluptatibus. + event_details: Omnis quidem est non tenetur dolore. + event_slug: Distinctio ipsa nihil ad hic repellendus nobis. + id: Harum et minus voluptas. + keywords: Cupiditate voluptatem. platforms: - - Accusantium quis architecto. - - Enim magnam eius voluptas voluptatibus deleniti. - - Dolorum excepturi quibusdam. - program_type: Hic vero et. - project_id: Incidunt ipsum est perspiciatis soluta voluptas est. - status: draft - targeting: Consequatur neque tempore voluptatibus quo quod nesciunt. - url: Nam aspernatur qui quidem est eligendi. - version: 7881322722259816896 + - Cupiditate aliquam vel blanditiis sunt ut. + - Aperiam quo sint dolorum vel molestiae. + program_type: Porro ab id necessitatibus consequatur natus tempora. + project_id: Debitis labore aut. + status: approved + targeting: Et corporis officia sint. + url: Accusamus vero et voluptas accusamus sunt. + version: 1623908575818221398 "400": description: 'BadRequest: Bad request' content: @@ -323,8 +325,9 @@ paths: schema: type: string description: Brief UUID - example: Exercitationem officia corrupti tempora ea. - example: Totam unde. + example: 7b75bd11-b6e0-441e-99e4-25f506ecfdd1 + format: uuid + example: 913052d6-1036-4a14-9f9a-107c3b258bb8 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -342,17 +345,18 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. responses: "200": description: OK response. @@ -362,28 +366,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ipsa sint optio nobis quae corporis. - example: Voluptas ut nostrum officiis et accusamus provident. + example: Ut aperiam eveniet nihil qui ea. + example: Id aut praesentium maiores unde quo culpa. content: application/json: schema: $ref: '#/components/schemas/Brief4' example: - copy: Rerum ut culpa totam sequi sit. - event_details: Sit et quod porro sed minus. - event_slug: Et ratione sit. - id: Et assumenda recusandae. - keywords: Excepturi dolor labore. + copy: Doloremque et qui perferendis. + event_details: Fugit voluptas molestias architecto dicta quidem illo. + event_slug: Sapiente et et itaque dolores in. + id: Provident quia laboriosam magnam unde. + keywords: Quia aut sed fugiat adipisci eos rerum. platforms: - - Omnis veritatis omnis. - - Officia et pariatur molestias autem ratione. - - Ut et veniam maiores. - program_type: Totam id incidunt. - project_id: Sint eveniet dicta numquam doloremque ab cumque. - status: draft - targeting: Iusto dolores. - url: Sed ipsum quia. - version: 7723389563281978281 + - Nihil explicabo vero. + - Est qui asperiores velit enim. + - Expedita ut minus ut est recusandae aspernatur. + program_type: Rerum et. + project_id: Et sed nobis blanditiis. + status: approved + targeting: Ipsam temporibus sint et necessitatibus dolorem ut. + url: Rem dolores eligendi ea. + version: 6226287149251328788 "400": description: 'BadRequest: Bad request' content: @@ -473,8 +477,18 @@ paths: schema: type: string description: Brief UUID - example: Odio eos earum fuga non est. - example: Rerum reiciendis similique. + example: 25175f34-92c0-434d-a72f-1a9c500ccdda + format: uuid + example: 78a49884-958d-4ef7-99b9-e60dab3c1338 + - name: If-Match + in: header + description: Version being approved (ETag); approval is rejected if the brief changed + allowEmptyValue: true + schema: + type: string + description: Version being approved (ETag); approval is rejected if the brief changed + example: Qui inventore. + example: Ducimus ut adipisci est laboriosam. responses: "200": description: OK response. @@ -484,29 +498,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempora qui incidunt tempora. - example: Vero voluptates soluta. + example: Sunt cum ut. + example: Omnis rerum. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Sint qui praesentium ea praesentium magni. - event_details: Consequuntur neque mollitia quia. - event_slug: Tempora veritatis harum ab nobis fuga atque. - id: Et tempore. - keywords: Iure dolore et et aut nam. + copy: Error necessitatibus et autem doloribus est. + event_details: Similique odio adipisci dolore iste. + event_slug: Quo culpa. + id: Sit ex commodi sapiente a illum. + keywords: Maxime labore illo maxime provident. platforms: - - Blanditiis et qui est dolorem eos. - - Dolorem sed atque. - - Provident id quia porro rerum. - - Quo aliquid nobis. - program_type: Ratione incidunt est saepe. - project_id: Eligendi earum qui est et id laudantium. - status: archived - targeting: Voluptates odit consequatur quis. - url: Fugiat aut laboriosam maxime facere culpa modi. - version: 317664992246136086 + - Sint suscipit iste eveniet laudantium rerum. + - Veritatis excepturi veniam maxime incidunt asperiores voluptatem. + - Nostrum dolorum iure eaque animi. + - Error laudantium. + program_type: Dolorem autem ipsa autem provident est. + project_id: Numquam quia. + status: draft + targeting: Repudiandae voluptatem vitae iste maxime modi laborum. + url: Quis et odio tenetur optio. + version: 8367189057804003789 "400": description: 'BadRequest: Bad request' content: @@ -534,6 +548,24 @@ paths: example: code: "409" message: A connection for this provider already exists on the project. + "412": + description: 'PreconditionFailed: ETag mismatch' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionFailedError' + example: + code: "412" + message: The supplied ETag does not match the current version. + "428": + description: 'PreconditionRequired: If-Match header required' + content: + application/json: + schema: + $ref: '#/components/schemas/PreconditionRequiredError' + example: + code: "428" + message: An If-Match header is required. "500": description: 'InternalServerError: Internal server error' content: @@ -578,8 +610,9 @@ paths: schema: type: string description: Brief UUID - example: Repudiandae odit. - example: Cupiditate est illo repellat et cum repellat. + example: 7509879d-b17a-46bc-8080-88e3691c2522 + format: uuid + example: 8a223dd4-35ee-4368-99ff-2fcd89c1cc01 requestBody: required: true content: @@ -588,10 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Vitae reiciendis voluptatem. + config: Adipisci consequuntur omnis a. platforms: - reddit-ads - - microsoft-ads + - meta-ads + - google-ads responses: "202": description: Accepted response. @@ -600,10 +634,12 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Rerum sint optio. + job_id: Corporis architecto. platforms: - - Quos tempora dolorem dolor fugiat quia. - - Exercitationem rerum iste ducimus. + - Aut natus. + - Sint autem. + - Deleniti itaque voluptas magnam. + - Voluptatem modi velit vitae optio ut. status: queued "400": description: 'BadRequest: Bad request' @@ -676,8 +712,9 @@ paths: schema: type: string description: Brief UUID - example: Temporibus ipsum necessitatibus ratione possimus. - example: Facilis repellat eveniet reiciendis. + example: 8195f930-c608-4657-a663-c7fb3bbbcc1f + format: uuid + example: 37f4e508-72cb-404c-b000-62333f1be4ef - name: campaign_id in: path description: Campaign UUID @@ -685,8 +722,9 @@ paths: schema: type: string description: Campaign UUID - example: Consequatur sint et vel molestiae. - example: Non placeat. + example: adfc99b5-eeb9-46c5-864a-a5348085e060 + format: uuid + example: e29e4478-4e55-4995-ba2d-1e20a74f91aa responses: "200": description: OK response. @@ -696,21 +734,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus pariatur et et sed debitis. - example: Necessitatibus reprehenderit illum. + example: Labore excepturi quibusdam. + example: Saepe optio quas qui consequatur cumque. content: application/json: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Est qui molestiae rerum adipisci minima quibusdam. - campaign_name: Harum distinctio reiciendis architecto atque maxime soluta. - id: Commodi quam voluptates. - platform: Accusantium sunt culpa libero quisquam. - platform_campaign_id: Rerum amet aut tempora recusandae aspernatur. - project_id: Optio dolorem omnis. - status: Ducimus porro maxime. - version: 5829797402937558935 + brief_id: Recusandae aut perferendis. + campaign_name: Corporis ut non. + id: Voluptas aspernatur aperiam. + platform: Est eaque ipsam harum nisi nobis. + platform_campaign_id: Et eveniet. + project_id: Aliquam vero ducimus. + status: Eius sed qui deserunt perspiciatis nihil. + version: 5441532063507194963 "400": description: 'BadRequest: Bad request' content: @@ -781,8 +819,9 @@ paths: schema: type: string description: Brief UUID - example: Minima adipisci aut quia quisquam. - example: Quia facilis sit. + example: 1d638e35-bc0b-4c2e-ab43-ab65a6a17f35 + format: uuid + example: e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a - name: campaign_id in: path description: Campaign UUID @@ -790,8 +829,9 @@ paths: schema: type: string description: Campaign UUID - example: Magnam nihil qui doloremque nam magnam aliquid. - example: Possimus accusantium expedita alias. + example: 879d577b-fd07-4d30-a031-6f7df870ad66 + format: uuid + example: 24ce19fe-6f4a-48ff-b8c2-d78990409795 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -809,9 +849,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Alias ullam fugiat deserunt sint nihil iusto. - config: Necessitatibus expedita. - status: Voluptas inventore sit. + campaign_name: Itaque quos voluptatibus quos accusantium fugit. + config: Qui molestias. + status: Excepturi saepe sit vel perspiciatis neque. responses: "200": description: OK response. @@ -821,21 +861,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Incidunt sit. - example: Totam tempora quod expedita. + example: Magni qui veniam architecto deleniti adipisci. + example: Ad dignissimos sit. content: application/json: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Exercitationem consectetur. - campaign_name: Modi asperiores ut libero vel. - id: Laboriosam quis facere. - platform: Nesciunt necessitatibus ex ea ullam corrupti sunt. - platform_campaign_id: Omnis accusantium ad. - project_id: Totam sapiente vitae numquam ut nesciunt voluptas. - status: Voluptates iste autem veniam et enim unde. - version: 1765361339666375563 + brief_id: Provident officia officiis. + campaign_name: Rerum ut necessitatibus illum ratione. + id: Enim reiciendis sint neque. + platform: Ut mollitia accusantium dignissimos. + platform_campaign_id: Consequatur qui molestiae velit ratione nesciunt et. + project_id: Rerum facilis quia molestiae ratione officia. + status: Mollitia atque atque dolores accusantium non dolor. + version: 9077221317587809922 "400": description: 'BadRequest: Bad request' content: @@ -975,21 +1015,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas ipsam iste. - example: Delectus libero necessitatibus quis. + example: Vel sint nisi laborum laboriosam assumenda sed. + example: Ipsam quia ut quibusdam et. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Quis sapiente ut sit quod. + account_id: Quis quis reprehenderit non quae omnis qui. has_credentials: true - id: Ea minus enim ut. - label: Magnam ut et ab. - login_customer_id: Quae nihil magni. - project_id: Nostrum veniam qui rerum ipsum eum fugit. + id: Dolor officia eligendi. + label: At odio incidunt distinctio sint qui. + login_customer_id: Quidem odio ab accusantium aut est deleniti. + project_id: Provident dicta temporibus debitis. status: error - version: 7243034772713915274 + version: 5571372049954177452 "404": description: 'NotFound: Resource not found' content: @@ -1047,10 +1087,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. responses: "201": description: Created response. @@ -1060,21 +1100,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Commodi et nihil et. - example: Repellendus adipisci sit et enim quasi ut. + example: Possimus eum aut delectus voluptatem rerum. + example: Commodi repudiandae sequi aperiam. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Magni et rerum sed voluptatum. + account_id: Id temporibus et provident maiores neque quis. has_credentials: false - id: Veniam velit sequi sit impedit dolorum voluptas. - label: Enim est occaecati sed non dolorem distinctio. - login_customer_id: Nostrum tenetur repellendus. - project_id: Ipsum quaerat delectus cupiditate sit et. - status: deleted - version: 5181448788196437025 + id: Provident nobis soluta culpa vitae. + label: Laudantium amet veritatis rerum itaque consequatur laboriosam. + login_customer_id: Eligendi ut. + project_id: Excepturi deleniti voluptas aperiam vel. + status: error + version: 4162198444433663334 "400": description: 'BadRequest: Bad request' content: @@ -1158,21 +1198,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut sunt ex et autem delectus. - example: Occaecati placeat et. + example: Vel delectus molestias qui magnam. + example: Ipsum ullam quis est incidunt debitis qui. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Deserunt magni voluptas odio assumenda totam. + account_id: Eum est molestiae necessitatibus magni. has_credentials: true - id: Laudantium expedita ut ipsum id commodi nobis. - label: Velit sapiente qui iusto quis magni et. - login_customer_id: Officiis deleniti ipsam nam. - project_id: Vitae aut voluptatem inventore ab. - status: deleted - version: 6633489521806040497 + id: Deserunt aliquam necessitatibus. + label: In est. + login_customer_id: Deserunt ipsum dolorum quas error. + project_id: Ut et eligendi et numquam dolorum. + status: error + version: 3367774197321419764 "400": description: 'BadRequest: Bad request' content: @@ -1254,10 +1294,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. responses: "204": description: No Content response. @@ -1324,8 +1364,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Aut id molestiae sit. - ok: false + message: Fugit repellendus et accusamus sed non sequi. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -1429,24 +1469,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dolorem quia. - example: Adipisci consectetur ut modi quo et. + example: Blanditiis inventore similique est. + example: Possimus qui. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Non ut voluptas et accusamus natus id. - brand_kit: Eos voluptatibus. - has_credentials: true - id: Sit similique ut minima ut. - label: Quia enim illo et eligendi. - portal_id: Et quam architecto vero. - project_id: Voluptatum officia quod error amet quia inventore. - sender_email: Vero labore laudantium maiores. - sender_name: Reiciendis dignissimos consequatur iste qui minima. - status: deleted - version: 4350724330275405551 + account_id: Dolorem fugiat et aspernatur voluptatem nobis. + brand_kit: Delectus ex aut quia. + has_credentials: false + id: Tempore sunt itaque omnis. + label: Modi voluptatum veniam molestiae quibusdam. + portal_id: Perferendis eveniet. + project_id: Ex sunt sit beatae. + sender_email: Voluptatibus quam dicta voluptate consequuntur voluptatem est. + sender_name: Temporibus quis iste eaque ratione debitis nam. + status: inactive + version: 3577051025426830879 "404": description: 'NotFound: Resource not found' content: @@ -1500,14 +1540,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. responses: "201": description: Created response. @@ -1517,24 +1557,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Iure ut. - example: Minus id deleniti. + example: Voluptatum explicabo vero repudiandae temporibus ut. + example: Est hic enim similique et eveniet vel. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Debitis soluta sed quod dicta aperiam eveniet. - brand_kit: Voluptas expedita omnis ex. + account_id: Molestiae aut fugit alias. + brand_kit: Architecto autem iste. has_credentials: true - id: Deleniti itaque voluptas magnam. - label: Consequuntur sit libero autem ut. - portal_id: Accusantium sequi modi corrupti esse mollitia. - project_id: Voluptatem modi velit vitae optio ut. - sender_email: Saepe rerum sunt eum et qui aut. - sender_name: Ut quia harum. - status: error - version: 6360555217771164808 + id: Ea ullam minima voluptatem vel deleniti. + label: Vero at ut quis. + portal_id: Non unde. + project_id: Repudiandae necessitatibus dolorem enim beatae quia. + sender_email: Dolorum nihil sunt doloremque explicabo. + sender_name: Ut odio odio sed minus quia quia. + status: active + version: 8635749132548484011 "400": description: 'BadRequest: Bad request' content: @@ -1606,12 +1646,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. responses: "200": description: OK response. @@ -1621,24 +1661,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Eum autem quia quis soluta nostrum cumque. - example: Quia velit. + example: Reprehenderit eius distinctio voluptatum. + example: Voluptatibus sunt. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Autem recusandae totam. - brand_kit: Similique deserunt iusto. + account_id: Velit fuga quos. + brand_kit: Culpa est possimus dolores dignissimos. has_credentials: true - id: Ex delectus. - label: Officia quidem non qui voluptates natus cum. - portal_id: Odit necessitatibus veritatis amet ut rerum quidem. - project_id: Voluptas ullam dolores rem. - sender_email: Iusto velit quo voluptatibus modi reiciendis aliquam. - sender_name: Quidem explicabo expedita sunt. + id: Reprehenderit provident repudiandae sit. + label: Ut sunt aliquam. + portal_id: Sed aut quia nihil est quia. + project_id: Aut aut eos magnam quisquam et. + sender_email: Fugiat est itaque. + sender_name: Fugiat aut dicta libero. status: active - version: 3951189417473657674 + version: 2879571083312014203 "400": description: 'BadRequest: Bad request' content: @@ -1720,7 +1760,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. responses: "204": description: No Content response. @@ -1787,7 +1827,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Aspernatur possimus. + message: Laudantium error eum et aut. ok: true "404": description: 'NotFound: Resource not found' @@ -1892,21 +1932,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Tempore qui est. - example: Provident saepe aliquam architecto non vero. + example: Quia sequi consequatur aut dolorem. + example: Necessitatibus quam. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Accusamus vero et voluptas accusamus sunt. - has_credentials: true - id: Minus voluptas asperiores debitis labore aut. - label: Distinctio ipsa nihil ad hic repellendus nobis. - org_id: Vel blanditiis sunt ut facere. - project_id: Porro ab id necessitatibus consequatur natus tempora. - status: error - version: 4876542408988375571 + account_id: Ipsa quo vel architecto quas eligendi impedit. + has_credentials: false + id: Expedita voluptatum commodi fuga ipsa. + label: Qui quidem exercitationem. + org_id: Laudantium est ut soluta neque facilis est. + project_id: Nostrum corporis quasi magnam. + status: inactive + version: 8731305521183611402 "404": description: 'NotFound: Resource not found' content: @@ -1961,10 +2001,10 @@ paths: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. responses: "201": description: Created response. @@ -1974,21 +2014,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus aliquam aut quas aliquid. - example: Praesentium beatae quis ut eius. + example: Aspernatur enim perferendis. + example: Soluta porro distinctio cupiditate. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Facere harum enim consequatur id voluptatem. + account_id: Quam quis quam dolor occaecati earum iusto. has_credentials: true - id: Ducimus sequi. - label: Quia tenetur ducimus. - org_id: Consequatur dolorum sint voluptatem voluptas omnis est. - project_id: Autem ab voluptas culpa. + id: Occaecati et. + label: Delectus voluptatem iste nisi in. + org_id: Iste qui rerum est sed sed similique. + project_id: Natus expedita aspernatur consequuntur quod ducimus molestias. status: active - version: 4064850428710517856 + version: 6933590282461306362 "400": description: 'BadRequest: Bad request' content: @@ -2061,7 +2101,7 @@ paths: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" responses: "200": @@ -2072,21 +2112,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas consequatur iusto nostrum pariatur. - example: Quidem minus pariatur praesentium. + example: Omnis ipsam ad sed laudantium ut ea. + example: Ad a et inventore tempora facilis dolores. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Et corporis officia sint. - has_credentials: false - id: Consequatur omnis quidem est non tenetur. - label: Voluptatibus qui cupiditate voluptatem. - org_id: Quia nulla autem ratione. - project_id: Deleniti dolores commodi. - status: error - version: 874315130556833044 + account_id: Quia quisquam corrupti distinctio voluptas eius. + has_credentials: true + id: Corrupti et nobis voluptas dignissimos. + label: Ducimus modi ut culpa excepturi blanditiis. + org_id: Distinctio sunt aliquid harum quis nam rerum. + project_id: Illum et quisquam ex est facilis. + status: inactive + version: 3234333099728911322 "400": description: 'BadRequest: Bad request' content: @@ -2168,7 +2208,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. responses: "204": description: No Content response. @@ -2235,8 +2275,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Mollitia a magni vel consequatur ea deserunt. - ok: false + message: Est rerum. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -2340,22 +2380,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Deserunt reiciendis dolorem totam voluptatem. - example: Repudiandae molestias est consectetur porro quo pariatur. + example: Natus ratione. + example: Amet quam consequuntur nulla quaerat. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Aut et. - app_id: Quia laboriosam magnam unde hic. - has_credentials: false - id: Facilis facilis aut suscipit aut odio iste. - label: Tenetur velit quaerat aut. - page_id: Distinctio ea totam rem harum provident. - project_id: Deleniti earum magni quibusdam. - status: deleted - version: 5896744453366252956 + account_id: Pariatur debitis. + app_id: Omnis neque autem ex eos. + has_credentials: true + id: Est dolor ut corporis. + label: Illo vitae occaecati omnis. + page_id: Cupiditate quos hic. + project_id: Cupiditate ut illo dolor quaerat totam. + status: active + version: 1381780689877724774 "404": description: 'NotFound: Resource not found' content: @@ -2410,12 +2450,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. responses: "201": description: Created response. @@ -2425,22 +2465,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas libero pariatur ut qui sint. - example: Quasi esse corporis molestiae excepturi suscipit. + example: Aut maiores ea omnis quia quas. + example: Sunt odit molestiae ab praesentium enim. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Quibusdam vel autem modi id facere. - app_id: Possimus expedita qui. + account_id: Laboriosam qui id enim. + app_id: Qui nobis et delectus quam. has_credentials: true - id: Eius voluptatem molestiae qui suscipit rerum. - label: Rem architecto. - page_id: Et maxime. - project_id: Eligendi tempora quos. - status: deleted - version: 8688592599556109682 + id: Ipsa et dolore. + label: Expedita dignissimos non sed omnis officiis et. + page_id: Nihil corrupti repellat eius. + project_id: Velit dolores omnis placeat unde distinctio ducimus. + status: error + version: 2384980829463304567 "400": description: 'BadRequest: Bad request' content: @@ -2513,9 +2553,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. responses: "200": description: OK response. @@ -2525,22 +2565,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ut ea. - example: Aliquam eum molestiae. + example: Iure tempora non ea facilis nihil eius. + example: Corporis nesciunt ipsam voluptates magnam atque. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Vero commodi est qui asperiores velit enim. - app_id: Architecto dicta. + account_id: Magnam ut similique ea minima magnam. + app_id: Dolores est et recusandae nihil. has_credentials: true - id: Atque rerum et officiis sapiente et et. - label: Eligendi ea vel consequatur nihil. - page_id: Ut est recusandae aspernatur eum fugit voluptas. - project_id: Dolores in hic rem. + id: A necessitatibus molestiae. + label: Repellat non suscipit veritatis sit tempore. + page_id: Nam sit. + project_id: Unde dicta autem dolorem qui explicabo. status: deleted - version: 2446786767075191046 + version: 2040878603756169140 "400": description: 'BadRequest: Bad request' content: @@ -2622,8 +2662,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. responses: "204": description: No Content response. @@ -2690,8 +2730,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Numquam doloremque et qui perferendis ut. - ok: true + message: Velit atque laudantium ullam rerum. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -2795,21 +2835,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Debitis iusto molestias itaque. - example: Fugit et soluta. + example: Aut mollitia. + example: Pariatur ratione blanditiis. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Doloremque architecto ea et. - customer_id: Exercitationem soluta possimus a. - has_credentials: false - id: Sed maiores qui sed exercitationem quam. - label: Et et veritatis voluptas nobis. - project_id: Non sint praesentium quia. - status: active - version: 2312965176389631300 + account_id: Vel ipsam dolores et. + customer_id: Numquam omnis ullam facilis ab sapiente. + has_credentials: true + id: Omnis autem accusamus. + label: Eligendi rerum numquam amet deserunt rem. + project_id: Est assumenda aut. + status: deleted + version: 6442954210695633704 "404": description: 'NotFound: Resource not found' content: @@ -2863,14 +2903,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. responses: "201": description: Created response. @@ -2880,21 +2920,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Dolorem labore laboriosam repellat harum. - example: Aut eos. + example: Quidem est. + example: Corporis deserunt quae. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Quia sed omnis quaerat aut. - customer_id: Magnam cumque quasi magni ducimus. + account_id: Ipsa rerum velit et impedit. + customer_id: Ut velit quam omnis. has_credentials: true - id: Ducimus debitis nesciunt quas quibusdam occaecati cum. - label: Nostrum laborum minima. - project_id: Iste voluptatem et voluptatem ut ut. - status: error - version: 3654633208585641813 + id: Aut assumenda fugiat quia eaque dolor porro. + label: Qui aut quas suscipit eos. + project_id: Alias error aut maxime. + status: inactive + version: 5504009031361040663 "400": description: 'BadRequest: Bad request' content: @@ -2966,9 +3006,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. responses: "200": description: OK response. @@ -2978,21 +3018,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et qui officiis repudiandae qui iste accusantium. - example: Consequatur provident ea sint. + example: Ex quis molestias nam quia facilis. + example: Deserunt earum saepe repellat. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Quis possimus placeat. - customer_id: Et qui et. - has_credentials: true - id: Dignissimos voluptate iste. - label: Ad esse neque earum modi. - project_id: Aut qui est iste. - status: active - version: 280885210133145304 + account_id: Enim id voluptas aperiam distinctio. + customer_id: Ut et laboriosam. + has_credentials: false + id: Deleniti deserunt labore. + label: Deserunt voluptates ut culpa saepe necessitatibus veritatis. + project_id: Id aut et adipisci quo ut. + status: inactive + version: 171807855442490922 "400": description: 'BadRequest: Bad request' content: @@ -3074,10 +3114,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. responses: "204": description: No Content response. @@ -3144,8 +3184,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Quo quae aut culpa. - ok: false + message: Expedita voluptas qui eaque. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -3249,20 +3289,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Corrupti aut earum rerum ducimus dicta. - example: Perspiciatis a aut quas delectus a. + example: Aut enim. + example: Voluptas a natus est dolor voluptatum. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Incidunt aut aperiam et ipsam. + account_id: Et rerum in expedita. has_credentials: true - id: Pariatur consequatur iste sed illo. - label: Consectetur porro quo. - project_id: Sunt ipsa. - status: error - version: 6549464945762782488 + id: Voluptatum ducimus tempore quae eum consequatur dolore. + label: Quo veritatis quis delectus est. + project_id: Illum illum dolores tenetur ut illum. + status: active + version: 4673192311933251173 "404": description: 'NotFound: Resource not found' content: @@ -3317,11 +3357,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. responses: "201": description: Created response. @@ -3331,20 +3371,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consectetur delectus libero id. - example: Aut sit iste. + example: Consequatur beatae. + example: Totam dolorem. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Neque ipsum nihil cumque repellendus. - has_credentials: true - id: Sit iusto. - label: Architecto unde rerum quisquam ut. - project_id: Voluptates neque expedita. - status: inactive - version: 3464454785938965677 + account_id: Iusto omnis. + has_credentials: false + id: Odio totam cum deleniti placeat fuga. + label: Et ut quis ut. + project_id: Saepe voluptatem reiciendis pariatur. + status: error + version: 757606501996618102 "400": description: 'BadRequest: Bad request' content: @@ -3417,7 +3457,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. responses: "200": description: OK response. @@ -3427,20 +3467,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur iste eum amet vel impedit et. - example: Adipisci et laboriosam veritatis saepe numquam rem. + example: Sit dignissimos est. + example: Harum esse. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Est consequatur eveniet in fuga ut. + account_id: Aperiam cum possimus. has_credentials: false - id: Recusandae beatae aliquam quia officiis hic ea. - label: Vitae quae debitis sunt aperiam ex voluptatibus. - project_id: Ut dolor velit. - status: active - version: 2352400902970282412 + id: Veniam consectetur deserunt in hic dolorum facere. + label: Magni consequatur dignissimos itaque quia. + project_id: Et reprehenderit dignissimos. + status: error + version: 3475949958922975875 "400": description: 'BadRequest: Bad request' content: @@ -3522,9 +3562,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. responses: "204": description: No Content response. @@ -3591,7 +3631,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ratione consequuntur aut et corrupti. + message: Sed dolore dolorem voluptatibus. ok: false "404": description: 'NotFound: Resource not found' @@ -3696,21 +3736,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ullam sunt rem non doloribus. - example: Corrupti ipsum. + example: Voluptatibus ut. + example: Fugit nostrum rerum. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Dignissimos necessitatibus consequuntur. - funding_instrument_id: Ipsum voluptatem et quam beatae laborum omnis. - has_credentials: true - id: Error necessitatibus et autem doloribus est. - label: Repudiandae voluptatem vitae iste maxime modi laborum. - project_id: Maxime labore illo maxime provident. - status: error - version: 1380295609570133746 + account_id: Deserunt repellendus corrupti itaque quo sit. + funding_instrument_id: Eum et ipsum expedita reprehenderit eos. + has_credentials: false + id: Blanditiis mollitia dolores illo nostrum magnam. + label: Omnis nobis. + project_id: Nostrum tempore. + status: inactive + version: 6605548766358472787 "404": description: 'NotFound: Resource not found' content: @@ -3765,13 +3805,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. responses: "201": description: Created response. @@ -3781,21 +3821,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptas esse qui quisquam quae est magni. - example: Quibusdam accusamus possimus. + example: Odio autem perferendis accusamus nulla placeat aut. + example: Aliquid quia natus. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - funding_instrument_id: Eaque animi molestias error laudantium. + account_id: Id unde veritatis officiis aut fugiat. + funding_instrument_id: Voluptas tenetur nobis facere. has_credentials: true - id: Quis et odio tenetur optio. - label: Iste eveniet laudantium rerum. - project_id: Ut sint. - status: error - version: 7980949958307848867 + id: Eaque voluptate reprehenderit sed voluptatem sed illo. + label: Cum nisi numquam. + project_id: Praesentium tenetur quas at ut necessitatibus dolor. + status: active + version: 4642810346647163563 "400": description: 'BadRequest: Bad request' content: @@ -3868,8 +3908,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. responses: "200": description: OK response. @@ -3879,21 +3919,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequuntur quia et saepe aperiam. - example: Accusamus ipsa qui. + example: Sint expedita fugit iste nemo voluptas. + example: Fugit unde ea quis. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Nobis nam. - funding_instrument_id: Reiciendis pariatur quisquam. - has_credentials: true - id: Aut quis qui laudantium dolore. - label: Non quidem doloribus debitis itaque itaque dolores. - project_id: Possimus nihil qui enim ratione voluptatem eos. - status: error - version: 7616558197057713508 + account_id: Rem error. + funding_instrument_id: Aperiam quos perferendis nisi blanditiis eveniet. + has_credentials: false + id: Aperiam et nihil. + label: Distinctio amet enim. + project_id: Perspiciatis porro. + status: inactive + version: 3440110816039158635 "400": description: 'BadRequest: Bad request' content: @@ -3975,10 +4015,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. responses: "204": description: No Content response. @@ -4045,8 +4085,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ea voluptatem eum voluptas eveniet. - ok: false + message: Enim ut corporis dolorum consequatur eius. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -4100,8 +4140,9 @@ paths: schema: type: string description: Job UUID - example: Sit harum ipsa et. - example: Dignissimos fugiat voluptatibus natus. + example: 126427cd-77bf-4d47-8ce7-9c23b3694a22 + format: uuid + example: f1fa4e30-2659-4090-9083-cfac42b3b0b1 responses: "200": description: OK response. @@ -4110,22 +4151,18 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Reiciendis et perspiciatis saepe consequatur doloribus. - job_id: Velit minus. + error: Dolore ut non error aut. + job_id: Vel natus provident. result: - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. + platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Officia et sint numquam accusamus. + error: Eos et architecto voluptas. ok: false - platform: Dolor molestias ipsa dolorum est. - - campaign_id: Quidem qui iusto sed quaerat vel fuga. - error: Odio nulla ut laboriosam vel rerum. - ok: false - platform: Dolor molestias ipsa dolorum est. - status: running + platform: Consequatur et dignissimos ex quo praesentium voluptas. + status: queued "400": description: 'BadRequest: Bad request' content: @@ -4197,44 +4234,42 @@ components: properties: copy: description: Ad copy - example: Odit odio praesentium. + example: Vitae illo consequuntur esse. etag: type: string description: ETag header value (mirrors version) - example: Eaque ratione debitis nam blanditiis. + example: Officia natus quia labore. event_details: description: Extracted event/course details - example: Dolorem fugiat et aspernatur voluptatem nobis. + example: Quia recusandae dignissimos dolore harum totam. event_slug: type: string description: Event/course slug - example: Nihil sunt doloremque. + example: Molestiae eius in reprehenderit nobis hic. id: type: string description: Brief UUID - example: Vero at ut quis. + example: Aliquid dignissimos minima aut fugit. keywords: description: Keyword list - example: Eveniet sint voluptatibus quam dicta. + example: Libero recusandae ut ullam aliquam. platforms: type: array items: type: string - example: Ea architecto autem iste. + example: Harum aliquam sunt eum. description: Suggested default platforms example: - - Ipsa tempore incidunt velit provident. - - Magni tempore sunt itaque omnis. - - Ex sunt sit beatae. - - Modi voluptatum veniam molestiae quibusdam. + - Occaecati facere voluptatibus nihil nisi. + - Distinctio tempore qui velit omnis dolorem est. program_type: type: string description: Funnel context - example: Qui maiores quia non unde deserunt. + example: Ipsum neque sapiente aliquid quidem velit. project_id: type: string description: Owning project - example: Molestiae aut fugit alias. + example: Et iure laudantium quia est molestiae. status: type: string description: Lifecycle status @@ -4245,32 +4280,33 @@ components: - archived targeting: description: Targeting recommendation - example: Consequuntur voluptatem est qui. + example: Iure consequatur minus nostrum iste nemo. url: type: string description: Event/course page URL - example: Ut ut odio odio sed minus quia. + example: Magni eos voluptatem sint hic ut. version: type: integer description: Optimistic-concurrency version - example: 6644792324746576285 + example: 3221003988771868872 format: int64 example: - copy: Iure culpa est possimus dolores dignissimos. - etag: Id eum aut et itaque. - event_details: Itaque est fugiat aut dicta. - event_slug: Magnam quisquam et consequuntur ut sunt. - id: Ex aut quia distinctio consequatur. - keywords: Velit laudantium error. + copy: Quod exercitationem. + etag: Enim nam id. + event_details: Repellendus eveniet veritatis impedit aut iste earum. + event_slug: Sequi ea ut vero consequatur possimus. + id: Ut dolores et incidunt. + keywords: Pariatur saepe ab qui et. platforms: - - Beatae sed aut quia nihil est. - - Qui fugiat. - program_type: Provident repudiandae sit qui aut aut. - project_id: Dolor corporis consequatur voluptatem voluptates sed. - status: draft - targeting: Et aut quia beatae. - url: Et velit fuga quos est. - version: 9139670973455309725 + - Et magni ad et provident. + - Non quisquam iure. + - Est ut aliquid. + program_type: Ipsam tempora est. + project_id: Ipsa fugiat assumenda. + status: archived + targeting: Laboriosam sunt quis omnis animi. + url: Assumenda sit delectus veniam. + version: 3928799509074172783 required: - id - project_id @@ -4283,39 +4319,40 @@ components: properties: copy: description: Ad copy - example: Ut aperiam voluptate voluptates. + example: Sit facere iste et alias. event_details: description: Extracted event/course details - example: Eum necessitatibus alias. + example: Ut iste et aspernatur delectus. event_slug: type: string description: Event/course slug - example: Provident dicta tenetur voluptatem voluptate dolor. + example: Aspernatur culpa sed non qui ad. id: type: string description: Brief UUID - example: Ad quis aperiam deserunt nostrum. + example: Perspiciatis ea dolor. keywords: description: Keyword list - example: Sapiente molestiae dolorum repellat expedita ut. + example: Magni ad doloremque soluta et quam totam. platforms: type: array items: type: string - example: Odio sunt esse mollitia incidunt. + example: Rerum voluptatem saepe eligendi eum non. description: Suggested default platforms example: - - Laborum sed molestias veritatis itaque. - - Est quis impedit. - - Illo harum et consequatur. + - Totam occaecati enim eaque blanditiis deleniti reprehenderit. + - Quas commodi. + - Qui mollitia architecto recusandae voluptates excepturi reiciendis. + - Consequatur amet dolorem qui. program_type: type: string description: Funnel context - example: Qui minima in nulla sunt autem eos. + example: Ratione dicta. project_id: type: string description: Owning project - example: Et sed praesentium libero. + example: Dolores qui. status: type: string description: Lifecycle status @@ -4326,33 +4363,33 @@ components: - archived targeting: description: Targeting recommendation - example: Dolor quam dolor consectetur eos iste. + example: Eos repudiandae voluptate est enim aut laborum. url: type: string description: Event/course page URL - example: Provident porro. + example: Voluptas qui. version: type: integer description: Optimistic-concurrency version - example: 709937816203366628 + example: 7978828505057037537 format: int64 example: - copy: Animi sit esse ratione aliquid. - event_details: Repudiandae tenetur aperiam saepe vel. - event_slug: Alias minus reprehenderit dignissimos aut velit. - id: Quis veniam iusto consequatur quia. - keywords: Laborum est quasi dignissimos. + copy: Autem aperiam quis. + event_details: Quae qui optio magni itaque iure. + event_slug: Consequatur velit atque nam voluptatem in. + id: Est et beatae. + keywords: Enim odit numquam. platforms: - - Omnis doloribus. - - Cum ut quo. - - Necessitatibus id sint dicta assumenda omnis voluptatem. - - Praesentium voluptatem blanditiis non totam temporibus. - program_type: Impedit dolores. - project_id: Officia eligendi alias. + - Ea ut voluptatem velit. + - Aut est est eum ut ut. + - Et molestiae blanditiis nihil dolor exercitationem. + - Placeat dolores culpa sed. + program_type: Repellendus autem ullam odio quis. + project_id: Est officiis enim qui. status: draft - targeting: Velit quis harum recusandae est ipsum. - url: At sint laborum veniam. - version: 285293330655778463 + targeting: Placeat aut dolores at. + url: Explicabo voluptatem et. + version: 2226888956028863556 required: - id - project_id @@ -4365,75 +4402,75 @@ components: properties: copy: description: Ad copy - example: Reiciendis sit minima. + example: Quia amet vero dolorum incidunt officia nihil. event_details: description: Extracted event/course details - example: Eligendi ipsam aut vel atque. + example: Optio enim nisi doloremque rerum sed consequatur. event_slug: type: string description: Event/course slug - example: Perspiciatis alias et amet ex molestiae. + example: Ut aspernatur et ad. id: type: string description: Brief UUID - example: Modi repellat eum. + example: Dignissimos voluptatem et labore sit atque qui. keywords: description: Keyword list - example: Unde et. + example: Dolores dignissimos perferendis tempore eum laboriosam iure. platforms: type: array items: type: string - example: Pariatur mollitia incidunt autem. + example: Vel aut rerum voluptatem ad minus. description: Suggested default platforms example: - - Voluptate fuga ea distinctio maiores mollitia aut. - - Rerum cum eaque nesciunt est totam inventore. + - Cum nemo esse nobis. + - Aut dolorem ea veniam. + - Quae adipisci doloribus ullam. + - Dolor eum et consequatur. program_type: type: string description: Funnel context - example: Eligendi magni quidem sit in quia. + example: Unde dolore id a necessitatibus fuga ducimus. project_id: type: string description: Owning project - example: Voluptatem eos doloribus sint. + example: Aut eaque eveniet autem. status: type: string description: Lifecycle status - example: archived + example: draft enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Ut dolores in voluptas. + example: At magnam saepe incidunt nisi est. url: type: string description: Event/course page URL - example: Minus libero et consequuntur suscipit. + example: Magnam sequi esse at. version: type: integer description: Optimistic-concurrency version - example: 3896136867528920326 + example: 3943386503686697829 format: int64 example: - copy: Sapiente harum aliquam sunt eum rerum eaque. - event_details: Voluptatem sint hic. - event_slug: Aut omnis labore et quis consequatur dolores. - id: Numquam molestias quibusdam aliquid deleniti. - keywords: Facere voluptatibus. + copy: Quos labore est ut ratione. + event_details: Sint molestiae occaecati. + event_slug: Deleniti non in iure dolores et quis. + id: Distinctio possimus. + keywords: Ut occaecati tenetur minima. platforms: - - Minima aut fugit eos et iure laudantium. - - Est molestiae voluptates ipsum neque sapiente aliquid. - - Velit sunt molestiae eius. - - Reprehenderit nobis hic eos magni. - program_type: Est natus sequi beatae. - project_id: Est aliquam debitis natus. - status: approved - targeting: Nisi repudiandae. - url: Nostrum similique omnis iste. - version: 7605661861379582739 + - Minus natus. + - Doloribus nam eius nulla suscipit ullam accusamus. + program_type: Id ducimus excepturi est et est. + project_id: Aliquid qui facilis neque sed alias. + status: archived + targeting: Sed impedit. + url: Recusandae similique assumenda ut quia. + version: 5475183181677687295 required: - id - project_id @@ -4446,76 +4483,74 @@ components: properties: copy: description: Ad copy - example: Delectus veniam vel est et magni. + example: Laborum quia beatae non et excepturi. event_details: description: Extracted event/course details - example: Vero consequatur possimus aut assumenda. + example: Molestias voluptatibus nam debitis hic qui. event_slug: type: string description: Event/course slug - example: Recusandae ut ullam aliquam dolore iure. + example: Exercitationem voluptatum perspiciatis autem. id: type: string description: Brief UUID - example: Velit omnis dolorem est aut. + example: Ut ut qui sed explicabo dolorem totam. keywords: description: Keyword list - example: Et provident illo non quisquam iure doloremque. + example: Minus officiis et quisquam dicta rerum. platforms: type: array items: type: string - example: Officia natus quia labore. + example: Sunt labore voluptate. description: Suggested default platforms example: - - Dolores et incidunt voluptatem ipsa. - - Assumenda excepturi. - - Tempora est eveniet sequi ea. + - Ipsum quo possimus saepe quam. + - Qui cum. program_type: type: string description: Funnel context - example: Consequuntur esse culpa. + example: Vero nulla laboriosam vel et et iure. project_id: type: string description: Owning project - example: Recusandae dignissimos dolore harum totam tempora vitae. + example: Qui nesciunt sed magnam. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Ut aliquid. + example: Enim est libero enim quo. url: type: string description: Event/course page URL - example: Minus nostrum iste nemo fugiat sunt. + example: Eum ut. version: type: integer description: Optimistic-concurrency version - example: 1796419171074064120 + example: 888507263129682759 format: int64 example: - copy: Commodi qui mollitia et eum veniam. - event_details: Alias voluptatem ut consequatur ut recusandae. - event_slug: Ab laboriosam sunt quis omnis. - id: Veritatis impedit aut. - keywords: Aliquam eaque voluptatem omnis. + copy: Et fuga veniam. + event_details: Aliquid eum itaque qui recusandae recusandae. + event_slug: Illum expedita commodi in dolores nemo similique. + id: Dolorem neque assumenda sed sapiente aspernatur ipsam. + keywords: Ea et iusto doloremque odio pariatur. platforms: - - Alias temporibus illum impedit ullam. - - Suscipit harum. - - Neque quia. - - Et veniam itaque optio consequatur nulla sint. - program_type: Exercitationem accusamus pariatur saepe ab qui. - project_id: Earum doloribus. - status: approved - targeting: Cupiditate aut. - url: Sunt quis odio enim nam id voluptatem. - version: 232152934679383541 + - Voluptatem libero quia. + - Harum molestiae cupiditate ab et eum ex. + - Quia velit adipisci. + program_type: Dignissimos in tempore quo consequatur sint qui. + project_id: Qui illo totam. + status: archived + targeting: Expedita animi ut velit at. + url: Autem impedit. + version: 6980228077781980481 required: - id - project_id @@ -4528,39 +4563,38 @@ components: properties: copy: description: Ad copy - example: Qui rerum numquam quo omnis a quia. + example: Quo soluta maxime temporibus earum et aperiam. event_details: description: Extracted event/course details - example: Itaque qui repudiandae magnam atque. + example: Amet officia occaecati quam nostrum quis voluptas. event_slug: type: string description: Event/course slug - example: Soluta dolore vitae. + example: Sapiente alias et error nobis minima. id: type: string description: Brief UUID - example: Minima iure quos enim occaecati beatae. + example: Ratione est omnis voluptas praesentium. keywords: description: Keyword list - example: Culpa ipsam totam nulla. + example: Ab itaque tempore vel quia cum quas. platforms: type: array items: type: string - example: Reiciendis laudantium dolor ipsam recusandae maxime nesciunt. + example: Fuga maxime tempora rem. description: Suggested default platforms example: - - Voluptatem aut debitis vitae unde velit eos. - - Accusantium odit rerum commodi ea. - - Consequatur et. + - Debitis rerum. + - Dolor pariatur. program_type: type: string description: Funnel context - example: Quaerat et eius culpa magni illum consequatur. + example: Laboriosam et. project_id: type: string description: Owning project - example: Molestiae ad voluptatum ducimus accusantium et. + example: Aspernatur voluptatum facilis. status: type: string description: Lifecycle status @@ -4571,32 +4605,32 @@ components: - archived targeting: description: Targeting recommendation - example: Molestias sint sequi. + example: Minus sit necessitatibus. url: type: string description: Event/course page URL - example: In commodi et asperiores et. + example: Reprehenderit dolorem impedit qui suscipit ipsa ut. version: type: integer description: Optimistic-concurrency version - example: 122602759626083426 + example: 4889810267187914144 format: int64 example: - copy: Fuga atque. - event_details: Qui omnis nesciunt qui consequuntur. - event_slug: Minima dolorem sit est tempora qui. - id: Placeat perferendis omnis ad voluptas. - keywords: Sequi culpa. + copy: Excepturi cumque ullam esse. + event_details: Quia voluptates voluptates nisi nihil aut molestias. + event_slug: Sed commodi voluptatibus. + id: Et est debitis ea. + keywords: Non autem voluptatem ut. platforms: - - Praesentium cumque illum pariatur odio molestias voluptatum. - - Nulla perferendis possimus deserunt iure et. - - Ea quidem ducimus tempora ea molestias. - program_type: Enim totam. - project_id: Voluptates laboriosam cumque mollitia quidem quo. - status: draft - targeting: Odit provident sed quo aperiam. - url: Voluptas necessitatibus cumque non porro qui molestias. - version: 4353559979947303924 + - Facilis asperiores enim nisi. + - Perspiciatis optio. + - Quia doloribus omnis et excepturi fugit dolores. + program_type: Nemo molestiae modi ut non atque. + project_id: Eum voluptatum accusamus illo eveniet eum. + status: approved + targeting: Distinctio non recusandae et qui ut exercitationem. + url: Nobis est fugit ratione consectetur exercitationem. + version: 1659901820906198210 required: - id - project_id @@ -4609,56 +4643,54 @@ components: properties: copy: description: Ad copy - example: Voluptas aperiam. + example: Tempora voluptate fuga ea distinctio. event_details: description: Extracted event/course details - example: Dolores enim. + example: Pariatur mollitia incidunt autem. event_slug: type: string description: Event/course slug (unique within the project) - example: Rerum numquam amet deserunt rem quia. + example: Quis harum recusandae. keywords: description: Keyword list - example: Assumenda harum eos eveniet ut et laboriosam. + example: Mollitia aut tempore rerum. platforms: type: array items: type: string - example: Numquam omnis ullam facilis ab sapiente. + example: Repellat eum totam voluptatem eos doloribus. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Esse voluptate eum laboriosam distinctio non. - - Deserunt labore et id aut et adipisci. - - Ut molestiae. - - Voluptates ut culpa saepe necessitatibus. + - Eligendi magni quidem sit in quia. + - Perspiciatis alias et amet ex molestiae. + - Minus libero et consequuntur suscipit. program_type: type: string description: Funnel context - example: education + example: membership enum: - events - education - membership targeting: description: Targeting recommendation - example: Quos expedita voluptas qui eaque. + example: Eaque nesciunt. url: type: string description: Event/course page URL - example: Ipsam dolores et et qui ut. + example: Ipsum est amet quaerat. example: - copy: Porro ut et cupiditate. - event_details: Non assumenda perspiciatis. - event_slug: Nostrum ratione id. - keywords: Ea ullam minima voluptatem vel deleniti. + copy: Beatae consectetur aut omnis labore et quis. + event_details: Natus deleniti est natus. + event_slug: Inventore in eligendi ipsam. + keywords: Dolores repellat. platforms: - - Quae molestiae suscipit non iusto. - - Consequatur in vero soluta. - - Eius dicta. - - Ullam distinctio dolore velit. + - Itaque ut dolores in. + - Expedita placeat dolores numquam molestias. + - Aliquid deleniti fuga est aliquam. program_type: education - targeting: Repudiandae necessitatibus dolorem enim beatae quia. - url: Laborum aspernatur voluptate itaque fugit. + targeting: Similique omnis. + url: Vel atque eos reiciendis sit minima non. required: - program_type - event_slug @@ -4668,50 +4700,50 @@ components: brief_id: type: string description: Parent brief - example: Aut ut. + example: Voluptas necessitatibus cumque non porro qui molestias. campaign_name: type: string description: Campaign name - example: Aut ut sit nisi architecto. + example: Nulla perferendis possimus deserunt iure et. etag: type: string description: ETag header value (mirrors version) - example: Voluptate enim qui impedit temporibus. + example: Omnis nesciunt qui. id: type: string description: Campaign UUID - example: Et vel beatae molestiae fuga. + example: Et minima dolorem sit. platform: type: string description: Channel - example: Sed corrupti sit. + example: In praesentium cumque. platform_campaign_id: type: string description: ID returned by the ad platform - example: Labore quia esse consectetur tenetur eum. + example: Pariatur odio molestias voluptatum. project_id: type: string description: Owning project - example: Vitae consequatur eos. + example: Tempora qui. status: type: string description: Campaign status - example: Rerum et recusandae possimus quis. + example: Ea quidem ducimus tempora ea molestias. version: type: integer description: Optimistic-concurrency version - example: 9161333083936888105 + example: 971659538665007246 format: int64 example: - brief_id: Explicabo repudiandae aut reiciendis recusandae molestias. - campaign_name: Hic est quia pariatur odit ullam. - etag: Quisquam nisi repellendus quos magnam aut. - id: Eos omnis cumque nemo ipsam ut. - platform: Vel inventore aliquid aut non eligendi accusamus. - platform_campaign_id: Quod impedit accusamus incidunt minus veritatis enim. - project_id: Natus et unde. - status: Ex id corrupti sed quo perferendis. - version: 7863921121752869750 + brief_id: Odit provident sed quo aperiam. + campaign_name: Voluptatem repellat expedita inventore. + etag: Maxime hic aliquam ratione ipsum. + id: Quia fuga atque. + platform: Aspernatur nihil et incidunt dolorem dolor sed. + platform_campaign_id: Delectus harum voluptates sit est corporis. + project_id: Sequi culpa. + status: Necessitatibus ut necessitatibus in. + version: 5532967292288417247 required: - id - project_id @@ -4726,45 +4758,45 @@ components: brief_id: type: string description: Parent brief - example: Voluptates sit est corporis molestiae voluptatem. + example: Et iste. campaign_name: type: string description: Campaign name - example: Ratione ipsum. + example: Rerum reiciendis similique. id: type: string description: Campaign UUID - example: Et incidunt. + example: Ea laboriosam totam unde. platform: type: string description: Channel - example: Expedita inventore qui necessitatibus ut necessitatibus in. + example: Voluptas ut nostrum officiis et accusamus provident. platform_campaign_id: type: string description: ID returned by the ad platform - example: Autem maxime hic. + example: Odio eos earum fuga non est. project_id: type: string description: Owning project - example: Dolor sed excepturi delectus. + example: Ipsa sint optio nobis quae corporis. status: type: string description: Campaign status - example: Amet hic est. + example: Tempora qui incidunt tempora. version: type: integer description: Optimistic-concurrency version - example: 906675377577277444 + example: 7916176946868712323 format: int64 example: - brief_id: Magnam voluptates molestiae libero autem quod. - campaign_name: Sunt accusantium totam quia. - id: Occaecati rerum reiciendis. - platform: Ullam ipsum. - platform_campaign_id: Dolores dolore id dolore sed. - project_id: Esse mollitia et dolorum accusantium aspernatur quos. - status: Accusantium debitis adipisci qui iste explicabo. - version: 9006499932988805057 + brief_id: Voluptas incidunt eligendi consequatur. + campaign_name: Earum temporibus ipsum necessitatibus ratione possimus eum. + id: Voluptatem dolores tempora qui sit. + platform: Labore eos et repudiandae odit omnis cupiditate. + platform_campaign_id: Illo repellat et cum. + project_id: Voluptates soluta animi sit ut. + status: Repellat eveniet reiciendis consequatur consequatur sint. + version: 2970088391723074573 required: - id - project_id @@ -4779,45 +4811,45 @@ components: brief_id: type: string description: Parent brief - example: Dolor quia consectetur non nulla dolore. + example: Et et sed. campaign_name: type: string description: Campaign name - example: Quos omnis. + example: Minima adipisci aut quia quisquam. id: type: string description: Campaign UUID - example: Qui quia. + example: Molestiae quo non. platform: type: string description: Channel - example: Ducimus voluptas soluta quod qui. + example: Vel quaerat iure ipsam. platform_campaign_id: type: string description: ID returned by the ad platform - example: Fugiat est omnis inventore voluptatum ab totam. + example: Necessitatibus reprehenderit illum. project_id: type: string description: Owning project - example: Ipsam sint autem repudiandae asperiores. + example: Reprehenderit natus. status: type: string description: Campaign status - example: Libero consequatur. + example: Quia facilis sit. version: type: integer description: Optimistic-concurrency version - example: 3986034538934721868 + example: 7577275663228988931 format: int64 example: - brief_id: Reiciendis odit eos et quidem. - campaign_name: Quae voluptatem velit mollitia dolorem ea. - id: Sapiente ex est modi cupiditate possimus ducimus. - platform: Atque hic quam impedit placeat. - platform_campaign_id: Voluptatibus aliquam et. - project_id: Modi consequatur molestias et et deleniti. - status: Enim voluptas numquam. - version: 616047483519279742 + brief_id: Molestiae cupiditate quis modi blanditiis. + campaign_name: Distinctio dignissimos. + id: Nihil qui doloremque nam magnam aliquid impedit. + platform: Tempora quod expedita magni. + platform_campaign_id: Harum ipsa. + project_id: Accusantium expedita alias placeat incidunt sit perspiciatis. + status: Voluptatibus natus tempora commodi et. + version: 6630207652424081561 required: - id - project_id @@ -4831,7 +4863,7 @@ components: properties: config: description: Per-platform campaign configuration - example: Qui libero natus. + example: Ullam eaque suscipit harum. platforms: type: array items: @@ -4847,16 +4879,15 @@ components: - hubspot description: Platforms to create campaigns on (binding selection) example: - - microsoft-ads - meta-ads - - twitter-ads - - hubspot + - google-ads + - reddit-ads + - reddit-ads example: - config: Vitae officia dolorem. + config: Et veniam itaque optio consequatur nulla sint. platforms: - - meta-ads - - twitter-ads - - hubspot + - reddit-ads + - linkedin-ads required: - platforms CampaignUpdateInput: @@ -4865,18 +4896,18 @@ components: campaign_name: type: string description: Campaign name - example: Id voluptatem nihil quaerat asperiores. + example: Amet hic est. config: description: Campaign configuration snapshot - example: Error perferendis quae qui inventore dolorem. + example: Quae esse mollitia et dolorum. status: type: string description: Campaign status - example: Repellat vel veritatis hic rerum accusamus. + example: Quaerat occaecati rerum. example: - campaign_name: Quasi in aut nam rerum. - config: Architecto deserunt vero ducimus distinctio. - status: Distinctio magnam. + campaign_name: Aspernatur quos est magnam voluptates. + config: Dolores dolore id dolore sed. + status: Libero autem quod saepe ullam ipsum. required: - campaign_name - status @@ -4920,14 +4951,14 @@ components: message: type: string description: Human-readable detail - example: Magni aut nisi est sit sint. + example: Accusantium totam quia. ok: type: boolean description: Whether the credential authenticated against the provider - example: false + example: true example: - message: Et voluptas dolorem necessitatibus illum quisquam. - ok: true + message: Debitis adipisci. + ok: false required: - ok CreateBriefRequestBody: @@ -4937,17 +4968,18 @@ components: $ref: '#/components/schemas/BriefInput' example: brief: - copy: Expedita unde molestiae. - event_details: Mollitia molestiae saepe qui ex commodi. - event_slug: Nesciunt unde ullam occaecati maxime. - keywords: Voluptas dolor et incidunt pariatur quod odit. + copy: Blanditiis quidem qui iusto sed. + event_details: Dolor molestias ipsa dolorum est. + event_slug: Accusantium ad. + keywords: Vel fuga recusandae. platforms: - - Ut expedita voluptatum sit. - - Quasi voluptas corporis velit et. - - Quia ut atque. - program_type: education - targeting: Velit ullam. - url: Similique vel nobis non molestias. + - Iste autem veniam et enim unde. + - Facere quam. + - Rem quia consequuntur ut. + - Consequatur quos atque voluptates quo sit. + program_type: membership + targeting: Nulla ut laboriosam. + url: Modi asperiores ut libero vel. required: - brief CreateCampaignsRequestBody: @@ -4957,10 +4989,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Vitae reiciendis voluptatem. + config: Adipisci consequuntur omnis a. platforms: - reddit-ads - - microsoft-ads + - meta-ads + - google-ads required: - input CreateGoogleAdsRequestBody: @@ -4976,10 +5009,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - config - credentials @@ -4992,14 +5025,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - config - credentials @@ -5013,10 +5046,10 @@ components: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - config - credentials @@ -5030,12 +5063,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - config - credentials @@ -5048,14 +5081,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. credentials: - client_id: Quis quo illum cum quod. - client_secret: Ut fugiat magnam quia. - developer_token: Distinctio beatae. - refresh_token: Ut tempora consequuntur cumque repudiandae omnis ut. + client_id: Quis et modi. + client_secret: Labore omnis provident nihil aut rerum est. + developer_token: Sint non. + refresh_token: Amet rem ab. required: - config - credentials @@ -5069,11 +5102,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - config - credentials @@ -5087,13 +5120,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - config - credentials @@ -5103,35 +5136,35 @@ components: account_id: type: string description: Provider account identifier - example: Velit quis. + example: Voluptatibus aliquam et. etag: type: string description: ETag header value (mirrors version) - example: Vel architecto quae error dolor placeat. + example: Mollitia dolorem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatem nostrum. + example: Modi consequatur molestias et et deleniti. label: type: string description: Optional friendly name - example: Ut nobis. + example: Atque hic quam impedit placeat. login_customer_id: type: string description: Manager account used for API access - example: Minus et. + example: Consequatur enim voluptas numquam aut et. project_id: type: string description: Owning project - example: Deleniti voluptas quo nostrum quia. + example: Reiciendis odit eos et quidem. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5140,18 +5173,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7197135224651925465 + example: 2538353845791645445 format: int64 example: - account_id: Nostrum atque illum nesciunt adipisci odit corrupti. - etag: Voluptas omnis quidem dolor ipsum voluptas sed. + account_id: Rem fugit accusantium est. + etag: Dolorem asperiores autem aut aut soluta. has_credentials: true - id: Fugiat aliquid aspernatur voluptatem in cupiditate. - label: Iusto fugit non asperiores quidem natus. - login_customer_id: Id ea. - project_id: Et dolorem quod. - status: deleted - version: 8604742619872904748 + id: Eius dolor magnam necessitatibus amet. + label: Rerum tempore tempora. + login_customer_id: Et est et corporis. + project_id: Earum aut qui. + status: active + version: 6983147448769937945 required: - id - project_id @@ -5166,7 +5199,7 @@ components: account_id: type: string description: Provider account identifier - example: Rem fugit accusantium est. + example: Sed ipsam enim esse iure est. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5174,19 +5207,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Iusto eius dolor magnam necessitatibus amet. + example: Minima dolorem omnis aspernatur veritatis adipisci. label: type: string description: Optional friendly name - example: Rerum tempore tempora. + example: Voluptas ipsam iste. login_customer_id: type: string description: Manager account used for API access - example: Dolorem asperiores autem aut aut soluta. + example: Quis quod aut sunt ex et autem. project_id: type: string description: Owning project - example: Earum aut qui. + example: Repellendus adipisci sit et enim quasi ut. status: type: string description: Connection status @@ -5199,17 +5232,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6983147448769937945 + example: 5457180552368415477 format: int64 example: - account_id: Officia dolores et reprehenderit. - has_credentials: false - id: Et est et corporis. - label: Aut explicabo. - login_customer_id: Rerum rem. - project_id: Voluptate est reprehenderit consectetur accusamus eaque inventore. - status: deleted - version: 8504196254053832609 + account_id: Natus aliquam aut quas aliquid. + has_credentials: true + id: Non adipisci omnis veritatis omnis. + label: Placeat et. + login_customer_id: Laboriosam praesentium beatae quis. + project_id: Omnis reprehenderit. + status: active + version: 5939335900418206229 required: - id - project_id @@ -5223,31 +5256,31 @@ components: account_id: type: string description: Provider account identifier - example: Et vel dolorum aut inventore consequatur. + example: Vero provident voluptas consequatur iusto. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Vitae qui explicabo tempora accusantium aut. + example: Eius harum. label: type: string description: Optional friendly name - example: Nobis qui sunt laboriosam ipsa. + example: Nihil excepturi provident saepe aliquam architecto. login_customer_id: type: string description: Manager account used for API access - example: Dicta ut. + example: Ut magnam aut illum commodi placeat sed. project_id: type: string description: Owning project - example: In vel. + example: Qui est nemo ullam. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -5256,17 +5289,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5579476471615779331 + example: 8077434258112236542 format: int64 example: - account_id: Alias quod minima blanditiis. - has_credentials: true - id: Beatae error deleniti vitae molestiae qui nobis. - label: Quia enim non asperiores velit. - login_customer_id: Iure dolores dolores dolorem sit nihil. - project_id: Aut temporibus dolorem cumque quis. - status: inactive - version: 4548596825330631938 + account_id: Voluptas quasi esse corporis. + has_credentials: false + id: Minus pariatur praesentium amet. + label: Sint velit earum laboriosam dignissimos reiciendis et. + login_customer_id: Deserunt reiciendis dolorem totam voluptatem. + project_id: Libero pariatur ut. + status: active + version: 6561992588765026566 required: - id - project_id @@ -5280,7 +5313,7 @@ components: account_id: type: string description: Provider account identifier - example: Ipsam eligendi est dolore. + example: Laudantium doloremque aut eligendi perferendis aut. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5288,19 +5321,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Sit est atque qui quaerat qui vitae. + example: Amet qui provident. label: type: string description: Optional friendly name - example: Optio in ratione accusamus quasi. + example: Ut ea. login_customer_id: type: string description: Manager account used for API access - example: Quos excepturi natus est est. + example: Ea consectetur delectus. project_id: type: string description: Owning project - example: Optio non. + example: Repudiandae molestias est consectetur porro quo pariatur. status: type: string description: Connection status @@ -5313,17 +5346,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6617602369183761406 + example: 10157424754048271 format: int64 example: - account_id: Quibusdam ea nam aut. - has_credentials: false - id: Doloribus unde id aut perspiciatis. - label: Sit totam ut et. - login_customer_id: Est consequatur rerum neque velit nulla modi. - project_id: Adipisci ut. - status: active - version: 926393304108038988 + account_id: Aut earum rerum ducimus dicta velit. + has_credentials: true + id: Id officiis architecto. + label: Sit iste ea. + login_customer_id: Molestiae dolorum non perspiciatis a. + project_id: Et libero ea aut omnis. + status: error + version: 8687544223346888800 required: - id - project_id @@ -5358,25 +5391,25 @@ components: client_id: type: string description: OAuth client id - example: In consectetur et culpa quaerat vel sed. + example: Sint autem repudiandae asperiores et. client_secret: type: string description: OAuth client secret - example: Et impedit quod. + example: Quia consectetur non nulla dolore quibusdam ducimus. developer_token: type: string description: Google Ads developer token - example: Magni omnis. + example: Soluta quod. refresh_token: type: string description: OAuth refresh token - example: Ipsa nihil esse. + example: Iste explicabo minima commodi qui quia est. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Sit id incidunt. - client_secret: Non sed hic minima est distinctio. - developer_token: A perferendis. - refresh_token: Facere eum aliquid est repellat assumenda. + client_id: Omnis inventore voluptatum ab. + client_secret: Laboriosam quos omnis deserunt libero consequatur quisquam. + developer_token: Sapiente ex est modi cupiditate possimus ducimus. + refresh_token: At fugiat. required: - refresh_token - client_id @@ -5388,15 +5421,15 @@ components: account_id: type: string description: Provider account identifier - example: Error eligendi incidunt accusamus excepturi inventore. + example: Sint suscipit. brand_kit: type: string description: Per-project brand kit selector - example: Aut architecto aliquam mollitia labore sapiente. + example: Quo veritatis nisi velit distinctio animi. etag: type: string description: ETag header value (mirrors version) - example: Quod minima dolor. + example: Non neque optio. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5404,27 +5437,27 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Nihil facilis sunt. + example: Dolore voluptatem qui eveniet amet. label: type: string description: Optional friendly name - example: Ut beatae eaque quo atque. + example: Voluptate et. portal_id: type: string description: HubSpot portal/account ID - example: Molestiae id aut debitis iure. + example: Architecto molestiae cum. project_id: type: string description: Owning project - example: Vero ad ex consequatur dolore. + example: Qui pariatur odio reprehenderit nam. sender_email: type: string description: Default sender address - example: Dolore est dolorem quod enim pariatur. + example: Perspiciatis consequatur beatae sunt officiis sequi qui. sender_name: type: string description: Default sender name - example: Occaecati veritatis. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. status: type: string description: Connection status @@ -5437,21 +5470,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7262698057225531796 + example: 6078188127403523196 format: int64 example: - account_id: Ad quae nisi. - brand_kit: Incidunt voluptas non necessitatibus. - etag: Cum et ab ipsum. - has_credentials: true - id: Tenetur non accusamus qui ex. - label: Ex et amet sunt. - portal_id: Qui nemo nihil dolorum consequatur. - project_id: Quia mollitia. - sender_email: Tempora qui eum hic vel aspernatur at. - sender_name: Est ea sed sit. - status: deleted - version: 7589133128297342291 + account_id: Dolor molestiae quia voluptatem deserunt libero. + brand_kit: Molestiae soluta vel ad et in voluptatem. + etag: Aut impedit a veritatis. + has_credentials: false + id: Provident rerum et voluptas tenetur esse. + label: Quaerat ipsa voluptatem. + portal_id: Consequuntur sed ea sunt debitis. + project_id: Assumenda sed minima nihil. + sender_email: Voluptas qui voluptas veniam sint voluptas. + sender_name: Non illo ab in voluptatem minus est. + status: active + version: 1552956989772584247 required: - id - project_id @@ -5466,11 +5499,11 @@ components: account_id: type: string description: Provider account identifier - example: Non in iure dolores et quis id. + example: Eius quo. brand_kit: type: string description: Per-project brand kit selector - example: Accusamus corrupti sint molestiae occaecati est quos. + example: Dolorem impedit sint consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5478,27 +5511,27 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Sint consequuntur omnis distinctio possimus non aliquid. + example: Iusto in commodi velit in odio. label: type: string description: Optional friendly name - example: Excepturi est et est totam. + example: Non architecto. portal_id: type: string description: HubSpot portal/account ID - example: Quia sed nesciunt minus. + example: Et corrupti magnam deleniti nam laboriosam esse. project_id: type: string description: Owning project - example: Facilis neque sed alias dolore id. + example: Aliquam voluptatem sunt et eveniet. sender_email: type: string description: Default sender address - example: Non doloribus nam. + example: Eaque ut voluptatibus qui qui officia. sender_name: type: string description: Default sender name - example: Nulla suscipit. + example: Alias quis voluptates nihil odio facere magnam. status: type: string description: Connection status @@ -5511,20 +5544,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1661229305097180791 + example: 7096858184495555885 format: int64 example: - account_id: Totam non qui. - brand_kit: Sunt labore voluptate. - has_credentials: true - id: Est ut ratione nobis. - label: Qui ut ut qui sed explicabo. - portal_id: Vero nulla laboriosam vel et et iure. - project_id: Occaecati tenetur minima veritatis sed impedit laborum. - sender_email: Exercitationem voluptatum perspiciatis autem. - sender_name: Eum ut. - status: active - version: 5481070480011205228 + account_id: Officia suscipit qui molestias aliquid dolorum consequatur. + brand_kit: Hic ea et. + has_credentials: false + id: Nihil labore accusamus illum in delectus magnam. + label: Porro voluptatum nemo adipisci. + portal_id: Enim aut. + project_id: Velit sed laboriosam placeat nesciunt. + sender_email: Dolores sed. + sender_name: Optio enim repellendus commodi quia quod sit. + status: inactive + version: 3587423604677944667 required: - id - project_id @@ -5538,11 +5571,11 @@ components: account_id: type: string description: Provider account identifier - example: Consequatur laborum. + example: Eligendi corporis tenetur delectus excepturi et. brand_kit: type: string description: Per-project brand kit selector - example: Aut tempora dolorem neque assumenda sed. + example: Ut est est mollitia. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5550,31 +5583,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Cum ipsum quo possimus. + example: Aperiam impedit omnis explicabo. label: type: string description: Optional friendly name - example: Cum ipsa molestias voluptatibus nam debitis hic. + example: Enim temporibus facere. portal_id: type: string description: HubSpot portal/account ID - example: Excepturi sit minus. + example: Id libero sunt. project_id: type: string description: Owning project - example: Quam culpa. + example: Et et commodi autem. sender_email: type: string description: Default sender address - example: Et quisquam dicta. + example: Suscipit consequatur iure dolor sit quis ut. sender_name: type: string description: Default sender name - example: Eaque enim est libero enim quo. + example: Natus enim non. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5583,20 +5616,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2473646846997850541 + example: 2722095064844656519 format: int64 example: - account_id: Similique eaque autem impedit tenetur voluptatibus. - brand_kit: Et fuga veniam. + account_id: Doloribus similique et. + brand_kit: Voluptas earum provident qui. has_credentials: true - id: Aspernatur ipsam consequatur qui illo totam fuga. - label: Qui non illum expedita commodi in dolores. - portal_id: Harum molestiae cupiditate ab et eum ex. - project_id: In tempore quo consequatur. - sender_email: Quia velit adipisci. - sender_name: Aliquid eum itaque qui recusandae recusandae. - status: deleted - version: 5418486313404831501 + id: Corporis omnis. + label: Delectus nisi minima quas voluptatem consequuntur. + portal_id: Aliquam dolorem voluptas autem enim aut ut. + project_id: Ea in sunt odit aspernatur. + sender_email: Eum ut rem illum. + sender_name: Autem ratione est exercitationem sapiente a animi. + status: error + version: 6167429858997341484 required: - id - project_id @@ -5610,11 +5643,11 @@ components: account_id: type: string description: Provider account identifier - example: Praesentium eos aspernatur voluptatum facilis laboriosam. + example: Quam aliquid reiciendis maiores similique ab. brand_kit: type: string description: Per-project brand kit selector - example: Ab earum. + example: Iure consectetur libero. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5622,31 +5655,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ea et iusto doloremque odio pariatur. + example: Facere dolorum rem laborum dolor provident. label: type: string description: Optional friendly name - example: Autem aliquid ratione est omnis. + example: Vitae voluptas fuga aut minima inventore tenetur. portal_id: type: string description: HubSpot portal/account ID - example: Alias et error nobis minima fuga reprehenderit. + example: Accusamus optio consequatur excepturi rerum. project_id: type: string description: Owning project - example: Expedita animi ut velit at. + example: Odio aut suscipit. sender_email: type: string description: Default sender address - example: Impedit qui suscipit ipsa. + example: In officiis dolores delectus architecto. sender_name: type: string description: Default sender name - example: Animi fuga maxime tempora. + example: Velit eligendi omnis est vel est et. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5655,20 +5688,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2736756583759126082 + example: 7137337173165660443 format: int64 example: - account_id: Ab itaque tempore vel quia cum quas. - brand_kit: Sed commodi voluptatibus. + account_id: Ratione architecto corporis totam et. + brand_kit: Tempora reprehenderit eveniet. has_credentials: true - id: Rerum perspiciatis dolor pariatur. - label: Quo soluta maxime temporibus earum et aperiam. - portal_id: Ipsa aut est et est debitis ea. - project_id: Amet officia occaecati quam nostrum quis voluptas. - sender_email: Eum voluptatum accusamus illo eveniet eum. - sender_name: Nemo molestiae modi ut non atque. - status: deleted - version: 5960975059584485019 + id: Accusamus aut deleniti libero veritatis cum. + label: Quidem perferendis. + portal_id: Tempora magnam ea repellat qui. + project_id: Deleniti dolorem voluptas harum soluta repudiandae quisquam. + sender_email: Eveniet dolor necessitatibus est mollitia. + sender_name: Officiis dolorem necessitatibus blanditiis rerum. + status: active + version: 6334382601164890326 required: - id - project_id @@ -5682,34 +5715,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Minus voluptatem ab delectus porro. + example: Totam et voluptates atque consequatur consequuntur voluptates. brand_kit: type: string description: Per-project brand kit selector - example: Modi esse voluptatibus. + example: Adipisci minus et vero. label: type: string description: Optional friendly name - example: Mollitia nulla. + example: Commodi facere vel. portal_id: type: string description: HubSpot portal/account ID - example: Veniam molestias. + example: Quos provident. sender_email: type: string description: Default sender address - example: Accusamus quia velit commodi. + example: Et fugiat reprehenderit officiis modi quae consequatur. sender_name: type: string description: Default sender name - example: Tenetur cumque rerum. + example: Et culpa culpa veritatis. example: - account_id: Hic magni. - brand_kit: Nihil atque. - label: Fugit dolorum nulla quo veritatis id. - portal_id: Et optio sed omnis aut voluptatem voluptas. - sender_email: Eum omnis est blanditiis maxime et. - sender_name: Et eum inventore quisquam. + account_id: Ea et quidem quibusdam officiis dolor. + brand_kit: Aut mollitia pariatur perferendis placeat dolores. + label: Ea perspiciatis rerum occaecati incidunt deleniti sunt. + portal_id: Nisi sunt. + sender_email: Sint dolor eaque culpa. + sender_name: Eius omnis id itaque. required: - account_id HubspotCredentials: @@ -5718,10 +5751,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Quia omnis in qui. + example: Molestiae veniam exercitationem blanditiis ratione non. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Nihil ut. + private_app_token: Sed dolorum cupiditate quia qui dicta. required: - private_app_token InternalServerError: @@ -5747,16 +5780,16 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Ut beatae quia. + example: Alias voluptatem ut consequatur ut recusandae. platforms: type: array items: type: string - example: Minima illo dolores natus a sint. + example: Qui mollitia et eum veniam. description: Platforms this job will create on example: - - Quae et nesciunt iure quis in. - - Mollitia nihil ducimus. + - Eaque voluptatem omnis architecto cupiditate. + - Sint culpa sed minima. status: type: string description: Initial status (always 'queued' on create) @@ -5764,10 +5797,11 @@ components: enum: - queued example: - job_id: Non quo necessitatibus. + job_id: Quos enim. platforms: - - Accusantium laudantium nostrum earum dolores. - - Eos exercitationem. + - Molestiae ad voluptatum ducimus accusantium et. + - Quaerat et eius culpa magni illum consequatur. + - Soluta dolore vitae. status: queued required: - job_id @@ -5778,33 +5812,33 @@ components: error: type: string description: Terminal error, if any - example: Hic vel ut. + example: Sequi aut veniam ratione. job_id: type: string description: Job UUID - example: Illo accusamus. + example: Quia magnam culpa ipsam totam nulla. result: type: array items: $ref: '#/components/schemas/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + platform: Ut totam ut. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + platform: Ut totam ut. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. + platform: Ut totam ut. status: type: string description: Job status - example: queued + example: running enum: - queued - running @@ -5812,22 +5846,18 @@ components: - partial - failed example: - error: Dolores quidem necessitatibus voluptatem consequatur sit. - job_id: Earum minus autem omnis qui debitis eum. + error: Mollitia quidem quo et enim. + job_id: Perferendis omnis ad voluptas esse. result: - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. - ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - - campaign_id: Autem ratione sit nam aliquam. - error: Repellendus in corporis doloribus labore. + platform: Ut totam ut. + - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. + error: Magni autem. ok: false - platform: Modi rem voluptatem. - status: running + platform: Ut totam ut. + status: failed required: - job_id - status @@ -5837,11 +5867,11 @@ components: account_id: type: string description: Provider account identifier - example: Quidem omnis totam eos non molestias. + example: Nobis qui sunt laboriosam ipsa. etag: type: string description: ETag header value (mirrors version) - example: Recusandae illum accusamus debitis. + example: Aut inventore consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5849,23 +5879,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Doloribus voluptas mollitia doloremque totam. + example: Rerum rem. label: type: string description: Optional friendly name - example: Quia doloremque commodi rerum. + example: In vel. org_id: type: string description: LinkedIn organization URN id - example: Praesentium sint laudantium error. + example: Autem eaque eaque dicta ut magni. project_id: type: string description: Owning project - example: Veniam et ducimus quos amet. + example: Vitae qui explicabo tempora accusantium aut. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5874,18 +5904,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6150421422111226538 + example: 3265309804259735983 format: int64 example: - account_id: Quas quis corporis. - etag: Ea ducimus ipsum dolorem dignissimos. + account_id: Alias quod minima blanditiis. + etag: Iure dolores dolores dolorem sit nihil. has_credentials: true - id: Nihil iure officiis nemo quia. - label: Et quia ex et alias ea. - org_id: Quo ullam ad iusto quos. - project_id: Ducimus id sint eius aut. + id: Error deleniti vitae molestiae qui nobis. + label: Quia enim non asperiores velit. + org_id: Sit est atque qui quaerat qui vitae. + project_id: Aut temporibus dolorem cumque quis. status: inactive - version: 2540282771582052941 + version: 4548596825330631938 required: - id - project_id @@ -5900,31 +5930,31 @@ components: account_id: type: string description: Provider account identifier - example: Sit soluta quia qui. + example: Et laboriosam veritatis saepe numquam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Optio quia similique vero est impedit quo. + example: Quas delectus a maxime consequatur iste eum. label: type: string description: Optional friendly name - example: Libero officia et quia. + example: Et at iusto optio. org_id: type: string description: LinkedIn organization URN id - example: Expedita sed velit distinctio. + example: Qui quisquam quae. project_id: type: string description: Owning project - example: Nihil at. + example: Vel impedit et unde et rerum. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -5933,17 +5963,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1438953144952054594 + example: 1129434020019069718 format: int64 example: - account_id: Optio rerum vel molestiae id. - has_credentials: false - id: Necessitatibus eos rerum. - label: Qui quas aut provident suscipit. - org_id: Reiciendis excepturi. - project_id: Veniam amet et quisquam voluptatem fuga. + account_id: Ea nostrum corrupti ipsum minima consequuntur. + has_credentials: true + id: Magni temporibus et molestias. + label: Iste ullam sunt rem non doloribus omnis. + org_id: Hic et illo aut natus et accusamus. + project_id: Molestias et officiis asperiores quibusdam accusamus. status: active - version: 8349066598252210000 + version: 8161899588231294433 required: - id - project_id @@ -5957,7 +5987,7 @@ components: account_id: type: string description: Provider account identifier - example: Aut temporibus. + example: Eos quidem debitis iusto molestias itaque consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5965,23 +5995,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Aut tenetur. + example: Qui et dolorem. label: type: string description: Optional friendly name - example: Iure aut tenetur ipsum ea ad ducimus. + example: Expedita error cumque. org_id: type: string description: LinkedIn organization URN id - example: Voluptatem libero. + example: Fugit et soluta. project_id: type: string description: Owning project - example: Et et. + example: Laboriosam repellat harum expedita aut quidem beatae. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5990,17 +6020,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8572511867951081487 + example: 7037294126068689767 format: int64 example: - account_id: Accusamus eos neque velit. + account_id: Iure ut. has_credentials: true - id: Eligendi non. - label: Aut amet aut voluptatum magnam. - org_id: Quisquam perspiciatis ipsam aperiam et totam in. - project_id: Necessitatibus non eum ipsum eveniet quam. - status: error - version: 786757177338717877 + id: Et qui officiis repudiandae qui iste accusantium. + label: Consequatur provident ea sint. + org_id: Eum quibusdam et minus id deleniti placeat. + project_id: Voluptatem iste nemo numquam unde perspiciatis. + status: active + version: 3173101195127892589 required: - id - project_id @@ -6014,7 +6044,7 @@ components: account_id: type: string description: Provider account identifier - example: Debitis atque laboriosam unde facilis. + example: Autem quia velit aliquid quae. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6022,23 +6052,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Numquam voluptatem maiores ipsam dicta cum odit. + example: Quia et non id sunt adipisci consectetur. label: type: string description: Optional friendly name - example: Nam modi nostrum assumenda alias sed. + example: Soluta nostrum cumque explicabo pariatur voluptatum molestias. org_id: type: string description: LinkedIn organization URN id - example: Mollitia ducimus sunt. + example: Consequatur vero possimus. project_id: type: string description: Owning project - example: Odit illo ut ut. + example: Modi quo et inventore eum autem quia. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -6047,17 +6077,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4721820161303114412 + example: 700201239225519995 format: int64 example: - account_id: Est deserunt maiores consequatur. - has_credentials: true - id: Aliquam voluptatem. - label: Eos minima sunt. - org_id: Non ratione quo ullam dolores occaecati. - project_id: Dolore aliquam est autem. - status: deleted - version: 2899021755311679849 + account_id: Sequi dolor eos fugiat rem. + has_credentials: false + id: Maiores voluptas. + label: Qui facilis possimus. + org_id: Pariatur et et deserunt facere ea incidunt. + project_id: Corporis quam quos dolor id debitis eos. + status: inactive + version: 1986183550074348775 required: - id - project_id @@ -6075,14 +6105,14 @@ components: label: type: string description: Optional friendly name - example: Sit voluptatem ad ab. + example: Officia dolores et reprehenderit. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Tempora dolor quis totam hic quibusdam eveniet. + label: Ex dolor. org_id: "208777" required: - account_id @@ -6093,10 +6123,10 @@ components: access_token: type: string description: OAuth access token - example: Dolorem necessitatibus neque consectetur occaecati earum. + example: Voluptate est reprehenderit consectetur accusamus eaque inventore. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Ut sint non eum expedita non. + access_token: Aut explicabo. required: - access_token MetaAdsConnection: @@ -6105,15 +6135,15 @@ components: account_id: type: string description: Provider account identifier - example: Occaecati quaerat eum quia a excepturi. + example: Libero officia et quia. app_id: type: string description: Meta app ID - example: Id vel iusto optio repellendus. + example: Necessitatibus eos rerum. etag: type: string description: ETag header value (mirrors version) - example: Eos culpa quaerat culpa inventore aut molestiae. + example: Qui maxime eos deserunt. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6121,23 +6151,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Necessitatibus voluptatem incidunt et totam esse rerum. + example: Est consequatur rerum neque velit nulla modi. label: type: string description: Optional friendly name - example: Voluptatem incidunt cum. + example: Nihil at. page_id: type: string description: Facebook page ID - example: Hic quos inventore. + example: Expedita sed velit distinctio. project_id: type: string description: Owning project - example: Dolorem delectus. + example: Optio quia similique vero est impedit quo. status: type: string description: Connection status - example: deleted + example: active enum: - active - inactive @@ -6146,19 +6176,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4898302691270586418 + example: 4061552416134608654 format: int64 example: - account_id: Nisi est magni odio aut. - app_id: Et ipsa magnam cum. - etag: Ducimus voluptatem doloremque ullam consequatur. - has_credentials: false - id: Ad dolorem et. - label: Inventore impedit unde voluptatem quia ab recusandae. - page_id: Eveniet tempore est omnis iusto fugiat. - project_id: Rerum eveniet nam sunt. + account_id: Vero aut repellendus reiciendis. + app_id: Ea ad ducimus consequatur aut. + etag: Atque et. + has_credentials: true + id: Veniam amet et quisquam voluptatem fuga. + label: Optio rerum vel molestiae id. + page_id: Quia iure aut tenetur. + project_id: Qui quas aut provident suscipit. status: inactive - version: 8514774147978099222 + version: 8332327938373479794 required: - id - project_id @@ -6173,11 +6203,11 @@ components: account_id: type: string description: Provider account identifier - example: Quos qui quo et. + example: Non impedit incidunt. app_id: type: string description: Meta app ID - example: Sed voluptas fuga officia nulla. + example: Alias laudantium sit et. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6185,23 +6215,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ut magnam facilis non facilis dolor consectetur. + example: Molestiae modi. label: type: string description: Optional friendly name - example: A debitis ut ea. + example: Temporibus ullam sint aliquam ea. page_id: type: string description: Facebook page ID - example: Beatae facilis dolor quod nihil quia. + example: Rerum corrupti. project_id: type: string description: Owning project - example: Error quisquam recusandae nesciunt et itaque. + example: Libero consectetur non. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6210,18 +6240,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2532070289670969642 + example: 1431900350448492398 format: int64 example: - account_id: Et nemo dicta illum omnis. - app_id: Minus est dolor. + account_id: Amet et vel ipsa ad doloremque qui. + app_id: Eum voluptatem debitis aliquid accusamus eligendi itaque. has_credentials: false - id: Recusandae consequatur nulla. - label: Consequuntur provident nostrum vel ut. - page_id: Deleniti magnam nemo cum delectus. - project_id: Non consequuntur qui qui impedit assumenda voluptas. - status: error - version: 1382848930967937507 + id: Sed eius reiciendis rerum voluptatem suscipit rerum. + label: Voluptas voluptatem eum consequuntur. + page_id: Est quidem in. + project_id: Et ex aut cupiditate qui placeat omnis. + status: inactive + version: 2895836647375905460 required: - id - project_id @@ -6235,35 +6265,35 @@ components: account_id: type: string description: Provider account identifier - example: Ipsa ut saepe beatae quasi. + example: Nam rerum omnis praesentium omnis amet quia. app_id: type: string description: Meta app ID - example: Neque voluptas doloremque nobis consectetur. + example: At explicabo reiciendis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Et voluptatem mollitia placeat aut laudantium. + example: Est temporibus explicabo doloremque possimus. label: type: string description: Optional friendly name - example: Nam sequi iste iusto. + example: Autem repellat et. page_id: type: string description: Facebook page ID - example: Corrupti ut. + example: Officia rerum eligendi ex. project_id: type: string description: Owning project - example: Ut et laborum. + example: Cupiditate ab omnis nesciunt consequatur commodi. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -6272,18 +6302,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2992056059874429339 + example: 5777051591540907893 format: int64 example: - account_id: Quis impedit. - app_id: Tempore qui repellendus. - has_credentials: false - id: Voluptas voluptatem. - label: Corrupti dicta pariatur totam quas deserunt. - page_id: Earum voluptates repellat ipsam aut et ut. - project_id: Quia facere vitae aperiam. - status: active - version: 5857417550509828993 + account_id: Voluptates voluptatem similique aut. + app_id: Natus expedita est sed. + has_credentials: true + id: At ratione unde dicta. + label: Voluptas perferendis et perferendis. + page_id: Voluptatem sit excepturi eaque. + project_id: Doloribus aspernatur quod ipsum pariatur explicabo nesciunt. + status: error + version: 4610591738843411818 required: - id - project_id @@ -6297,35 +6327,35 @@ components: account_id: type: string description: Provider account identifier - example: Accusantium est. + example: Repudiandae hic nostrum qui sed est architecto. app_id: type: string description: Meta app ID - example: Dolorem similique sapiente. + example: Eveniet magnam dolor sint. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Expedita commodi sit. + example: Ducimus qui quas neque eum voluptatem. label: type: string description: Optional friendly name - example: Quo porro. + example: Consectetur consequatur autem eveniet magnam dolor. page_id: type: string description: Facebook page ID - example: Pariatur esse. + example: Id doloremque ad dolores tempore ut est. project_id: type: string description: Owning project - example: Et porro saepe eius. + example: Velit corporis nemo. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6334,18 +6364,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8954046891574288398 + example: 3642485435905489461 format: int64 example: - account_id: Sed qui dolor illo facere ut voluptatem. - app_id: Perferendis placeat earum occaecati et. + account_id: Doloremque pariatur qui magni facere. + app_id: Ut voluptas est est accusamus. has_credentials: false - id: Ea pariatur. - label: Nam repellat. - page_id: Rerum maiores in alias est laboriosam saepe. - project_id: Aut rem molestiae assumenda ea. - status: deleted - version: 8862716294143227386 + id: Ipsa nam ipsa magnam praesentium eos cum. + label: Illum natus doloremque facere quis et beatae. + page_id: Sit animi dolor ex saepe ipsa. + project_id: Sed est recusandae enim quidem. + status: active + version: 1460268576636670658 required: - id - project_id @@ -6363,20 +6393,20 @@ components: app_id: type: string description: Meta app ID - example: Et minima. + example: Adipisci ut. label: type: string description: Optional friendly name - example: Voluptas quis nihil tempora rem asperiores. + example: Excepturi natus est est saepe doloribus unde. page_id: type: string description: Facebook page ID - example: Vero natus voluptatem. + example: Aut perspiciatis. example: account_id: act_193556282970417 - app_id: Voluptas aliquid libero sapiente aspernatur fugit eum. - label: Quas qui aut rerum illum vero. - page_id: Et neque soluta. + app_id: Dolores earum. + label: Sit totam ut et. + page_id: Quibusdam ea nam aut. required: - account_id MetaAdsCredentials: @@ -6385,15 +6415,15 @@ components: access_token: type: string description: Meta access token - example: Est placeat explicabo aliquid. + example: Optio non. app_secret: type: string description: Meta app secret - example: Tenetur ut. + example: Optio in ratione accusamus quasi. description: Meta Ads credential. Write-only; never returned. example: - access_token: Quo vel iste aut cum voluptatem. - app_secret: Et et aperiam. + access_token: Ipsam eligendi est dolore. + app_secret: Consequatur aut vero. required: - access_token - app_secret @@ -6403,15 +6433,15 @@ components: account_id: type: string description: Provider account identifier - example: Dolor ea iusto eveniet velit sint odit. + example: Ut itaque voluptatem unde adipisci aut. customer_id: type: string description: Microsoft Advertising customer ID - example: Quam enim odio quia. + example: Non laudantium quis ab non sunt. etag: type: string description: ETag header value (mirrors version) - example: Cupiditate et esse voluptate optio quis. + example: Aut praesentium eos ex laborum et doloremque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6419,19 +6449,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Et atque. + example: Et natus possimus cupiditate. label: type: string description: Optional friendly name - example: Aliquid explicabo eaque ab aut voluptas. + example: Repudiandae eum. project_id: type: string description: Owning project - example: Impedit velit omnis incidunt. + example: Molestiae quia neque atque delectus. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -6440,18 +6470,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8220727981299951228 + example: 9192676630235860462 format: int64 example: - account_id: Unde fuga voluptas ut vero. - customer_id: Velit dolorem. - etag: A pariatur omnis. + account_id: Voluptatem velit odio temporibus aut. + customer_id: Enim velit voluptates officiis tempora possimus rerum. + etag: Vitae dolor soluta beatae. has_credentials: true - id: Commodi aspernatur. - label: Velit perferendis est ipsum aut voluptas. - project_id: Nostrum numquam illo. - status: active - version: 5290138330966618163 + id: Quo est. + label: Quas quia quam voluptate nam iste. + project_id: Beatae totam. + status: error + version: 1007882038292754957 required: - id - project_id @@ -6466,27 +6496,27 @@ components: account_id: type: string description: Provider account identifier - example: Soluta et quam. + example: Quisquam sit ut aliquid consectetur. customer_id: type: string description: Microsoft Advertising customer ID - example: Voluptate est enim aut. + example: Quia assumenda aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Eaque ut. + example: Nobis ipsam blanditiis commodi accusamus maxime. label: type: string description: Optional friendly name - example: Iste et alias quis magni ad. + example: Iusto aspernatur fugit et facere eligendi. project_id: type: string description: Owning project - example: Et aspernatur delectus rem sit. + example: Quia sed eum ad sunt impedit sint. status: type: string description: Connection status @@ -6499,17 +6529,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2822393091615672408 + example: 8275500991568401541 format: int64 example: - account_id: Velit atque nam voluptatem in eveniet. - customer_id: Totam ea ut voluptatem velit eos aut. + account_id: Id voluptatem et et et eveniet. + customer_id: Ex dolor quia et dolores. has_credentials: true - id: Sequi non consequatur est. - label: Occaecati repellendus autem ullam odio quis sed. - project_id: Beatae magni est officiis enim. - status: active - version: 7510768710450776293 + id: Voluptate quam delectus optio. + label: Molestiae fuga. + project_id: Ducimus aliquam vel cum alias. + status: error + version: 2847235492838917454 required: - id - project_id @@ -6523,31 +6553,31 @@ components: account_id: type: string description: Provider account identifier - example: Itaque iure soluta autem. + example: Ipsum est a. customer_id: type: string description: Microsoft Advertising customer ID - example: Odit numquam quia. + example: Molestiae similique optio et corporis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Est eum ut ut amet et molestiae. + example: Distinctio ea. label: type: string description: Optional friendly name - example: Qui quae qui optio. + example: Velit architecto error consequatur nam. project_id: type: string description: Owning project - example: Nihil dolor exercitationem eum placeat dolores culpa. + example: Ab iste earum consequatur laboriosam maxime nemo. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -6556,17 +6586,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3577746410602694753 + example: 6583480909021941947 format: int64 example: - account_id: Ut unde dolore id. - customer_id: Dolorem ut aspernatur et ad. + account_id: Ex enim rem. + customer_id: Quo sit iure quos aut. has_credentials: false - id: Aut dolores. - label: Atque qui dignissimos aut eaque eveniet. - project_id: Voluptatem beatae quis dignissimos voluptatem et labore. + id: Eligendi voluptatem repellat consectetur alias reiciendis voluptas. + label: Dolorum enim doloribus. + project_id: Cumque est quis nostrum quod. status: active - version: 412346224570068154 + version: 2799898264679301316 required: - id - project_id @@ -6580,31 +6610,31 @@ components: account_id: type: string description: Provider account identifier - example: Aut dolorem ea veniam. + example: Repellendus et neque deserunt eligendi rerum architecto. customer_id: type: string description: Microsoft Advertising customer ID - example: Ullam dolor. + example: Sapiente dolor unde harum dolorem iusto quia. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Magnam sequi esse at. + example: Facere debitis quo. label: type: string description: Optional friendly name - example: Assumenda cum nemo esse nobis. + example: Modi eveniet. project_id: type: string description: Owning project - example: Vel aut rerum voluptatem ad minus. + example: Fuga quaerat sed. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -6613,17 +6643,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6107904235260429813 + example: 402075575675880099 format: int64 example: - account_id: Nihil deleniti dolores dignissimos perferendis tempore eum. - customer_id: Magnam saepe incidunt nisi. + account_id: Ratione ut laboriosam dolorem ut dolorem odio. + customer_id: Inventore iste nemo rerum corporis repellat nemo. has_credentials: true - id: Eum et consequatur quis. - label: Consequatur dolor quia amet vero dolorum incidunt. - project_id: Enim nisi doloremque rerum. + id: Eos doloremque qui repellendus. + label: Ea et nesciunt et culpa similique. + project_id: Incidunt in. status: deleted - version: 9143198940358453773 + version: 2480470963761289215 required: - id - project_id @@ -6637,19 +6667,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: Repudiandae facilis blanditiis libero nam. + example: Rerum maiores in alias est laboriosam saepe. customer_id: type: string description: Microsoft Advertising customer ID - example: Qui sed voluptatibus quam quia. + example: Perferendis placeat earum occaecati et. label: type: string description: Optional friendly name - example: Delectus blanditiis magnam sed iure amet. + example: Unde perspiciatis. example: - account_id: Molestiae omnis doloremque. - customer_id: Perspiciatis modi dicta quae sed ut. - label: Deserunt et quidem sapiente. + account_id: Assumenda quam possimus aut ipsa. + customer_id: Quae et perspiciatis numquam. + label: Eaque magni omnis dolorem. required: - account_id MicrosoftAdsCredentials: @@ -6658,25 +6688,25 @@ components: client_id: type: string description: OAuth client id - example: Aut est voluptatibus placeat. + example: Accusantium est. client_secret: type: string description: OAuth client secret - example: Pariatur perferendis explicabo expedita et velit accusamus. + example: Molestias reprehenderit. developer_token: type: string description: Microsoft Advertising developer token - example: Nulla eos. + example: Dolorem similique sapiente. refresh_token: type: string description: OAuth refresh token - example: Deleniti placeat rerum. + example: Pariatur esse. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Recusandae totam soluta. - client_secret: Praesentium libero. - developer_token: Quisquam animi. - refresh_token: Qui et assumenda quas. + client_id: Ea pariatur. + client_secret: Aut rem molestiae assumenda ea. + developer_token: Sed qui dolor illo facere ut voluptatem. + refresh_token: Nam repellat. required: - client_id - client_secret @@ -6705,24 +6735,24 @@ components: campaign_id: type: string description: Upstream platform campaign id (present when ok) - example: Magni atque amet omnis doloremque at. + example: Laudantium dolor ipsam recusandae maxime. error: type: string description: Failure reason (present when not ok) - example: Dolor et natus. + example: Repellendus assumenda voluptatem aut debitis. ok: type: boolean description: Whether the campaign was created (or reused) successfully - example: true + example: false platform: type: string description: Platform this result is for - example: Nihil neque quod alias ipsum. + example: In commodi et asperiores et. example: - campaign_id: Consequatur non eveniet esse officia explicabo dolor. - error: Aspernatur voluptatibus. + campaign_id: Et consequatur et et itaque qui repudiandae. + error: Atque ullam qui rerum numquam quo omnis. ok: true - platform: Cupiditate non exercitationem. + platform: Unde velit eos eius accusantium odit rerum. required: - platform - ok @@ -6766,11 +6796,11 @@ components: account_id: type: string description: Provider account identifier - example: Minima vitae illo cumque optio impedit. + example: Ut quas officiis mollitia ducimus sunt repellendus. etag: type: string description: ETag header value (mirrors version) - example: Odit autem repellendus dicta qui vel. + example: Aliquam est autem vel eos minima. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6778,15 +6808,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Enim id. + example: Odit illo ut ut. label: type: string description: Optional friendly name - example: Vel necessitatibus vel voluptates tenetur veniam repellat. + example: Debitis atque laboriosam unde facilis. project_id: type: string description: Owning project - example: Eveniet quia voluptatem impedit cumque doloribus. + example: Nam modi nostrum assumenda alias sed. status: type: string description: Connection status @@ -6799,17 +6829,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 234140326367801793 + example: 2463177480955435124 format: int64 example: - account_id: Rerum non assumenda molestiae modi impedit. - etag: Aliquam voluptatibus assumenda mollitia molestias eos nobis. + account_id: Facilis dolor consectetur sed. + etag: Et itaque. has_credentials: false - id: Earum id consequatur. - label: Adipisci ipsa. - project_id: Dolorum id ut molestias. - status: deleted - version: 948876280422508983 + id: Quas est deserunt maiores consequatur eum. + label: Occaecati hic ut magnam facilis. + project_id: Voluptatum pariatur non ratione quo ullam. + status: inactive + version: 3072744263422347458 required: - id - project_id @@ -6824,27 +6854,27 @@ components: account_id: type: string description: Provider account identifier - example: Et natus possimus cupiditate. + example: Est quia ducimus inventore. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Eaque magni omnis dolorem. + example: Nisi consequatur non quam suscipit ea ea. label: type: string description: Optional friendly name - example: Quae et perspiciatis numquam. + example: Autem aut maiores ut sint. project_id: type: string description: Owning project - example: Assumenda quam possimus aut ipsa. + example: Quia sed harum. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -6853,16 +6883,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6695567399746083998 + example: 4610200042662121887 format: int64 example: - account_id: Amet itaque aut. + account_id: Impedit perspiciatis ipsam sunt distinctio consequuntur. has_credentials: true - id: Atque delectus ut. - label: Unde adipisci aut quisquam. - project_id: Eum non ut itaque. - status: inactive - version: 8672712817511304757 + id: Et mollitia exercitationem cumque. + label: Eaque omnis nihil itaque. + project_id: Similique sequi occaecati. + status: error + version: 2750059486165092858 required: - id - project_id @@ -6876,27 +6906,27 @@ components: account_id: type: string description: Provider account identifier - example: Quas quia quam voluptate nam iste. + example: Deserunt provident voluptates cumque reiciendis error minus. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Et doloremque porro non. + example: Recusandae amet. label: type: string description: Optional friendly name - example: Dolores quo est ratione beatae totam. + example: Expedita nihil molestiae soluta consequuntur sapiente. project_id: type: string description: Owning project - example: Quis ab non. + example: Magni ut amet. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6905,16 +6935,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1807846651493588341 + example: 8154718885862958757 format: int64 example: - account_id: Molestiae veniam exercitationem blanditiis ratione non. - has_credentials: true - id: Temporibus aut numquam. - label: Enim velit voluptates officiis tempora possimus rerum. - project_id: Accusantium ut vitae dolor soluta beatae. - status: active - version: 8042484860326151968 + account_id: Rerum nesciunt veritatis consequatur porro. + has_credentials: false + id: Qui voluptas culpa. + label: Delectus non aut ipsum. + project_id: Iste nihil itaque et. + status: deleted + version: 1595767401527646160 required: - id - project_id @@ -6928,7 +6958,7 @@ components: account_id: type: string description: Provider account identifier - example: Quos provident. + example: Nemo aut et qui. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6936,19 +6966,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quia qui dicta. + example: Ratione provident laborum. label: type: string description: Optional friendly name - example: Totam et voluptates atque consequatur consequuntur voluptates. + example: Et quisquam dolores. project_id: type: string description: Owning project - example: Commodi facere vel. + example: Sed voluptatem repudiandae soluta. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -6957,16 +6987,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 413153877019026133 + example: 8907067316289641877 format: int64 example: - account_id: Incidunt deleniti. - has_credentials: false - id: Officiis modi quae consequatur voluptatem et. - label: Vero eum ea perspiciatis rerum. - project_id: Culpa veritatis ut adipisci minus. - status: active - version: 6279401977493721745 + account_id: Aliquid porro deserunt nostrum sed sint voluptas. + has_credentials: true + id: Officiis et error nemo iste harum. + label: Culpa est ex. + project_id: Commodi occaecati. + status: error + version: 2407825525433943238 required: - id - project_id @@ -6984,10 +7014,10 @@ components: label: type: string description: Optional friendly name - example: Numquam optio possimus velit quod. + example: Ipsam aperiam et totam in. example: account_id: t2_gv9wtbfa - label: Perspiciatis quam iste possimus ipsam. + label: Numquam voluptatem maiores ipsam dicta cum odit. required: - account_id RedditAdsCredentials: @@ -6996,20 +7026,20 @@ components: client_id: type: string description: OAuth client id - example: Mollitia vel. + example: Cumque laborum ipsum accusantium voluptatem libero. client_secret: type: string description: OAuth client secret - example: Ea eum. + example: Eligendi non. refresh_token: type: string description: OAuth refresh token - example: Qui qui. + example: Necessitatibus non eum ipsum eveniet quam. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Repudiandae quae aut. - client_secret: Tempore rem quo fuga accusantium voluptas ratione. - refresh_token: Esse et labore earum. + client_id: Aut amet aut voluptatum magnam. + client_secret: Accusamus eos neque velit. + refresh_token: In iure molestiae quisquam. required: - client_id - client_secret @@ -7038,10 +7068,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Nihil quia omnis eaque aperiam eum. - client_secret: Quam et voluptatibus illum dolorem. - developer_token: Eum dolorum. - refresh_token: Et illo beatae soluta. + client_id: Quae porro qui rem autem quae. + client_secret: Nulla officia vitae perspiciatis eveniet. + developer_token: Nobis ut asperiores quo aut. + refresh_token: Fuga enim nihil. required: - credentials SetCredentialHubspotRequestBody: @@ -7051,7 +7081,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Aut natus. + private_app_token: Non assumenda perspiciatis. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -7061,7 +7091,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Qui esse. + access_token: Sunt est labore libero. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7071,8 +7101,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Sed qui. - app_secret: Reiciendis qui id tenetur exercitationem aperiam incidunt. + access_token: Iure ut nostrum facilis suscipit. + app_secret: Porro voluptate. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7082,9 +7112,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Ea ipsam temporibus. - client_secret: Et necessitatibus dolorem ut. - refresh_token: Expedita accusantium dolorum qui sed fugiat. + client_id: Enim accusantium labore esse numquam. + client_secret: Non laudantium sunt minima repudiandae illo harum. + refresh_token: Dolorum deserunt. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7094,10 +7124,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Numquam quia. - access_token_secret: Dolorem autem ipsa autem provident est. - consumer_key: Pariatur voluptas odit fuga illo. - consumer_secret: Sit ex commodi sapiente a illum. + access_token: Quam officiis aut sit architecto ut unde. + access_token_secret: Sapiente possimus. + consumer_key: Harum corporis deleniti doloribus. + consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. required: - credentials TwitterAdsConnection: @@ -7106,31 +7136,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo repudiandae. + example: Temporibus in qui provident corrupti ut similique. etag: type: string description: ETag header value (mirrors version) - example: Vel aut aliquam rerum et quidem. + example: Consectetur voluptas voluptas voluptatem. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Enim voluptatem inventore quasi. + example: Quia facere vitae aperiam. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptatem possimus veniam dignissimos consequatur. + example: Laudantium eligendi ut et. label: type: string description: Optional friendly name - example: Est porro eos ipsa quia. + example: Saepe beatae. project_id: type: string description: Owning project - example: Delectus enim quas id porro. + example: Maiores nam sequi iste iusto reiciendis ipsa. status: type: string description: Connection status @@ -7143,18 +7173,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1500674714869504232 + example: 4247878238148524808 format: int64 example: - account_id: Sequi non et. - etag: Quibusdam repellendus qui numquam. - funding_instrument_id: Necessitatibus quaerat minima a voluptatem ipsa et. + account_id: Aut et ut dolorem tempore. + etag: Commodi sit omnis. + funding_instrument_id: Porro saepe eius earum quo porro. has_credentials: true - id: Aut omnis itaque ut vero voluptatibus. - label: Vero dolorem qui. - project_id: Eum provident velit voluptatibus. - status: active - version: 3990374454753155356 + id: Corrupti dicta pariatur totam quas deserunt. + label: In voluptate debitis earum voluptates repellat. + project_id: Quis impedit. + status: error + version: 1517802020058879691 required: - id - project_id @@ -7169,31 +7199,31 @@ components: account_id: type: string description: Provider account identifier - example: Eius omnis id itaque. + example: Est aut et rem eos quia et. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Perferendis placeat dolores. + example: Facere dolorum ab laboriosam placeat atque cumque. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quidem quibusdam officiis dolor. + example: Quam fugiat adipisci non rerum et. label: type: string description: Optional friendly name - example: Sint dolor eaque culpa. + example: Quaerat laborum voluptatibus accusamus. project_id: type: string description: Owning project - example: Nisi sunt. + example: Et eum tenetur. status: type: string description: Connection status - example: error + example: active enum: - active - inactive @@ -7202,17 +7232,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1134950045517095139 + example: 942544011211036746 format: int64 example: - account_id: Sint suscipit. - funding_instrument_id: Non neque optio. - has_credentials: false - id: Dolore voluptatem qui eveniet amet. - label: Voluptate et. - project_id: Qui pariatur odio reprehenderit nam. + account_id: Eaque eos veniam quidem maiores adipisci. + funding_instrument_id: Molestias ullam aut odit repellat nihil at. + has_credentials: true + id: Alias nihil. + label: Voluptas ullam optio. + project_id: Temporibus error incidunt. status: deleted - version: 6078188127403523196 + version: 5983859909197428373 required: - id - project_id @@ -7226,31 +7256,31 @@ components: account_id: type: string description: Provider account identifier - example: Quo veritatis nisi velit distinctio animi. + example: Aliquam perspiciatis libero est ratione pariatur. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Voluptas tenetur esse. + example: Corrupti quam unde nemo ipsum et illum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Architecto molestiae cum. + example: Reprehenderit nemo voluptatibus. label: type: string description: Optional friendly name - example: Sapiente perspiciatis dolores dignissimos soluta non vel. + example: Ipsa quis animi aliquam sunt. project_id: type: string description: Owning project - example: Perspiciatis consequatur beatae sunt officiis sequi qui. + example: Perferendis corrupti mollitia tempore aut. status: type: string description: Connection status - example: error + example: inactive enum: - active - inactive @@ -7259,17 +7289,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8298836967576578537 + example: 3919079788188515327 format: int64 example: - account_id: Eveniet aliquid quia aut impedit a veritatis. - funding_instrument_id: Sunt debitis enim voluptas qui voluptas veniam. - has_credentials: false - id: Assumenda sed minima nihil. - label: Dolor molestiae quia voluptatem deserunt libero. - project_id: Quaerat ipsa voluptatem. + account_id: Repellendus voluptatem. + funding_instrument_id: Saepe quo quis ut in voluptatem. + has_credentials: true + id: Rerum est. + label: Minus aut ut non. + project_id: Enim est sapiente. status: error - version: 5039507493953656552 + version: 6704106453019920248 required: - id - project_id @@ -7283,31 +7313,31 @@ components: account_id: type: string description: Provider account identifier - example: Dolor cumque dolores. + example: Qui doloremque magni est error maiores. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Neque aspernatur culpa sed non. + example: Est eum nemo architecto est aut. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Voluptas maxime non illo ab in voluptatem. + example: Nesciunt magnam omnis est unde. label: type: string description: Optional friendly name - example: Ad et in voluptatem et perspiciatis. + example: Eum animi sed explicabo et quo et. project_id: type: string description: Owning project - example: Est magnam molestiae soluta. + example: Rerum eius vitae perferendis quod. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -7316,17 +7346,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 889781010736384145 + example: 7817365326411446744 format: int64 example: - account_id: Deleniti reprehenderit saepe quas commodi qui qui. - funding_instrument_id: Excepturi reiciendis numquam consequatur amet dolorem. + account_id: Ut et sit quae similique inventore. + funding_instrument_id: Illum laboriosam debitis aut vitae est est. has_credentials: false - id: Ad cumque voluptas. - label: Non minima possimus totam occaecati enim eaque. - project_id: Facere rerum voluptatem saepe eligendi. - status: deleted - version: 2150669320812381725 + id: Ab culpa consequatur. + label: Excepturi et eveniet sunt ut. + project_id: Veniam omnis. + status: active + version: 328362383505116272 required: - id - project_id @@ -7344,15 +7374,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Est perferendis eos et cumque nulla. + example: Dolor et aliquam deleniti. label: type: string description: Optional friendly name - example: Iste exercitationem voluptate quia esse nihil sed. + example: Et nemo dicta illum omnis. example: account_id: 8r7gb - funding_instrument_id: In autem neque nihil laborum omnis. - label: Neque maiores quo aliquam in rem. + funding_instrument_id: Est dolor velit et voluptatem mollitia placeat. + label: Nemo cum delectus laudantium. required: - account_id TwitterAdsCredentials: @@ -7361,25 +7391,25 @@ components: access_token: type: string description: OAuth 1.0a access token - example: Hic voluptatem ad similique sunt ratione. + example: Perferendis et. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Dicta et ratione impedit recusandae dolor. + example: Beatae facilis dolor quod nihil quia. consumer_key: type: string description: OAuth 1.0a consumer key - example: Nemo sint et consequatur vel quisquam libero. + example: A debitis ut ea. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Eum et sint possimus omnis dolorem. + example: Quos qui quo et. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Facere sed ea qui pariatur adipisci. - access_token_secret: Enim esse dolores. - consumer_key: Mollitia vel temporibus sunt nulla esse. - consumer_secret: Sunt voluptatem beatae repellat veritatis perferendis veritatis. + access_token: Non consequuntur qui qui impedit assumenda voluptas. + access_token_secret: Consequuntur provident nostrum vel ut. + consumer_key: Sed voluptas fuga officia nulla. + consumer_secret: Recusandae consequatur nulla. required: - consumer_key - consumer_secret @@ -7392,9 +7422,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Alias ullam fugiat deserunt sint nihil iusto. - config: Necessitatibus expedita. - status: Voluptas inventore sit. + campaign_name: Itaque quos voluptatibus quos accusantium fugit. + config: Qui molestias. + status: Excepturi saepe sit vel perspiciatis neque. required: - campaign UpdateGoogleAdsRequestBody: @@ -7416,12 +7446,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Velit labore non. - brand_kit: Dolorem sapiente. - label: Sit quibusdam nulla adipisci aperiam dolorem molestias. - portal_id: Odit est esse. - sender_email: Ea cum et magni adipisci magnam. - sender_name: Atque labore qui odio et corporis. + account_id: Itaque fugit rerum cumque. + brand_kit: Ullam distinctio dolore velit. + label: Laudantium nostrum ratione id eius laborum aspernatur. + portal_id: Molestiae suscipit non iusto. + sender_email: Consequatur in vero soluta. + sender_name: Eius dicta. required: - config UpdateLinkedinAdsRequestBody: @@ -7432,7 +7462,7 @@ components: example: config: account_id: "538170226" - label: Et placeat. + label: Assumenda quam deleniti et et nam quia. org_id: "208777" required: - config @@ -7444,9 +7474,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Non praesentium voluptas saepe sit. - label: Aut assumenda unde occaecati eum tenetur nam. - page_id: Aliquid voluptatibus iste mollitia commodi libero atque. + app_id: Deleniti voluptates non sint inventore. + label: Mollitia odio et dolor et consectetur. + page_id: Error ipsam maiores et maiores laudantium aut. required: - config UpdateMicrosoftAdsRequestBody: @@ -7456,9 +7486,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Perferendis quia possimus dolore vel qui et. - customer_id: Vero quis consequuntur. - label: Accusantium aspernatur facere tempora voluptatem dicta rerum. + account_id: Voluptate necessitatibus enim et et itaque. + customer_id: Omnis mollitia aut. + label: Nobis omnis. required: - config UpdateRedditAdsRequestBody: @@ -7469,7 +7499,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Aut sed fugiat adipisci eos. + label: Rerum adipisci. required: - config UpdateTwitterAdsRequestBody: @@ -7480,8 +7510,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Non possimus quos voluptatem doloremque consequatur deleniti. - label: Quaerat ut neque expedita nostrum. + funding_instrument_id: Qui cupiditate ullam ab suscipit et. + label: Necessitatibus non iste ad rem quidem. required: - config securitySchemes: diff --git a/gen/lfx_v2_campaign_service_briefs/client.go b/gen/lfx_v2_campaign_service_briefs/client.go index 83650f44..13984cb3 100644 --- a/gen/lfx_v2_campaign_service_briefs/client.go +++ b/gen/lfx_v2_campaign_service_briefs/client.go @@ -106,6 +106,8 @@ func (c *Client) UpdateBrief(ctx context.Context, p *UpdateBriefPayload) (res *B // - "Conflict" (type *ConflictError): Conflict // - "InternalServerError" (type *InternalServerError): Internal server error // - "ServiceUnavailable" (type *ConnServiceUnavailableError): Service unavailable +// - "PreconditionFailed" (type *PreconditionFailedError): ETag mismatch +// - "PreconditionRequired" (type *PreconditionRequiredError): If-Match header required // - error: internal error func (c *Client) ApproveBrief(ctx context.Context, p *ApproveBriefPayload) (res *Brief, err error) { var ires any diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index 19cd2efe..86e5cdf3 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -67,6 +67,8 @@ type ApproveBriefPayload struct { ProjectID string // Brief UUID BriefID string + // Version being approved (ETag); approval is rejected if the brief changed + IfMatch *string } // Brief is the result type of the lfx-v2-campaign-service-briefs service diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index 245c6048..294887cf 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -22,8 +22,10 @@ type BriefWriter interface { CreateBrief(ctx context.Context, b *model.CampaignBrief) (*model.CampaignBrief, error) // ReplaceBrief replaces a brief's mutable fields, gating on expectedVersion. ReplaceBrief(ctx context.Context, b *model.CampaignBrief, expectedVersion int64) (*model.CampaignBrief, error) - // Approve marks a brief approved, recording the actor. - Approve(ctx context.Context, projectID, id string, by *model.Actor) (*model.CampaignBrief, error) + // Approve marks a brief approved, recording the actor. It is gated on + // expectedVersion (optimistic concurrency): approving a stale version returns + // ErrPreconditionFailed so a concurrent replace can't be approved by accident. + Approve(ctx context.Context, projectID, id string, by *model.Actor, expectedVersion int64) (*model.CampaignBrief, error) // ArchiveBrief soft-archives a brief (status = archived). ArchiveBrief(ctx context.Context, projectID, id string) error } diff --git a/internal/infrastructure/postgres/brief_repo.go b/internal/infrastructure/postgres/brief_repo.go index f717b077..54f1c598 100644 --- a/internal/infrastructure/postgres/brief_repo.go +++ b/internal/infrastructure/postgres/brief_repo.go @@ -110,20 +110,31 @@ func (r *BriefRepo) ReplaceBrief(ctx context.Context, b *model.CampaignBrief, ex } // Approve marks a brief approved, recording the actor. -func (r *BriefRepo) Approve(ctx context.Context, projectID, id string, by *model.Actor) (*model.CampaignBrief, error) { +func (r *BriefRepo) Approve(ctx context.Context, projectID, id string, by *model.Actor, expectedVersion int64) (*model.CampaignBrief, error) { approvedBy, err := marshalActor(by) if err != nil { return nil, err } + // Gate on version so a brief that was replaced (bumping its version) since the + // approver fetched it cannot be approved on stale content. q := `UPDATE campaign_briefs SET status='approved', approved_by=$1, approved_at=now(), version=version+1, updated_at=now() - WHERE id=$2 AND project_id=$3 AND status <> 'archived'` - tag, err := r.db.Exec(ctx, q, approvedBy, id, projectID) + WHERE id=$2 AND project_id=$3 AND version=$4 AND status <> 'archived'` + tag, err := r.db.Exec(ctx, q, approvedBy, id, projectID, expectedVersion) if err != nil { return nil, fmt.Errorf("approve brief: %w", err) } if tag.RowsAffected() == 0 { - return nil, domain.ErrNotFound + // Distinguish missing from stale version, mirroring ReplaceBrief. + _, gerr := r.GetBrief(ctx, projectID, id) + switch { + case errors.Is(gerr, domain.ErrNotFound): + return nil, domain.ErrNotFound + case gerr != nil: + return nil, gerr + default: + return nil, domain.ErrPreconditionFailed + } } return r.GetBrief(ctx, projectID, id) } diff --git a/internal/service/brief.go b/internal/service/brief.go index 2ccbd622..81547dd8 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -126,9 +126,13 @@ func (s *BriefService) ApproveBrief(ctx context.Context, p *briefs.ApproveBriefP if err := s.ensureAvailable(); err != nil { return nil, err } - b, err := s.briefs.Approve(ctx, p.ProjectID, p.BriefID, actorFromCtx(ctx)) + version, err := parseBriefIfMatch(p.IfMatch) if err != nil { - return nil, mapBriefErr(err) + return nil, err + } + b, aerr := s.briefs.Approve(ctx, p.ProjectID, p.BriefID, actorFromCtx(ctx), version) + if aerr != nil { + return nil, mapBriefErr(aerr) } return briefResult(b), nil } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index ef7014ef..2571f48e 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -43,11 +43,14 @@ func (r *fakeBriefRepo) ReplaceBrief(_ context.Context, b *model.CampaignBrief, return b, nil } -func (r *fakeBriefRepo) Approve(_ context.Context, projectID, id string, _ *model.Actor) (*model.CampaignBrief, error) { +func (r *fakeBriefRepo) Approve(_ context.Context, projectID, id string, _ *model.Actor, expectedVersion int64) (*model.CampaignBrief, error) { b, ok := r.briefs[briefKey(projectID, id)] if !ok { return nil, domain.ErrNotFound } + if b.Version != expectedVersion { + return nil, domain.ErrPreconditionFailed + } b.Status = model.BriefApproved return b, nil } @@ -206,3 +209,38 @@ func TestBriefService_ResponseIncludesBriefContent(t *testing.T) { t.Error("get response dropped keywords") } } + +// ApproveBrief requires an If-Match and is gated on version, so a brief that was +// replaced since the approver fetched it cannot be approved on stale content. +func TestBriefService_ApproveBrief_VersionGated(t *testing.T) { + repo := newFakeBriefRepo() + repo.briefs[briefKey("cncf", "b1")] = &model.CampaignBrief{ + ID: "b1", ProjectID: "cncf", Status: model.BriefDraft, Version: 3, + } + s := newTestBriefService(repo) + + // Missing If-Match -> 428 PreconditionRequired. + if _, err := s.ApproveBrief(context.Background(), &briefs.ApproveBriefPayload{ProjectID: "cncf", BriefID: "b1"}); err == nil { + t.Fatal("expected an error when If-Match is missing") + } else if _, ok := err.(*briefs.PreconditionRequiredError); !ok { + t.Fatalf("missing If-Match: got %T (%v), want *PreconditionRequiredError", err, err) + } + + // Stale version -> 412 PreconditionFailed. + stale := "2" + if _, err := s.ApproveBrief(context.Background(), &briefs.ApproveBriefPayload{ProjectID: "cncf", BriefID: "b1", IfMatch: &stale}); err == nil { + t.Fatal("expected an error approving a stale version") + } else if _, ok := err.(*briefs.PreconditionFailedError); !ok { + t.Fatalf("stale version: got %T (%v), want *PreconditionFailedError", err, err) + } + + // Current version -> approved. + cur := "3" + got, err := s.ApproveBrief(context.Background(), &briefs.ApproveBriefPayload{ProjectID: "cncf", BriefID: "b1", IfMatch: &cur}) + if err != nil { + t.Fatalf("approve at current version: %v", err) + } + if got.Status != "approved" { + t.Errorf("status = %q, want approved", got.Status) + } +} From 4d1f3d0a8733b90332c492609774454daf78217d Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 17:12:33 -0700 Subject: [PATCH 11/46] fix(review): round-4 Copilot findings on orchestrator + design (PR #11) - Move the idempotency lookup before dispatcher resolution, so an already-persisted platform is reported ok on retry even if its dispatcher is no longer registered (previously marked failed). - Reject a dispatched campaign with an empty PlatformCampaignID as a failure: campaign_id is documented as present when ok, and an empty id couldn't be recognized by the idempotency guard on a later retry. - Mark platforms as Required in JobCreateResponse (the handler always returns it). Tests: empty-upstream-id -> failure (not persisted); existing campaign reused despite no registered dispatcher. gen/ regenerated; build/vet/ golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 2 + .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 1 + design/brief.go | 2 +- .../client/types.go | 11 +++-- .../server/types.go | 4 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 2 + gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 1 + internal/service/orchestrator.go | 42 ++++++++++------ internal/service/orchestrator_test.go | 48 +++++++++++++++++++ 13 files changed, 95 insertions(+), 26 deletions(-) diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index b95b913e..99f5aa82 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index 63414314..0183e3c1 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -478,6 +478,7 @@ paths: required: - job_id - status + - platforms "400": description: Bad Request response. schema: @@ -4039,6 +4040,7 @@ definitions: required: - job_id - status + - platforms JobPollResponse: title: JobPollResponse type: object diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index dd5372bd..cb7b24d5 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index 8eb9fff0..1b0a6147 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -5806,6 +5806,7 @@ components: required: - job_id - status + - platforms JobPollResponse: type: object properties: diff --git a/design/brief.go b/design/brief.go index 4f7b7757..84003fb3 100644 --- a/design/brief.go +++ b/design/brief.go @@ -72,7 +72,7 @@ var JobCreateResponse = Type("job-create-response", func() { Enum("queued") }) Attribute("platforms", ArrayOf(String), "Platforms this job will create on") - Required("job_id", "status") + Required("job_id", "status", "platforms") }) // PlatformResult is one platform's outcome within a terminal job result. It diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index d738017e..57b873ba 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -1262,11 +1262,9 @@ func NewCreateCampaignsJobCreateResponseAccepted(body *CreateCampaignsResponseBo JobID: *body.JobID, Status: *body.Status, } - if body.Platforms != nil { - v.Platforms = make([]string, len(body.Platforms)) - for i, val := range body.Platforms { - v.Platforms[i] = val - } + v.Platforms = make([]string, len(body.Platforms)) + for i, val := range body.Platforms { + v.Platforms[i] = val } return v @@ -1699,6 +1697,9 @@ func ValidateCreateCampaignsResponseBody(body *CreateCampaignsResponseBody) (err if body.Status == nil { err = goa.MergeErrors(err, goa.MissingFieldError("status", "body")) } + if body.Platforms == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) + } if body.Status != nil { if !(*body.Status == "queued") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"queued"})) diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 9c03c078..1f385af7 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -163,7 +163,7 @@ type CreateCampaignsResponseBody struct { // Initial status (always 'queued' on create) Status string `form:"status" json:"status" xml:"status"` // Platforms this job will create on - Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` + Platforms []string `form:"platforms" json:"platforms" xml:"platforms"` } // GetCampaignResponseBody is the type of the "lfx-v2-campaign-service-briefs" @@ -898,6 +898,8 @@ func NewCreateCampaignsResponseBody(res *lfxv2campaignservicebriefs.JobCreateRes for i, val := range res.Platforms { body.Platforms[i] = val } + } else { + body.Platforms = []string{} } return body } diff --git a/gen/http/openapi.json b/gen/http/openapi.json index b95b913e..99f5aa82 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 63414314..0183e3c1 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -478,6 +478,7 @@ paths: required: - job_id - status + - platforms "400": description: Bad Request response. schema: @@ -4039,6 +4040,7 @@ definitions: required: - job_id - status + - platforms JobPollResponse: title: JobPollResponse type: object diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index dd5372bd..cb7b24d5 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 8eb9fff0..1b0a6147 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -5806,6 +5806,7 @@ components: required: - job_id - status + - platforms JobPollResponse: type: object properties: diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 8513b9cb..4cc72243 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -87,18 +87,15 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa // A single platform failure must not cancel the others, so we never // return a non-nil error from the group; failures are recorded. res := platformResult{Platform: string(p)} - d, ok := o.dispatchers[p] - if !ok { - res.Error = "no dispatcher registered for platform" - results[i] = res - return nil - } - // Idempotency guard: if this brief already has a campaign for this - // platform with an upstream id, a prior run (or a re-POST of - // create-campaigns) already created the paid campaign. Reuse it instead - // of calling the platform's create API again, which would spend money on - // a duplicate. A not-found is the normal first-time path; a transient - // lookup error is recorded as a failure rather than risking a duplicate. + + // Idempotency guard FIRST, before resolving the dispatcher: if this + // brief already has a campaign for this platform with an upstream id, a + // prior run (or a re-POST of create-campaigns) already created the paid + // campaign, so reuse it. This must precede the dispatcher lookup so an + // already-persisted platform is reported ok on retry even if its + // dispatcher is no longer registered. A not-found is the normal + // first-time path; a transient lookup error is recorded as a failure + // rather than risking a duplicate create. // // This read-before-dispatch check narrows — but does not fully close — // the duplicate window: two concurrent create-campaigns requests for the @@ -106,9 +103,8 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa // The (brief_id, platform) unique index keeps persistence single-rowed, // but the upstream create is not transactional with it. Fully closing // this requires provider-side idempotency keys and single-flight job - // ownership, tracked with the job-recovery follow-up (see the goroutine - // lifecycle thread). campaign_id below is always the upstream platform id - // so the field's meaning is identical on the reuse and create paths. + // ownership, tracked in LFXV2-2665. campaign_id below is always the + // upstream platform id so the field means the same on reuse and create. if existing, lerr := o.campaigns.GetCampaignByPlatform(gctx, brief.ID, p); lerr == nil { if existing.PlatformCampaignID != "" { res.OK = true @@ -121,6 +117,13 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa results[i] = res return nil } + + d, ok := o.dispatchers[p] + if !ok { + res.Error = "no dispatcher registered for platform" + results[i] = res + return nil + } campaign, err := d.Dispatch(gctx, brief, p, config) if err != nil { res.Error = err.Error() @@ -135,6 +138,15 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa results[i] = res return nil } + if campaign.PlatformCampaignID == "" { + // A successful dispatch must yield an upstream campaign id; without + // one the result can't honestly be reported ok (campaign_id is + // documented as present when ok), and a later retry couldn't + // recognize it via the idempotency guard. Treat as a failure. + res.Error = "dispatcher returned no upstream campaign id" + results[i] = res + return nil + } // Stamp ownership before persisting so a dispatcher can't cause a // campaign to be written with missing/wrong ownership. Set on a // fresh reference the dispatcher returned; the invariant is one diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 72c749fd..9f6193e4 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -291,3 +291,51 @@ func TestAggregateStatus(t *testing.T) { }) } } + +// emptyIDDispatcher returns a non-nil campaign with no upstream id — a +// misbehaving dispatcher that must be recorded as a failure, not ok. +type emptyIDDispatcher struct{} + +func (emptyIDDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ model.Provider, _ json.RawMessage) (*model.Campaign, error) { + return &model.Campaign{PlatformCampaignID: "", Status: "active", CampaignName: "n"}, nil +} + +// TestOrchestrator_EmptyUpstreamIDIsFailure verifies a dispatched campaign with +// no PlatformCampaignID is reported as a failure (not ok) and not persisted. +func TestOrchestrator_EmptyUpstreamIDIsFailure(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: emptyIDDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + if len(camps.upserted) != 0 { + t.Errorf("upserted %d, want 0 (empty upstream id must not persist)", len(camps.upserted)) + } +} + +// TestOrchestrator_ReusesExistingWhenDispatcherGone verifies the idempotency +// guard runs before dispatcher resolution: an already-persisted platform is +// reported ok on retry even if its dispatcher is no longer registered. +func TestOrchestrator_ReusesExistingWhenDispatcherGone(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{existing: map[string]*model.Campaign{ + "b1|" + string(model.ProviderGoogleAds): {ID: "c1", PlatformCampaignID: "pc-google-ads"}, + }} + // No dispatchers registered at all. + orch := NewOrchestrator(camps, jobs, nil) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobSucceeded { + t.Errorf("status = %s, want succeeded (existing campaign reused despite no dispatcher)", j.Status) + } + if !strings.Contains(string(j.Result), "pc-google-ads") { + t.Errorf("result = %s, want the reused upstream id", j.Result) + } +} From 73a7b4725bd1eb939bb59c89a8c181ceb8d74ce7 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 17:19:19 -0700 Subject: [PATCH 12/46] =?UTF-8?q?fix(review):=20round-5=20Copilot=20findin?= =?UTF-8?q?gs=20=E2=80=94=20error=20sanitization,=20panic=20recovery,=20av?= =?UTF-8?q?ailability=20guard=20(PR=20#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Sanitize repository/DB errors in the async job result: log the raw error server-side and store a generic message (could not verify/persist campaign) so GetJob doesn't surface internal DB error text to clients. The dispatcher's own error is still surfaced (it's the platform failure reason). - Recover from a panic in the per-platform dispatch goroutine: a panicking dispatcher is now recorded as a platform failure instead of crashing the process mid-job; the panic value is not leaked to the client result. - Harden ensureAvailable() to check every collaborator the service methods dereference (briefs, campaigns, jobs, orch), not just briefs, so a partially-wired service returns 503 instead of nil-panicking. Tests: panicking dispatcher -> failed job, no leak; raw persist error sanitized in result. gen/ regenerated; build/vet/golangci-lint/okfvalidate/ test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- internal/service/brief.go | 5 ++- internal/service/orchestrator.go | 25 ++++++++++-- internal/service/orchestrator_test.go | 57 +++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/internal/service/brief.go b/internal/service/brief.go index 81547dd8..f5ddd5c7 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -40,7 +40,10 @@ func NewBriefService(b domain.BriefRepository, c domain.CampaignRepository, j do // mounted in that mode so runtime matches the published OpenAPI contract, // consistent with the connection service. func (s *BriefService) ensureAvailable() error { - if s.briefs == nil { + // Check every collaborator the service methods dereference, not just briefs: + // in the no-database mode they are all nil together, but guarding only briefs + // would nil-panic if the service were ever partially wired. + if s.briefs == nil || s.campaigns == nil || s.jobs == nil || s.orch == nil { return &briefs.ConnServiceUnavailableError{Code: "503", Message: "brief storage is not configured"} } return nil diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 4cc72243..6362d93d 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -83,11 +83,24 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa for i, p := range platforms { i, p := i, p - g.Go(func() error { + g.Go(func() (rerr error) { // A single platform failure must not cancel the others, so we never // return a non-nil error from the group; failures are recorded. res := platformResult{Platform: string(p)} + // Recover from a panic in a dispatcher (or future code here): a panic + // in this detached goroutine would otherwise crash the whole process + // mid-job. Record it as a platform failure and keep the group intact. + defer func() { + if r := recover(); r != nil { + slog.ErrorContext(gctx, "panic during platform dispatch", "platform", p, "job_id", jobID, "panic", r) + res.OK = false + res.Error = "internal error during dispatch" + results[i] = res + rerr = nil + } + }() + // Idempotency guard FIRST, before resolving the dispatcher: if this // brief already has a campaign for this platform with an upstream id, a // prior run (or a re-POST of create-campaigns) already created the paid @@ -113,7 +126,10 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa return nil } } else if !errors.Is(lerr, domain.ErrNotFound) { - res.Error = "check existing campaign: " + lerr.Error() + // Log the underlying repository error server-side; return a generic + // message so raw DB error text isn't surfaced to clients via GetJob. + slog.ErrorContext(gctx, "existing-campaign lookup failed", "platform", p, "job_id", jobID, "error", lerr) + res.Error = "could not verify existing campaign" results[i] = res return nil } @@ -156,7 +172,10 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa campaign.ProjectID = brief.ProjectID campaign.Platform = p if _, err := o.campaigns.UpsertCampaign(gctx, campaign); err != nil { - res.Error = "persist campaign: " + err.Error() + // Log the raw persistence error; return a generic message so DB + // error text isn't leaked to clients via the job result. + slog.ErrorContext(gctx, "persist campaign failed", "platform", p, "job_id", jobID, "error", err) + res.Error = "could not persist campaign" results[i] = res return nil } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 9f6193e4..5b3fccef 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -339,3 +339,60 @@ func TestOrchestrator_ReusesExistingWhenDispatcherGone(t *testing.T) { t.Errorf("result = %s, want the reused upstream id", j.Result) } } + +// panicDispatcher panics — a misbehaving dispatcher that must not crash the +// process; the orchestrator must record it as a failure. +type panicDispatcher struct{} + +func (panicDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ model.Provider, _ json.RawMessage) (*model.Campaign, error) { + panic("boom in dispatcher") +} + +// TestOrchestrator_RecoversFromDispatcherPanic verifies a panicking dispatcher +// is recovered and recorded as a failure rather than crashing the goroutine. +func TestOrchestrator_RecoversFromDispatcherPanic(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: panicDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + // The panic value must not leak into the client-facing result. + if strings.Contains(string(j.Result), "boom in dispatcher") { + t.Errorf("result leaked the panic value: %s", j.Result) + } +} + +// persistErrCampaignRepo fails UpsertCampaign with a raw DB-like error. +type persistErrCampaignRepo struct{ fakeCampaignRepo } + +func (r *persistErrCampaignRepo) UpsertCampaign(context.Context, *model.Campaign) (*model.Campaign, error) { + return nil, errors.New("pq: duplicate key value violates unique constraint \"campaigns_pkey\"") +} + +// TestOrchestrator_PersistErrorIsSanitized verifies a raw persistence error is +// not surfaced verbatim in the client-facing job result. +func TestOrchestrator_PersistErrorIsSanitized(t *testing.T) { + jobs := newFakeJobRepo() + camps := &persistErrCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: okDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + if strings.Contains(string(j.Result), "pq:") || strings.Contains(string(j.Result), "constraint") { + t.Errorf("result leaked raw DB error: %s", j.Result) + } + if !strings.Contains(string(j.Result), "could not persist campaign") { + t.Errorf("result = %s, want the sanitized message", j.Result) + } +} From bc7531ca3c56e95bf579931b266e4717458c4451 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 17:38:15 -0700 Subject: [PATCH 13/46] =?UTF-8?q?feat(orchestrator):=20durable=20dispatch?= =?UTF-8?q?=20=E2=80=94=20advisory=20lock,=20drain,=20recovery=20(LFXV2-26?= =?UTF-8?q?65,=20PR=20#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements the deferred durable-dispatch work so the two remaining review threads (non-atomic idempotency guard; detached goroutine with no lifecycle owner) are actually closed rather than deferred: - Single-flight per (brief, platform) via a cross-replica Postgres advisory lock (pg_advisory_xact_lock): the idempotency read + upstream create + persist run under the lock, so two concurrent create-campaigns for the same pair can't both create an upstream campaign — the second waits, sees the first's persisted row, and reuses it. Adds CampaignRepository.WithDispatchLock. - Graceful-shutdown draining: the orchestrator tracks in-flight runs with a WaitGroup and Shutdown(ctx) waits (bounded) for them; container.Close drains dispatch before closing the DB pool. Start rejects new work once draining. - Startup recovery: FailStuckJobs fails-forward jobs left queued/running by a prior restart (they can't be safely resumed without provider idempotency keys). Adds JobRepository.FailStuckJobs, called from container init. Tests: dispatch-runs-under-lock, shutdown-drains-in-flight, start-rejected- after-shutdown, fail-stuck-jobs. gen/ regenerated; build/vet/golangci-lint/ okfvalidate/test -race all clean. Closes the residual concurrency + lifecycle gaps tracked in LFXV2-2665. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- docs/knowledge/code/internal-service.md | 8 + docs/knowledge/log.md | 7 + internal/container/container.go | 28 ++- internal/domain/brief_port.go | 11 + .../infrastructure/postgres/campaign_repo.go | 35 +++ internal/infrastructure/postgres/job_repo.go | 15 ++ internal/service/orchestrator.go | 211 +++++++++++------- internal/service/orchestrator_test.go | 139 ++++++++++++ 8 files changed, 371 insertions(+), 83 deletions(-) diff --git a/docs/knowledge/code/internal-service.md b/docs/knowledge/code/internal-service.md index c8993ea5..ba20bef9 100644 --- a/docs/knowledge/code/internal-service.md +++ b/docs/knowledge/code/internal-service.md @@ -26,4 +26,12 @@ failure rather than risking a duplicate. Replacing a brief's content resets it t `draft` (re-approval required). Optimistic concurrency is enforced via version/If-Match (`428` when missing, `412` on mismatch). +Dispatch is durable (LFXV2-2665): each per-platform create runs under a +cross-replica Postgres advisory lock keyed on (brief, platform), so two +concurrent create-campaigns requests cannot both create an upstream campaign. +The orchestrator tracks in-flight runs and its `Shutdown` drains them (bounded) +before the DB pool closes, and on startup non-terminal jobs orphaned by a +restart are failed-forward (they cannot be safely resumed without provider +idempotency keys). + See [internal/service](../../../internal/service). diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index 2880a358..808d5f1f 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -26,6 +26,13 @@ must also be mounted in `server.go`, or its routes 404 despite compiling. **Creation** — Added the `internal/platform/reddit` concept doc for the new Reddit Ads API v3 client (OAuth2 token refresh + Campaign -> Ad Group -> Ad creation) and listed it in the code index. +**Update** — Durable campaign dispatch (LFXV2-2665): per-platform dispatch now +runs under a cross-replica Postgres advisory lock keyed on (brief, platform) so +concurrent create-campaigns can't double-create upstream; the orchestrator +drains in-flight runs on graceful shutdown before the pool closes; and startup +fails-forward jobs left non-terminal by a restart. Added CampaignRepository. +WithDispatchLock and JobRepository.FailStuckJobs. + **Update** — PR #11 review round 3: validate brief_id/campaign_id/job_id path params as UUIDs (400 instead of a PostgreSQL cast 500); make brief approval version-gated via If-Match (rejects approving stale content, 412/428); type the diff --git a/internal/container/container.go b/internal/container/container.go index 7f8b0cba..a16bc1eb 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -25,6 +25,11 @@ import ( // restart it) rather than wedging startup indefinitely. const startupDBTimeout = 15 * time.Second +// dispatchDrainTimeout bounds how long shutdown waits for in-flight campaign +// dispatch to finish before the pool is closed. Kept under the server's overall +// shutdown budget so draining can't outlast the graceful-shutdown window. +const dispatchDrainTimeout = 20 * time.Second + // Container holds all application dependencies. type Container struct { Config *config.Config @@ -33,6 +38,7 @@ type Container struct { Briefs briefsvc.Service pool *postgres.Pool + orch *service.Orchestrator } // NewContainer creates and wires all application dependencies. @@ -107,8 +113,19 @@ func NewContainer(cfg *config.Config) (*Container, error) { slog.Warn("no platform dispatchers registered; campaign creation will record jobs but perform no upstream dispatch") } orch := service.NewOrchestrator(campaignRepo, jobRepo, dispatchers) + c.orch = orch c.Briefs = service.NewBriefService(briefRepo, campaignRepo, jobRepo, orch) + // Recover jobs orphaned by a previous pod's restart: a queued/running job's + // dispatch goroutine lived only in that process, so fail them forward now + // rather than leaving them non-terminal forever. Bounded by the startup + // deadline; a failure here is logged but not fatal (the service can still run). + if n, rerr := jobRepo.FailStuckJobs(startupCtx, "job did not complete before a service restart"); rerr != nil { + slog.Warn("failed to recover stuck jobs on startup", "error", rerr) + } else if n > 0 { + slog.Info("recovered stuck jobs on startup", "count", n) + } + // The health service's readiness depends on the database pool (Readyz). c.Service = service.NewCampaignService(pool) @@ -120,8 +137,17 @@ func NewContainer(cfg *config.Config) (*Container, error) { return c, nil } -// Close releases any resources held by the container. +// Close releases any resources held by the container. It first drains in-flight +// campaign dispatch (bounded) so a dispatch that already created an upstream +// campaign isn't cut off before it persists, THEN closes the database pool. func (c *Container) Close() error { + if c.orch != nil { + drainCtx, cancel := context.WithTimeout(context.Background(), dispatchDrainTimeout) + defer cancel() + if err := c.orch.Shutdown(drainCtx); err != nil { + slog.Warn("timed out draining in-flight dispatch on shutdown", "error", err) + } + } if c.pool != nil { c.pool.Close() } diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index 294887cf..7618bdc6 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -44,6 +44,13 @@ type CampaignReader interface { // ErrNotFound. Used to make dispatch idempotent: a brief already dispatched to // a platform must not create a second upstream (paid) campaign on retry. GetCampaignByPlatform(ctx context.Context, briefID string, platform model.Provider) (*model.Campaign, error) + // WithDispatchLock runs fn while holding a cross-connection (cross-replica) + // advisory lock keyed on (briefID, platform), serializing dispatch for that + // pair so two concurrent create-campaigns requests can't both create an + // upstream campaign. The lock is released when fn returns. fn's error is + // propagated; a failure to acquire the lock returns an error without running + // fn. + WithDispatchLock(ctx context.Context, briefID string, platform model.Provider, fn func(context.Context) error) error } // CampaignWriter mutates campaigns. @@ -70,4 +77,8 @@ type JobRepository interface { // UpdateJobStatus sets a job's status (any JobStatus, e.g. running or a // terminal succeeded/partial/failed) and its result/error. UpdateJobStatus(ctx context.Context, id string, status model.JobStatus, result []byte, jobErr string) error + // FailStuckJobs marks every non-terminal (queued/running) job as failed with + // the given error, returning the count. Called on startup to recover jobs + // orphaned by a pod restart (their in-memory dispatch goroutine is gone). + FailStuckJobs(ctx context.Context, jobErr string) (int64, error) } diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index 76787a3f..b97d824b 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -24,6 +24,41 @@ func NewCampaignRepo(pool *Pool) *CampaignRepo { return &CampaignRepo{db: pool} var _ domain.CampaignRepository = (*CampaignRepo)(nil) +// WithDispatchLock runs fn while holding a transaction-scoped Postgres advisory +// lock keyed on (briefID, platform). pg_advisory_xact_lock blocks until the lock +// is available and releases it automatically when the transaction ends, so it is +// safe against a crashing worker (no orphaned lock). The two-key form derives +// stable int4 keys from hashtext so distinct pairs rarely collide; a rare hash +// collision only serializes two unrelated pairs, which is harmless. +// +// fn runs inside the transaction and receives that transaction's context; the +// idempotency read + upstream create + persist happen under the lock, so two +// concurrent create-campaigns for the same pair cannot both create an upstream +// campaign (cross-replica, since the lock lives in the database). +func (r *CampaignRepo) WithDispatchLock(ctx context.Context, briefID string, platform model.Provider, fn func(context.Context) error) error { + tx, err := r.db.Begin(ctx) + if err != nil { + return fmt.Errorf("begin dispatch-lock tx: %w", err) + } + // Roll back on any early return; a committed tx makes Rollback a no-op. + defer func() { _ = tx.Rollback(ctx) }() + + if _, err := tx.Exec(ctx, + `SELECT pg_advisory_xact_lock(hashtext($1), hashtext($2))`, + briefID, string(platform), + ); err != nil { + return fmt.Errorf("acquire dispatch lock: %w", err) + } + + if err := fn(ctx); err != nil { + return err + } + if err := tx.Commit(ctx); err != nil { + return fmt.Errorf("commit dispatch-lock tx: %w", err) + } + return nil +} + const campaignCols = `id::text, project_id::text, brief_id::text, job_id::text, platform, platform_campaign_id, campaign_name, status, budget_amount, budget_type, start_date, end_date, config_snapshot, result, version, created_at, updated_at` diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index 39d8474d..249f5e2c 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -71,6 +71,21 @@ func (r *JobRepo) UpdateJobStatus(ctx context.Context, id string, status model.J return nil } +// FailStuckJobs marks every non-terminal job as failed. Run once on startup: +// a queued/running job's dispatch goroutine lives only in the process that +// created it, so after a restart such a job would otherwise stay non-terminal +// forever. Fail-forward (rather than resume) because a partially-dispatched job +// cannot be safely re-driven without provider-side idempotency keys. +func (r *JobRepo) FailStuckJobs(ctx context.Context, jobErr string) (int64, error) { + q := `UPDATE campaign_jobs SET status='failed', error=$1, updated_at=now() + WHERE status IN ('queued','running')` + tag, err := r.db.Exec(ctx, q, nullStr(jobErr)) + if err != nil { + return 0, fmt.Errorf("fail stuck jobs: %w", err) + } + return tag.RowsAffected(), nil +} + func scanJob(row pgx.Row) (*model.CampaignJob, error) { var ( j model.CampaignJob diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 6362d93d..ead7b9c5 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -8,9 +8,11 @@ import ( "encoding/json" "errors" "log/slog" + "sync" "golang.org/x/sync/errgroup" + briefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" ) @@ -32,6 +34,14 @@ type Orchestrator struct { campaigns domain.CampaignRepository jobs domain.JobRepository dispatchers map[model.Provider]PlatformDispatcher + + // wg tracks in-flight dispatch runs so Shutdown can wait for them before the + // process (and the DB pool) goes away. mu guards the shutting-down flag so a + // Start racing with Shutdown either registers on wg or is rejected, never + // launches an untracked goroutine after Shutdown has stopped waiting. + mu sync.Mutex + wg sync.WaitGroup + draining bool } // NewOrchestrator constructs an Orchestrator. dispatchers may be empty; a @@ -43,6 +53,29 @@ func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobReposit return &Orchestrator{campaigns: campaigns, jobs: jobs, dispatchers: dispatchers} } +// Shutdown waits (bounded by ctx) for in-flight dispatch runs to finish, so a +// graceful shutdown doesn't close the database pool out from under a dispatch +// that already created an upstream campaign but hasn't persisted it yet. After +// Shutdown is called, Start rejects new work. Returns ctx.Err() if the deadline +// elapses before all runs complete. +func (o *Orchestrator) Shutdown(ctx context.Context) error { + o.mu.Lock() + o.draining = true + o.mu.Unlock() + + done := make(chan struct{}) + go func() { + o.wg.Wait() + close(done) + }() + select { + case <-done: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + // platformResult is the per-platform outcome recorded in the job result. type platformResult struct { Platform string `json:"platform"` @@ -57,13 +90,28 @@ type platformResult struct { // The dispatch goroutine uses context.WithoutCancel so it survives the request // context ending, matching the documented async model. func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, platforms []model.Provider, config json.RawMessage) (string, error) { + // Register the run with the drain WaitGroup under the lock so a concurrent + // Shutdown can't start waiting between the draining check and wg.Add (which + // would let an untracked goroutine outlive Shutdown). + o.mu.Lock() + if o.draining { + o.mu.Unlock() + return "", &briefs.ConnServiceUnavailableError{Code: "503", Message: "service is shutting down; try again"} + } + o.wg.Add(1) + o.mu.Unlock() + job, err := o.jobs.CreateJob(ctx, brief.ID) if err != nil { + o.wg.Done() return "", err } dispatchCtx := context.WithoutCancel(ctx) - go o.run(dispatchCtx, job.ID, brief, platforms, config) + go func() { + defer o.wg.Done() + o.run(dispatchCtx, job.ID, brief, platforms, config) + }() return job.ID, nil } @@ -101,87 +149,7 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa } }() - // Idempotency guard FIRST, before resolving the dispatcher: if this - // brief already has a campaign for this platform with an upstream id, a - // prior run (or a re-POST of create-campaigns) already created the paid - // campaign, so reuse it. This must precede the dispatcher lookup so an - // already-persisted platform is reported ok on retry even if its - // dispatcher is no longer registered. A not-found is the normal - // first-time path; a transient lookup error is recorded as a failure - // rather than risking a duplicate create. - // - // This read-before-dispatch check narrows — but does not fully close — - // the duplicate window: two concurrent create-campaigns requests for the - // same (brief, platform) can both observe not-found and both dispatch. - // The (brief_id, platform) unique index keeps persistence single-rowed, - // but the upstream create is not transactional with it. Fully closing - // this requires provider-side idempotency keys and single-flight job - // ownership, tracked in LFXV2-2665. campaign_id below is always the - // upstream platform id so the field means the same on reuse and create. - if existing, lerr := o.campaigns.GetCampaignByPlatform(gctx, brief.ID, p); lerr == nil { - if existing.PlatformCampaignID != "" { - res.OK = true - res.CampaignID = existing.PlatformCampaignID - results[i] = res - return nil - } - } else if !errors.Is(lerr, domain.ErrNotFound) { - // Log the underlying repository error server-side; return a generic - // message so raw DB error text isn't surfaced to clients via GetJob. - slog.ErrorContext(gctx, "existing-campaign lookup failed", "platform", p, "job_id", jobID, "error", lerr) - res.Error = "could not verify existing campaign" - results[i] = res - return nil - } - - d, ok := o.dispatchers[p] - if !ok { - res.Error = "no dispatcher registered for platform" - results[i] = res - return nil - } - campaign, err := d.Dispatch(gctx, brief, p, config) - if err != nil { - res.Error = err.Error() - results[i] = res - return nil - } - if campaign == nil { - // Defensive: a dispatcher must return a non-nil campaign on success. - // A nil campaign with no error would panic on the ownership stamp - // below (in a detached goroutine); record it as a platform failure. - res.Error = "dispatcher returned no campaign" - results[i] = res - return nil - } - if campaign.PlatformCampaignID == "" { - // A successful dispatch must yield an upstream campaign id; without - // one the result can't honestly be reported ok (campaign_id is - // documented as present when ok), and a later retry couldn't - // recognize it via the idempotency guard. Treat as a failure. - res.Error = "dispatcher returned no upstream campaign id" - results[i] = res - return nil - } - // Stamp ownership before persisting so a dispatcher can't cause a - // campaign to be written with missing/wrong ownership. Set on a - // fresh reference the dispatcher returned; the invariant is one - // campaign per (brief, platform) owned by exactly this job. - campaign.JobID = &jobID - campaign.BriefID = brief.ID - campaign.ProjectID = brief.ProjectID - campaign.Platform = p - if _, err := o.campaigns.UpsertCampaign(gctx, campaign); err != nil { - // Log the raw persistence error; return a generic message so DB - // error text isn't leaked to clients via the job result. - slog.ErrorContext(gctx, "persist campaign failed", "platform", p, "job_id", jobID, "error", err) - res.Error = "could not persist campaign" - results[i] = res - return nil - } - res.OK = true - res.CampaignID = campaign.PlatformCampaignID - results[i] = res + results[i] = o.dispatchPlatform(gctx, jobID, brief, p, config) return nil }) } @@ -209,6 +177,85 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa } } +// dispatchPlatform creates (or reuses) the campaign for a single platform. The +// idempotency read, the upstream create, and the persist all run under a +// cross-replica advisory lock keyed on (brief, platform), so two concurrent +// create-campaigns requests for the same pair cannot both create an upstream +// campaign: the second waits on the lock, then observes the first's persisted +// row and reuses it. campaign_id is always the upstream platform id, so the +// field means the same on the reuse and create paths. +func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief *model.CampaignBrief, p model.Provider, config json.RawMessage) platformResult { + res := platformResult{Platform: string(p)} + + lockErr := o.campaigns.WithDispatchLock(ctx, brief.ID, p, func(ctx context.Context) error { + // Idempotency guard FIRST, before resolving the dispatcher, so an + // already-persisted platform is reported ok even if its dispatcher is no + // longer registered. Under the lock, a concurrent request's persisted row + // is visible here, closing the duplicate-create window. + if existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ID, p); lerr == nil { + if existing.PlatformCampaignID != "" { + res.OK = true + res.CampaignID = existing.PlatformCampaignID + return nil + } + } else if !errors.Is(lerr, domain.ErrNotFound) { + // Log the underlying repository error server-side; return a generic + // message so raw DB error text isn't surfaced to clients via GetJob. + slog.ErrorContext(ctx, "existing-campaign lookup failed", "platform", p, "job_id", jobID, "error", lerr) + res.Error = "could not verify existing campaign" + return nil + } + + d, ok := o.dispatchers[p] + if !ok { + res.Error = "no dispatcher registered for platform" + return nil + } + campaign, err := d.Dispatch(ctx, brief, p, config) + if err != nil { + res.Error = err.Error() + return nil + } + if campaign == nil { + // Defensive: a dispatcher must return a non-nil campaign on success. + res.Error = "dispatcher returned no campaign" + return nil + } + if campaign.PlatformCampaignID == "" { + // A successful dispatch must yield an upstream campaign id; without one + // the result can't honestly be reported ok, and a later retry couldn't + // recognize it via the idempotency guard. Treat as a failure. + res.Error = "dispatcher returned no upstream campaign id" + return nil + } + // Stamp ownership before persisting so a dispatcher can't cause a campaign + // to be written with missing/wrong ownership. + campaign.JobID = &jobID + campaign.BriefID = brief.ID + campaign.ProjectID = brief.ProjectID + campaign.Platform = p + if _, err := o.campaigns.UpsertCampaign(ctx, campaign); err != nil { + // Log the raw persistence error; return a generic message so DB error + // text isn't leaked to clients via the job result. Return the error so + // the advisory-lock transaction rolls back rather than committing after + // a failed write. + slog.ErrorContext(ctx, "persist campaign failed", "platform", p, "job_id", jobID, "error", err) + res.Error = "could not persist campaign" + return err + } + res.OK = true + res.CampaignID = campaign.PlatformCampaignID + return nil + }) + if lockErr != nil && res.Error == "" { + // The lock itself failed (couldn't begin/acquire); record a generic failure. + slog.ErrorContext(ctx, "dispatch lock failed", "platform", p, "job_id", jobID, "error", lockErr) + res.Error = "could not acquire dispatch lock" + res.OK = false + } + return res +} + // aggregateStatus folds per-platform outcomes into the job's terminal status. func aggregateStatus(results []platformResult) model.JobStatus { var ok, failed int diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 5b3fccef..dc90b654 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -57,6 +57,20 @@ func (r *fakeJobRepo) UpdateJobStatus(_ context.Context, id string, status model return nil } +func (r *fakeJobRepo) FailStuckJobs(_ context.Context, jobErr string) (int64, error) { + r.mu.Lock() + defer r.mu.Unlock() + var n int64 + for _, j := range r.jobs { + if j.Status == model.JobQueued || j.Status == model.JobRunning { + j.Status = model.JobFailed + j.Error = jobErr + n++ + } + } + return n, nil +} + // fakeCampaignRepo records upserted campaigns. type fakeCampaignRepo struct { mu sync.Mutex @@ -84,6 +98,11 @@ func (r *fakeCampaignRepo) GetCampaignByPlatform(_ context.Context, briefID stri } return nil, domain.ErrNotFound } +func (r *fakeCampaignRepo) WithDispatchLock(ctx context.Context, _ string, _ model.Provider, fn func(context.Context) error) error { + // No real lock in tests; just run fn. Serialization is exercised separately. + return fn(ctx) +} + func (r *fakeCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { r.mu.Lock() defer r.mu.Unlock() @@ -396,3 +415,123 @@ func TestOrchestrator_PersistErrorIsSanitized(t *testing.T) { t.Errorf("result = %s, want the sanitized message", j.Result) } } + +// lockCountingCampaignRepo records that WithDispatchLock wrapped the dispatch. +type lockCountingCampaignRepo struct { + fakeCampaignRepo + mu sync.Mutex + locks int +} + +func (r *lockCountingCampaignRepo) WithDispatchLock(ctx context.Context, briefID string, p model.Provider, fn func(context.Context) error) error { + r.mu.Lock() + r.locks++ + r.mu.Unlock() + return fn(ctx) +} + +// TestOrchestrator_DispatchRunsUnderLock verifies dispatch is wrapped in the +// (brief, platform) advisory lock. +func TestOrchestrator_DispatchRunsUnderLock(t *testing.T) { + jobs := newFakeJobRepo() + camps := &lockCountingCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: okDispatcher{}, + model.ProviderLinkedInAds: okDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + waitForTerminal(t, jobs, id) + camps.mu.Lock() + defer camps.mu.Unlock() + if camps.locks != 2 { + t.Errorf("WithDispatchLock called %d times, want 2 (one per platform)", camps.locks) + } +} + +// blockingDispatcher blocks until released, to test shutdown draining. +type blockingDispatcher struct { + started chan struct{} + release chan struct{} +} + +func (d *blockingDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + close(d.started) + <-d.release + return &model.Campaign{PlatformCampaignID: "pc-" + string(p), Status: "active", CampaignName: "n"}, nil +} + +// TestOrchestrator_ShutdownDrainsInFlight verifies Shutdown waits for an +// in-flight dispatch to finish before returning. +func TestOrchestrator_ShutdownDrainsInFlight(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + disp := &blockingDispatcher{started: make(chan struct{}), release: make(chan struct{})} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: disp, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + <-disp.started // dispatch is now in-flight + + shutdownReturned := make(chan error, 1) + go func() { + shutdownReturned <- orch.Shutdown(context.Background()) + }() + + // Shutdown must NOT return while the dispatch is blocked. + select { + case <-shutdownReturned: + t.Fatal("Shutdown returned before in-flight dispatch finished") + case <-time.After(50 * time.Millisecond): + } + + close(disp.release) // let dispatch complete + select { + case err := <-shutdownReturned: + if err != nil { + t.Errorf("Shutdown err = %v, want nil", err) + } + case <-time.After(2 * time.Second): + t.Fatal("Shutdown did not return after dispatch completed") + } +} + +// TestOrchestrator_StartRejectedAfterShutdown verifies Start refuses new work +// once Shutdown has been initiated. +func TestOrchestrator_StartRejectedAfterShutdown(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: okDispatcher{}, + }) + if err := orch.Shutdown(context.Background()); err != nil { + t.Fatalf("Shutdown: %v", err) + } + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + if _, err := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil); err == nil { + t.Fatal("expected Start to be rejected after Shutdown") + } +} + +// TestFailStuckJobs verifies the recovery scan fails only non-terminal jobs. +func TestFailStuckJobs(t *testing.T) { + jobs := newFakeJobRepo() + jobs.jobs["j-queued"] = &model.CampaignJob{ID: "j-queued", Status: model.JobQueued} + jobs.jobs["j-running"] = &model.CampaignJob{ID: "j-running", Status: model.JobRunning} + jobs.jobs["j-done"] = &model.CampaignJob{ID: "j-done", Status: model.JobSucceeded} + + n, err := jobs.FailStuckJobs(context.Background(), "restarted") + if err != nil { + t.Fatalf("FailStuckJobs: %v", err) + } + if n != 2 { + t.Errorf("failed %d jobs, want 2 (queued+running)", n) + } + if jobs.jobs["j-done"].Status != model.JobSucceeded { + t.Errorf("terminal job was altered: %s", jobs.jobs["j-done"].Status) + } + if jobs.jobs["j-queued"].Status != model.JobFailed || jobs.jobs["j-running"].Status != model.JobFailed { + t.Error("non-terminal jobs were not failed") + } +} From c397ec76c24ffdee5b5bcb36e63f1c1dadd332ef Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 17:49:38 -0700 Subject: [PATCH 14/46] =?UTF-8?q?fix(review):=20round-6=20Copilot=20findin?= =?UTF-8?q?gs=20=E2=80=94=20lock=20correctness,=20recovery=20safety,=20ETa?= =?UTF-8?q?g,=20config,=20sanitization=20(PR=20#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrects two real bugs in the LFXV2-2665 implementation plus several review items: - WithDispatchLock: the previous transaction-scoped lock ran fn's repo calls on a DIFFERENT pool connection than the one holding the lock (deadlock risk on a small pool; lock didn't actually cover the reads). Reworked to a SESSION-level advisory lock on a dedicated acquired connection, held for fn's whole duration and released explicitly (background ctx) even on panic. - FailStuckJobs: only fails non-terminal jobs idle longer than staleJobCutoff (15m), so a rolling deploy can't fail a job the old replica is still actively dispatching. - mapBriefErr preserves already-typed briefs errors (e.g. the orchestrator's shutdown 503) instead of flattening them to 500. - Sanitize the dispatcher error in the job result (log raw server-side, store a stable client-safe message) so provider error detail/credentials aren't exposed via GetJob, matching the persistence/panic paths. - parseBriefIfMatch accepts a quoted entity-tag (`"3"`) and weak tag (`W/"3"`), not just a bare integer (RFC 7232). - UpdateCampaign no longer wipes the stored config when the optional config is omitted on a name/status-only edit. - Corrected the debug.HTTP() comment (it marks the debug context; it does not log payloads) and made approve-brief reuse ifMatchAttr so the generated CLI example is a valid numeric If-Match. Tests: quoted/weak ETag parsing, config-preserved-on-omit. gen/ regenerated; build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 9 +- .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 185 +++++++++--------- cmd/campaign-service/server.go | 2 - design/brief.go | 5 +- gen/http/cli/lfx_v2_campaign_service/cli.go | 8 +- .../client/cli.go | 2 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 9 +- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 185 +++++++++--------- gen/lfx_v2_campaign_service_briefs/service.go | 2 +- .../infrastructure/postgres/campaign_repo.go | 64 +++--- internal/infrastructure/postgres/job_repo.go | 29 ++- internal/service/brief.go | 34 +++- internal/service/brief_test.go | 72 +++++++ internal/service/orchestrator.go | 6 +- 18 files changed, 381 insertions(+), 239 deletions(-) diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index 99f5aa82..2c0d48c6 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index 0183e3c1..f0a63ca4 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -367,7 +367,7 @@ paths: type: string - name: If-Match in: header - description: Version being approved (ETag); approval is rejected if the brief changed + description: If-Match header carrying the current ETag/version required: false type: string responses: @@ -4131,10 +4131,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Adipisci consequuntur omnis a. + config: Et exercitationem soluta possimus a aliquid. platforms: - - reddit-ads - - meta-ads + - microsoft-ads + - twitter-ads + - google-ads - google-ads required: - input diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index cb7b24d5..099f11a8 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Magnam veniam atque labore qui.","platforms":["Architecto dolorem sapiente repellendus aut.","Veritatis sint autem necessitatibus deleniti itaque.","Magnam dolorum voluptatem modi velit."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Ullam pariatur ex voluptas aspernatur.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Voluptates aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index 1b0a6147..41282d2c 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -146,9 +146,9 @@ paths: schema: type: string description: Brief UUID - example: b6261fa8-da11-47f0-b13d-8ff0dc6aaffd + example: b6261fa8-da85-4670-81bb-f0aa10d65871 format: uuid - example: 52ae4742-df9c-4ce6-ab10-c9bd7ccebd74 + example: 4d147ddb-fca6-489e-a2a8-78921eadc560 responses: "204": description: No Content response. @@ -482,13 +482,13 @@ paths: example: 78a49884-958d-4ef7-99b9-e60dab3c1338 - name: If-Match in: header - description: Version being approved (ETag); approval is rejected if the brief changed + description: If-Match header carrying the current ETag/version allowEmptyValue: true schema: type: string - description: Version being approved (ETag); approval is rejected if the brief changed - example: Qui inventore. - example: Ducimus ut adipisci est laboriosam. + description: If-Match header carrying the current ETag/version + example: "3" + example: "3" responses: "200": description: OK response. @@ -498,29 +498,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sunt cum ut. - example: Omnis rerum. + example: Qui inventore. + example: Sunt cum ut. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Error necessitatibus et autem doloribus est. - event_details: Similique odio adipisci dolore iste. - event_slug: Quo culpa. - id: Sit ex commodi sapiente a illum. - keywords: Maxime labore illo maxime provident. + copy: Similique odio adipisci dolore iste. + event_details: Error laudantium. + event_slug: Dolorem autem ipsa autem provident est. + id: Pariatur voluptas odit fuga illo. + keywords: Error necessitatibus et autem doloribus est. platforms: - - Sint suscipit iste eveniet laudantium rerum. + - Et odio tenetur optio in ut sint. + - Iste eveniet laudantium rerum. - Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - Nostrum dolorum iure eaque animi. - - Error laudantium. - program_type: Dolorem autem ipsa autem provident est. - project_id: Numquam quia. - status: draft - targeting: Repudiandae voluptatem vitae iste maxime modi laborum. - url: Quis et odio tenetur optio. - version: 8367189057804003789 + program_type: Numquam quia. + project_id: Sit ex commodi sapiente a illum. + status: archived + targeting: Maxime labore illo maxime provident. + url: Quo culpa. + version: 8076581276173981715 "400": description: 'BadRequest: Bad request' content: @@ -610,9 +610,9 @@ paths: schema: type: string description: Brief UUID - example: 7509879d-b17a-46bc-8080-88e3691c2522 + example: d76e3514-7f04-404b-85c1-c9dd589109e7 format: uuid - example: 8a223dd4-35ee-4368-99ff-2fcd89c1cc01 + example: cc88b92c-5d67-435b-9340-3a62f5a9bab0 requestBody: required: true content: @@ -621,10 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Adipisci consequuntur omnis a. + config: Et exercitationem soluta possimus a aliquid. platforms: - - reddit-ads - - meta-ads + - microsoft-ads + - twitter-ads + - google-ads - google-ads responses: "202": @@ -634,12 +635,11 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Corporis architecto. + job_id: Magnam veniam atque labore qui. platforms: - - Aut natus. - - Sint autem. - - Deleniti itaque voluptas magnam. - - Voluptatem modi velit vitae optio ut. + - Architecto dolorem sapiente repellendus aut. + - Veritatis sint autem necessitatibus deleniti itaque. + - Magnam dolorum voluptatem modi velit. status: queued "400": description: 'BadRequest: Bad request' @@ -712,9 +712,9 @@ paths: schema: type: string description: Brief UUID - example: 8195f930-c608-4657-a663-c7fb3bbbcc1f + example: 23c306fc-2672-44e3-a360-393f7d48f1dd format: uuid - example: 37f4e508-72cb-404c-b000-62333f1be4ef + example: 6e627787-92a4-43ee-8c98-6b97ec8af1e5 - name: campaign_id in: path description: Campaign UUID @@ -722,9 +722,9 @@ paths: schema: type: string description: Campaign UUID - example: adfc99b5-eeb9-46c5-864a-a5348085e060 + example: f41342df-fae6-4961-b9b7-6a3dde13126b format: uuid - example: e29e4478-4e55-4995-ba2d-1e20a74f91aa + example: dd6598b8-8da5-472a-bcbb-2d8f068036bc responses: "200": description: OK response. @@ -734,8 +734,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Labore excepturi quibusdam. - example: Saepe optio quas qui consequatur cumque. + example: Debitis quis quidem quam corrupti. + example: Voluptatem labore excepturi quibusdam iure. content: application/json: schema: @@ -743,10 +743,10 @@ paths: example: brief_id: Recusandae aut perferendis. campaign_name: Corporis ut non. - id: Voluptas aspernatur aperiam. + id: Ullam pariatur ex voluptas aspernatur. platform: Est eaque ipsam harum nisi nobis. platform_campaign_id: Et eveniet. - project_id: Aliquam vero ducimus. + project_id: Voluptates aliquam vero ducimus. status: Eius sed qui deserunt perspiciatis nihil. version: 5441532063507194963 "400": @@ -819,9 +819,9 @@ paths: schema: type: string description: Brief UUID - example: 1d638e35-bc0b-4c2e-ab43-ab65a6a17f35 + example: 8a332b11-4d31-48bf-8c47-17384ebd6445 format: uuid - example: e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a + example: 05ce6f1f-49a7-45ce-9c2c-c1a771a99cab - name: campaign_id in: path description: Campaign UUID @@ -829,9 +829,9 @@ paths: schema: type: string description: Campaign UUID - example: 879d577b-fd07-4d30-a031-6f7df870ad66 + example: 66025a18-b20e-4a9f-b7ee-db46d0219499 format: uuid - example: 24ce19fe-6f4a-48ff-b8c2-d78990409795 + example: d0f0d2ab-d9dd-445b-bce5-1c29e2186349 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -861,8 +861,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Magni qui veniam architecto deleniti adipisci. - example: Ad dignissimos sit. + example: Molestiae qui nihil. + example: Ut facere magni qui veniam architecto. content: application/json: schema: @@ -1015,8 +1015,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel sint nisi laborum laboriosam assumenda sed. - example: Ipsam quia ut quibusdam et. + example: Delectus voluptatem rerum et dolorum. + example: Quasi vel sint nisi laborum laboriosam assumenda. content: application/json: schema: @@ -1100,8 +1100,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Possimus eum aut delectus voluptatem rerum. - example: Commodi repudiandae sequi aperiam. + example: Porro eaque dolorem. + example: Sunt dolorum possimus eum. content: application/json: schema: @@ -1198,8 +1198,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel delectus molestias qui magnam. - example: Ipsum ullam quis est incidunt debitis qui. + example: Et non et. + example: Delectus vel. content: application/json: schema: @@ -1469,8 +1469,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Blanditiis inventore similique est. - example: Possimus qui. + example: Voluptatum explicabo vero repudiandae temporibus ut. + example: Est hic enim similique et eveniet vel. content: application/json: schema: @@ -1557,8 +1557,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatum explicabo vero repudiandae temporibus ut. - example: Est hic enim similique et eveniet vel. + example: Ex quis molestias nam quia facilis. + example: Deserunt earum saepe repellat. content: application/json: schema: @@ -1661,8 +1661,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Reprehenderit eius distinctio voluptatum. - example: Voluptatibus sunt. + example: Blanditiis inventore similique est. + example: Possimus qui. content: application/json: schema: @@ -1932,8 +1932,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quia sequi consequatur aut dolorem. - example: Necessitatibus quam. + example: Aspernatur enim perferendis. + example: Soluta porro distinctio cupiditate. content: application/json: schema: @@ -2014,8 +2014,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aspernatur enim perferendis. - example: Soluta porro distinctio cupiditate. + example: Molestias qui magnam impedit modi. + example: Ipsum ullam quis est incidunt debitis qui. content: application/json: schema: @@ -2112,8 +2112,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Omnis ipsam ad sed laudantium ut ea. - example: Ad a et inventore tempora facilis dolores. + example: Quia sequi consequatur aut dolorem. + example: Necessitatibus quam. content: application/json: schema: @@ -2380,8 +2380,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus ratione. - example: Amet quam consequuntur nulla quaerat. + example: Aut maiores ea omnis quia quas. + example: Sunt odit molestiae ab praesentium enim. content: application/json: schema: @@ -2465,8 +2465,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut maiores ea omnis quia quas. - example: Sunt odit molestiae ab praesentium enim. + example: Omnis ipsam ad sed laudantium ut ea. + example: Ad a et inventore tempora facilis dolores. content: application/json: schema: @@ -2565,8 +2565,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Iure tempora non ea facilis nihil eius. - example: Corporis nesciunt ipsam voluptates magnam atque. + example: Natus ratione. + example: Amet quam consequuntur nulla quaerat. content: application/json: schema: @@ -2835,8 +2835,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut mollitia. - example: Pariatur ratione blanditiis. + example: Quidem est. + example: Corporis deserunt quae. content: application/json: schema: @@ -2920,8 +2920,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quidem est. - example: Corporis deserunt quae. + example: Sint expedita fugit iste nemo voluptas. + example: Fugit unde ea quis. content: application/json: schema: @@ -3018,8 +3018,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ex quis molestias nam quia facilis. - example: Deserunt earum saepe repellat. + example: Aut mollitia. + example: Pariatur ratione blanditiis. content: application/json: schema: @@ -3289,8 +3289,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut enim. - example: Voluptas a natus est dolor voluptatum. + example: Consequatur beatae. + example: Totam dolorem. content: application/json: schema: @@ -3371,8 +3371,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur beatae. - example: Totam dolorem. + example: Iure tempora non ea facilis nihil eius. + example: Corporis nesciunt ipsam voluptates magnam atque. content: application/json: schema: @@ -3467,8 +3467,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit dignissimos est. - example: Harum esse. + example: Aut enim. + example: Voluptas a natus est dolor voluptatum. content: application/json: schema: @@ -3736,8 +3736,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatibus ut. - example: Fugit nostrum rerum. + example: Odio autem perferendis accusamus nulla placeat aut. + example: Aliquid quia natus. content: application/json: schema: @@ -3821,8 +3821,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Odio autem perferendis accusamus nulla placeat aut. - example: Aliquid quia natus. + example: Sit dignissimos est. + example: Harum esse. content: application/json: schema: @@ -3919,8 +3919,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sint expedita fugit iste nemo voluptas. - example: Fugit unde ea quis. + example: Voluptatibus ut. + example: Fugit nostrum rerum. content: application/json: schema: @@ -4140,9 +4140,9 @@ paths: schema: type: string description: Job UUID - example: 126427cd-77bf-4d47-8ce7-9c23b3694a22 + example: 79c02b27-dc40-4b89-9073-64a5596694c3 format: uuid - example: f1fa4e30-2659-4090-9083-cfac42b3b0b1 + example: 52112f6b-ba24-497d-8dd7-e7c129c8add5 responses: "200": description: OK response. @@ -4989,10 +4989,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Adipisci consequuntur omnis a. + config: Et exercitationem soluta possimus a aliquid. platforms: - - reddit-ads - - meta-ads + - microsoft-ads + - twitter-ads + - google-ads - google-ads required: - input diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 4f657680..27d8c9f3 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -39,8 +39,6 @@ func StartServer(ctx context.Context, cfg *config.Config) error { return err } - // NOTE: debug.LogPayloads() is intentionally NOT applied. Every authenticated - // payload carries a BearerToken (a valid JWT), and the connection service's // create/set-credential payloads carry plaintext provider credentials (OAuth // refresh tokens, client secrets), so enabling it would leak those secrets // into logs. debug.HTTP() IS still applied below, but in clue v1.2.1 it does diff --git a/design/brief.go b/design/brief.go index 84003fb3..949c5730 100644 --- a/design/brief.go +++ b/design/brief.go @@ -193,7 +193,10 @@ var _ = Service("lfx-v2-campaign-service-briefs", func() { bearerToken() projectIDAttr() briefIDAttr() - Attribute("if_match", String, "Version being approved (ETag); approval is rejected if the brief changed") + // Reuse the shared If-Match attribute (carries Example("3")) so Goa + // generates a valid numeric CLI example instead of a prose placeholder + // that parseBriefIfMatch would reject. + ifMatchAttr() Required("project_id", "brief_id") }) Result(Brief) diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index 10017f7a..474d1ad7 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -882,7 +882,7 @@ func lfxV2CampaignServiceBriefsApproveBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"91872672-ab36-4453-a7d4-69973cfe0c1f\" --bearer-token \"eyJhbGci...\" --if-match \"Voluptatem doloremque consequatur deleniti.\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"91872672-ab36-4453-a7d4-69973cfe0c1f\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsDeleteBriefUsage() { @@ -904,7 +904,7 @@ func lfxV2CampaignServiceBriefsDeleteBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"20b26aa7-5f88-4b2d-9499-ce300dcd9cfb\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"3c8dfdd8-d7e4-4234-aa6b-bdf91739de5f\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { @@ -928,7 +928,7 @@ func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Adipisci consequuntur omnis a.\",\n \"platforms\": [\n \"reddit-ads\",\n \"meta-ads\",\n \"google-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"573e8048-aec7-40df-b549-3aef92a9ab18\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Et exercitationem soluta possimus a aliquid.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\",\n \"google-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"2bc32a4b-b934-4688-9631-d7caf5f559c6\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetCampaignUsage() { @@ -952,7 +952,7 @@ func lfxV2CampaignServiceBriefsGetCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"31d1d48d-eb06-4aa8-ad40-96fc5692c038\" --campaign-id \"2737989f-c758-47d8-96c2-994234417827\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"d144236c-9d18-4288-b0b2-5deae43e90e2\" --campaign-id \"e95d6c4f-dfbc-4182-aa9c-8445792b196a\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go index 60fefdc2..b8a96d4c 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -220,7 +220,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Adipisci consequuntur omnis a.\",\n \"platforms\": [\n \"reddit-ads\",\n \"meta-ads\",\n \"google-ads\"\n ]\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Et exercitationem soluta possimus a aliquid.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\",\n \"google-ads\"\n ]\n }\n }'") } if body.Input == nil { err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 99f5aa82..2c0d48c6 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 0183e3c1..f0a63ca4 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -367,7 +367,7 @@ paths: type: string - name: If-Match in: header - description: Version being approved (ETag); approval is rejected if the brief changed + description: If-Match header carrying the current ETag/version required: false type: string responses: @@ -4131,10 +4131,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Adipisci consequuntur omnis a. + config: Et exercitationem soluta possimus a aliquid. platforms: - - reddit-ads - - meta-ads + - microsoft-ads + - twitter-ads + - google-ads - google-ads required: - input diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index cb7b24d5..099f11a8 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da11-47f0-b13d-8ff0dc6aaffd","format":"uuid"},"example":"52ae4742-df9c-4ce6-ab10-c9bd7ccebd74"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"Version being approved (ETag); approval is rejected if the brief changed","allowEmptyValue":true,"schema":{"type":"string","description":"Version being approved (ETag); approval is rejected if the brief changed","example":"Qui inventore."},"example":"Ducimus ut adipisci est laboriosam."}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt cum ut."},"example":"Omnis rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Error necessitatibus et autem doloribus est.","event_details":"Similique odio adipisci dolore iste.","event_slug":"Quo culpa.","id":"Sit ex commodi sapiente a illum.","keywords":"Maxime labore illo maxime provident.","platforms":["Sint suscipit iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi.","Error laudantium."],"program_type":"Dolorem autem ipsa autem provident est.","project_id":"Numquam quia.","status":"draft","targeting":"Repudiandae voluptatem vitae iste maxime modi laborum.","url":"Quis et odio tenetur optio.","version":8367189057804003789}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7509879d-b17a-46bc-8080-88e3691c2522","format":"uuid"},"example":"8a223dd4-35ee-4368-99ff-2fcd89c1cc01"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Corporis architecto.","platforms":["Aut natus.","Sint autem.","Deleniti itaque voluptas magnam.","Voluptatem modi velit vitae optio ut."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8195f930-c608-4657-a663-c7fb3bbbcc1f","format":"uuid"},"example":"37f4e508-72cb-404c-b000-62333f1be4ef"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"adfc99b5-eeb9-46c5-864a-a5348085e060","format":"uuid"},"example":"e29e4478-4e55-4995-ba2d-1e20a74f91aa"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Labore excepturi quibusdam."},"example":"Saepe optio quas qui consequatur cumque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Voluptas aspernatur aperiam.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"1d638e35-bc0b-4c2e-ab43-ab65a6a17f35","format":"uuid"},"example":"e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"879d577b-fd07-4d30-a031-6f7df870ad66","format":"uuid"},"example":"24ce19fe-6f4a-48ff-b8c2-d78990409795"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Magni qui veniam architecto deleniti adipisci."},"example":"Ad dignissimos sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel sint nisi laborum laboriosam assumenda sed."},"example":"Ipsam quia ut quibusdam et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Possimus eum aut delectus voluptatem rerum."},"example":"Commodi repudiandae sequi aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Vel delectus molestias qui magnam."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Reprehenderit eius distinctio voluptatum."},"example":"Voluptatibus sunt."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"126427cd-77bf-4d47-8ce7-9c23b3694a22","format":"uuid"},"example":"f1fa4e30-2659-4090-9083-cfac42b3b0b1"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Adipisci consequuntur omnis a.","platforms":["reddit-ads","meta-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Magnam veniam atque labore qui.","platforms":["Architecto dolorem sapiente repellendus aut.","Veritatis sint autem necessitatibus deleniti itaque.","Magnam dolorum voluptatem modi velit."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Ullam pariatur ex voluptas aspernatur.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Voluptates aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 1b0a6147..41282d2c 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -146,9 +146,9 @@ paths: schema: type: string description: Brief UUID - example: b6261fa8-da11-47f0-b13d-8ff0dc6aaffd + example: b6261fa8-da85-4670-81bb-f0aa10d65871 format: uuid - example: 52ae4742-df9c-4ce6-ab10-c9bd7ccebd74 + example: 4d147ddb-fca6-489e-a2a8-78921eadc560 responses: "204": description: No Content response. @@ -482,13 +482,13 @@ paths: example: 78a49884-958d-4ef7-99b9-e60dab3c1338 - name: If-Match in: header - description: Version being approved (ETag); approval is rejected if the brief changed + description: If-Match header carrying the current ETag/version allowEmptyValue: true schema: type: string - description: Version being approved (ETag); approval is rejected if the brief changed - example: Qui inventore. - example: Ducimus ut adipisci est laboriosam. + description: If-Match header carrying the current ETag/version + example: "3" + example: "3" responses: "200": description: OK response. @@ -498,29 +498,29 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sunt cum ut. - example: Omnis rerum. + example: Qui inventore. + example: Sunt cum ut. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Error necessitatibus et autem doloribus est. - event_details: Similique odio adipisci dolore iste. - event_slug: Quo culpa. - id: Sit ex commodi sapiente a illum. - keywords: Maxime labore illo maxime provident. + copy: Similique odio adipisci dolore iste. + event_details: Error laudantium. + event_slug: Dolorem autem ipsa autem provident est. + id: Pariatur voluptas odit fuga illo. + keywords: Error necessitatibus et autem doloribus est. platforms: - - Sint suscipit iste eveniet laudantium rerum. + - Et odio tenetur optio in ut sint. + - Iste eveniet laudantium rerum. - Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - Nostrum dolorum iure eaque animi. - - Error laudantium. - program_type: Dolorem autem ipsa autem provident est. - project_id: Numquam quia. - status: draft - targeting: Repudiandae voluptatem vitae iste maxime modi laborum. - url: Quis et odio tenetur optio. - version: 8367189057804003789 + program_type: Numquam quia. + project_id: Sit ex commodi sapiente a illum. + status: archived + targeting: Maxime labore illo maxime provident. + url: Quo culpa. + version: 8076581276173981715 "400": description: 'BadRequest: Bad request' content: @@ -610,9 +610,9 @@ paths: schema: type: string description: Brief UUID - example: 7509879d-b17a-46bc-8080-88e3691c2522 + example: d76e3514-7f04-404b-85c1-c9dd589109e7 format: uuid - example: 8a223dd4-35ee-4368-99ff-2fcd89c1cc01 + example: cc88b92c-5d67-435b-9340-3a62f5a9bab0 requestBody: required: true content: @@ -621,10 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Adipisci consequuntur omnis a. + config: Et exercitationem soluta possimus a aliquid. platforms: - - reddit-ads - - meta-ads + - microsoft-ads + - twitter-ads + - google-ads - google-ads responses: "202": @@ -634,12 +635,11 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Corporis architecto. + job_id: Magnam veniam atque labore qui. platforms: - - Aut natus. - - Sint autem. - - Deleniti itaque voluptas magnam. - - Voluptatem modi velit vitae optio ut. + - Architecto dolorem sapiente repellendus aut. + - Veritatis sint autem necessitatibus deleniti itaque. + - Magnam dolorum voluptatem modi velit. status: queued "400": description: 'BadRequest: Bad request' @@ -712,9 +712,9 @@ paths: schema: type: string description: Brief UUID - example: 8195f930-c608-4657-a663-c7fb3bbbcc1f + example: 23c306fc-2672-44e3-a360-393f7d48f1dd format: uuid - example: 37f4e508-72cb-404c-b000-62333f1be4ef + example: 6e627787-92a4-43ee-8c98-6b97ec8af1e5 - name: campaign_id in: path description: Campaign UUID @@ -722,9 +722,9 @@ paths: schema: type: string description: Campaign UUID - example: adfc99b5-eeb9-46c5-864a-a5348085e060 + example: f41342df-fae6-4961-b9b7-6a3dde13126b format: uuid - example: e29e4478-4e55-4995-ba2d-1e20a74f91aa + example: dd6598b8-8da5-472a-bcbb-2d8f068036bc responses: "200": description: OK response. @@ -734,8 +734,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Labore excepturi quibusdam. - example: Saepe optio quas qui consequatur cumque. + example: Debitis quis quidem quam corrupti. + example: Voluptatem labore excepturi quibusdam iure. content: application/json: schema: @@ -743,10 +743,10 @@ paths: example: brief_id: Recusandae aut perferendis. campaign_name: Corporis ut non. - id: Voluptas aspernatur aperiam. + id: Ullam pariatur ex voluptas aspernatur. platform: Est eaque ipsam harum nisi nobis. platform_campaign_id: Et eveniet. - project_id: Aliquam vero ducimus. + project_id: Voluptates aliquam vero ducimus. status: Eius sed qui deserunt perspiciatis nihil. version: 5441532063507194963 "400": @@ -819,9 +819,9 @@ paths: schema: type: string description: Brief UUID - example: 1d638e35-bc0b-4c2e-ab43-ab65a6a17f35 + example: 8a332b11-4d31-48bf-8c47-17384ebd6445 format: uuid - example: e86d06d5-dfcb-40ce-9e2c-72e4ad0bb01a + example: 05ce6f1f-49a7-45ce-9c2c-c1a771a99cab - name: campaign_id in: path description: Campaign UUID @@ -829,9 +829,9 @@ paths: schema: type: string description: Campaign UUID - example: 879d577b-fd07-4d30-a031-6f7df870ad66 + example: 66025a18-b20e-4a9f-b7ee-db46d0219499 format: uuid - example: 24ce19fe-6f4a-48ff-b8c2-d78990409795 + example: d0f0d2ab-d9dd-445b-bce5-1c29e2186349 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -861,8 +861,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Magni qui veniam architecto deleniti adipisci. - example: Ad dignissimos sit. + example: Molestiae qui nihil. + example: Ut facere magni qui veniam architecto. content: application/json: schema: @@ -1015,8 +1015,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel sint nisi laborum laboriosam assumenda sed. - example: Ipsam quia ut quibusdam et. + example: Delectus voluptatem rerum et dolorum. + example: Quasi vel sint nisi laborum laboriosam assumenda. content: application/json: schema: @@ -1100,8 +1100,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Possimus eum aut delectus voluptatem rerum. - example: Commodi repudiandae sequi aperiam. + example: Porro eaque dolorem. + example: Sunt dolorum possimus eum. content: application/json: schema: @@ -1198,8 +1198,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Vel delectus molestias qui magnam. - example: Ipsum ullam quis est incidunt debitis qui. + example: Et non et. + example: Delectus vel. content: application/json: schema: @@ -1469,8 +1469,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Blanditiis inventore similique est. - example: Possimus qui. + example: Voluptatum explicabo vero repudiandae temporibus ut. + example: Est hic enim similique et eveniet vel. content: application/json: schema: @@ -1557,8 +1557,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatum explicabo vero repudiandae temporibus ut. - example: Est hic enim similique et eveniet vel. + example: Ex quis molestias nam quia facilis. + example: Deserunt earum saepe repellat. content: application/json: schema: @@ -1661,8 +1661,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Reprehenderit eius distinctio voluptatum. - example: Voluptatibus sunt. + example: Blanditiis inventore similique est. + example: Possimus qui. content: application/json: schema: @@ -1932,8 +1932,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quia sequi consequatur aut dolorem. - example: Necessitatibus quam. + example: Aspernatur enim perferendis. + example: Soluta porro distinctio cupiditate. content: application/json: schema: @@ -2014,8 +2014,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aspernatur enim perferendis. - example: Soluta porro distinctio cupiditate. + example: Molestias qui magnam impedit modi. + example: Ipsum ullam quis est incidunt debitis qui. content: application/json: schema: @@ -2112,8 +2112,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Omnis ipsam ad sed laudantium ut ea. - example: Ad a et inventore tempora facilis dolores. + example: Quia sequi consequatur aut dolorem. + example: Necessitatibus quam. content: application/json: schema: @@ -2380,8 +2380,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus ratione. - example: Amet quam consequuntur nulla quaerat. + example: Aut maiores ea omnis quia quas. + example: Sunt odit molestiae ab praesentium enim. content: application/json: schema: @@ -2465,8 +2465,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut maiores ea omnis quia quas. - example: Sunt odit molestiae ab praesentium enim. + example: Omnis ipsam ad sed laudantium ut ea. + example: Ad a et inventore tempora facilis dolores. content: application/json: schema: @@ -2565,8 +2565,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Iure tempora non ea facilis nihil eius. - example: Corporis nesciunt ipsam voluptates magnam atque. + example: Natus ratione. + example: Amet quam consequuntur nulla quaerat. content: application/json: schema: @@ -2835,8 +2835,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut mollitia. - example: Pariatur ratione blanditiis. + example: Quidem est. + example: Corporis deserunt quae. content: application/json: schema: @@ -2920,8 +2920,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quidem est. - example: Corporis deserunt quae. + example: Sint expedita fugit iste nemo voluptas. + example: Fugit unde ea quis. content: application/json: schema: @@ -3018,8 +3018,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ex quis molestias nam quia facilis. - example: Deserunt earum saepe repellat. + example: Aut mollitia. + example: Pariatur ratione blanditiis. content: application/json: schema: @@ -3289,8 +3289,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut enim. - example: Voluptas a natus est dolor voluptatum. + example: Consequatur beatae. + example: Totam dolorem. content: application/json: schema: @@ -3371,8 +3371,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur beatae. - example: Totam dolorem. + example: Iure tempora non ea facilis nihil eius. + example: Corporis nesciunt ipsam voluptates magnam atque. content: application/json: schema: @@ -3467,8 +3467,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit dignissimos est. - example: Harum esse. + example: Aut enim. + example: Voluptas a natus est dolor voluptatum. content: application/json: schema: @@ -3736,8 +3736,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatibus ut. - example: Fugit nostrum rerum. + example: Odio autem perferendis accusamus nulla placeat aut. + example: Aliquid quia natus. content: application/json: schema: @@ -3821,8 +3821,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Odio autem perferendis accusamus nulla placeat aut. - example: Aliquid quia natus. + example: Sit dignissimos est. + example: Harum esse. content: application/json: schema: @@ -3919,8 +3919,8 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sint expedita fugit iste nemo voluptas. - example: Fugit unde ea quis. + example: Voluptatibus ut. + example: Fugit nostrum rerum. content: application/json: schema: @@ -4140,9 +4140,9 @@ paths: schema: type: string description: Job UUID - example: 126427cd-77bf-4d47-8ce7-9c23b3694a22 + example: 79c02b27-dc40-4b89-9073-64a5596694c3 format: uuid - example: f1fa4e30-2659-4090-9083-cfac42b3b0b1 + example: 52112f6b-ba24-497d-8dd7-e7c129c8add5 responses: "200": description: OK response. @@ -4989,10 +4989,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Adipisci consequuntur omnis a. + config: Et exercitationem soluta possimus a aliquid. platforms: - - reddit-ads - - meta-ads + - microsoft-ads + - twitter-ads + - google-ads - google-ads required: - input diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index 86e5cdf3..edcc4ec8 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -67,7 +67,7 @@ type ApproveBriefPayload struct { ProjectID string // Brief UUID BriefID string - // Version being approved (ETag); approval is rejected if the brief changed + // If-Match header carrying the current ETag/version IfMatch *string } diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index b97d824b..c8b95276 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -7,6 +7,8 @@ import ( "context" "errors" "fmt" + "log/slog" + "time" "github.com/jackc/pgx/v5" @@ -14,6 +16,11 @@ import ( "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" ) +// advisoryUnlockTimeout bounds the explicit advisory-lock release so a slow +// unlock can't wedge connection return; the lock also frees when the session +// ends, so this is a backstop. +const advisoryUnlockTimeout = 5 * time.Second + // CampaignRepo is a pgx-backed implementation of domain.CampaignRepository. type CampaignRepo struct { db *Pool @@ -24,39 +31,48 @@ func NewCampaignRepo(pool *Pool) *CampaignRepo { return &CampaignRepo{db: pool} var _ domain.CampaignRepository = (*CampaignRepo)(nil) -// WithDispatchLock runs fn while holding a transaction-scoped Postgres advisory -// lock keyed on (briefID, platform). pg_advisory_xact_lock blocks until the lock -// is available and releases it automatically when the transaction ends, so it is -// safe against a crashing worker (no orphaned lock). The two-key form derives -// stable int4 keys from hashtext so distinct pairs rarely collide; a rare hash -// collision only serializes two unrelated pairs, which is harmless. -// -// fn runs inside the transaction and receives that transaction's context; the -// idempotency read + upstream create + persist happen under the lock, so two -// concurrent create-campaigns for the same pair cannot both create an upstream -// campaign (cross-replica, since the lock lives in the database). +// WithDispatchLock runs fn while holding a SESSION-level Postgres advisory lock +// keyed on (briefID, platform), acquired on a dedicated pooled connection and +// released explicitly when fn returns. A session lock (not a transaction lock) +// is used deliberately: fn's own repository calls go through the shared pool +// (r.db) and commit independently, so the lock must live on a separate +// connection that stays held for fn's whole duration rather than being tied to a +// transaction fn isn't part of. Serialization is what matters — while one worker +// holds the lock, a second worker for the same pair blocks here, and once it +// proceeds its committed-read idempotency check sees the first worker's persisted +// row and reuses it. The lock is cross-replica (it lives in the database) and +// released even if fn panics (deferred Unlock + connection release). The two-key +// hashtext form makes distinct pairs rarely collide; a collision only serializes +// two unrelated pairs, which is harmless. func (r *CampaignRepo) WithDispatchLock(ctx context.Context, briefID string, platform model.Provider, fn func(context.Context) error) error { - tx, err := r.db.Begin(ctx) + conn, err := r.db.Acquire(ctx) if err != nil { - return fmt.Errorf("begin dispatch-lock tx: %w", err) + return fmt.Errorf("acquire dispatch-lock connection: %w", err) } - // Roll back on any early return; a committed tx makes Rollback a no-op. - defer func() { _ = tx.Rollback(ctx) }() + defer conn.Release() - if _, err := tx.Exec(ctx, - `SELECT pg_advisory_xact_lock(hashtext($1), hashtext($2))`, + if _, err := conn.Exec(ctx, + `SELECT pg_advisory_lock(hashtext($1), hashtext($2))`, briefID, string(platform), ); err != nil { return fmt.Errorf("acquire dispatch lock: %w", err) } + // Release the session lock on the same connection before returning it to the + // pool; use a background context so a cancelled ctx still frees the lock. + defer func() { + unlockCtx, cancel := context.WithTimeout(context.Background(), advisoryUnlockTimeout) + defer cancel() + if _, uerr := conn.Exec(unlockCtx, + `SELECT pg_advisory_unlock(hashtext($1), hashtext($2))`, + briefID, string(platform), + ); uerr != nil { + // The lock also frees when the session (connection) ends, so a failed + // explicit unlock is not fatal; surface it for diagnostics. + slog.WarnContext(ctx, "failed to release dispatch advisory lock", "brief_id", briefID, "platform", platform, "error", uerr) + } + }() - if err := fn(ctx); err != nil { - return err - } - if err := tx.Commit(ctx); err != nil { - return fmt.Errorf("commit dispatch-lock tx: %w", err) - } - return nil + return fn(ctx) } const campaignCols = `id::text, project_id::text, brief_id::text, job_id::text, platform, platform_campaign_id, campaign_name, diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index 249f5e2c..140e9cde 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "time" "github.com/jackc/pgx/v5" @@ -14,6 +15,12 @@ import ( "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" ) +// staleJobCutoff is how long a queued/running job must have been idle (no update) +// before startup recovery treats it as orphaned. It must exceed the longest +// realistic dispatch so a job still being actively worked by another replica +// during a rolling deploy is never failed out from under it. +const staleJobCutoff = 15 * time.Minute + // JobRepo is a pgx-backed implementation of domain.JobRepository. type JobRepo struct { db *Pool @@ -71,15 +78,23 @@ func (r *JobRepo) UpdateJobStatus(ctx context.Context, id string, status model.J return nil } -// FailStuckJobs marks every non-terminal job as failed. Run once on startup: -// a queued/running job's dispatch goroutine lives only in the process that -// created it, so after a restart such a job would otherwise stay non-terminal -// forever. Fail-forward (rather than resume) because a partially-dispatched job -// cannot be safely re-driven without provider-side idempotency keys. +// FailStuckJobs marks non-terminal jobs older than staleJobCutoff as failed. Run +// once on startup: a queued/running job's dispatch goroutine lives only in the +// process that created it, so after a restart such a job would otherwise stay +// non-terminal forever. Fail-forward (rather than resume) because a +// partially-dispatched job cannot be safely re-driven without provider-side +// idempotency keys. +// +// The age cutoff is important during rolling deploys: an old pod can still be +// actively dispatching a recently-created job while a new pod boots, so only +// jobs that have been idle (no update) longer than the cutoff — well beyond any +// live dispatch — are considered orphaned. A live job is updated to running on +// start and to terminal on finish, so a genuinely-stuck job stops being touched. func (r *JobRepo) FailStuckJobs(ctx context.Context, jobErr string) (int64, error) { q := `UPDATE campaign_jobs SET status='failed', error=$1, updated_at=now() - WHERE status IN ('queued','running')` - tag, err := r.db.Exec(ctx, q, nullStr(jobErr)) + WHERE status IN ('queued','running') + AND updated_at < now() - make_interval(secs => $2)` + tag, err := r.db.Exec(ctx, q, nullStr(jobErr), staleJobCutoff.Seconds()) if err != nil { return 0, fmt.Errorf("fail stuck jobs: %w", err) } diff --git a/internal/service/brief.go b/internal/service/brief.go index f5ddd5c7..da8114a9 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -8,6 +8,7 @@ import ( "encoding/json" "errors" "strconv" + "strings" briefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" @@ -218,7 +219,14 @@ func (s *BriefService) UpdateCampaign(ctx context.Context, p *briefs.UpdateCampa } existing.CampaignName = p.Campaign.CampaignName existing.Status = p.Campaign.Status - existing.ConfigSnapshot = marshalAny(p.Campaign.Config) + // Only overwrite the stored config when the caller actually supplied one. + // config is optional in CampaignUpdateInput, so an omitted value must leave + // the existing ConfigSnapshot intact rather than wiping it to NULL on a + // name/status-only edit (the GET response doesn't expose config, so a client + // can't round-trip it back). + if p.Campaign.Config != nil { + existing.ConfigSnapshot = marshalAny(p.Campaign.Config) + } updated, uerr := s.campaigns.ReplaceCampaign(ctx, existing, version) if uerr != nil { return nil, mapBriefErr(uerr) @@ -307,7 +315,13 @@ func parseBriefIfMatch(ifMatch *string) (int64, error) { if ifMatch == nil || *ifMatch == "" { return 0, &briefs.PreconditionRequiredError{Code: "428", Message: "an If-Match header is required"} } - v, err := strconv.ParseInt(*ifMatch, 10, 64) + // Accept both the bare version we emit and a standards-compliant quoted + // entity-tag (RFC 7232 `If-Match: "3"`), plus the weak-tag `W/"3"` form, since + // caches and conformant clients may echo the ETag quoted. + raw := strings.TrimSpace(*ifMatch) + raw = strings.TrimPrefix(raw, "W/") + raw = strings.Trim(raw, `"`) + v, err := strconv.ParseInt(raw, 10, 64) if err != nil { return 0, &briefs.BadRequestError{Code: "400", Message: "If-Match must be an integer version"} } @@ -324,6 +338,22 @@ func mapBriefErr(err error) error { return &briefs.ConflictError{Code: "409", Message: "the resource already exists"} case errors.Is(err, domain.ErrPreconditionFailed): return &briefs.PreconditionFailedError{Code: "412", Message: "the supplied ETag does not match the current version"} + } + // Preserve errors that are already typed briefs API errors (e.g. the typed + // 503 the orchestrator returns during graceful shutdown, or a 400/428/412 + // constructed upstream) so their advertised status isn't flattened to 500. + var ( + unavail *briefs.ConnServiceUnavailableError + badReq *briefs.BadRequestError + notFound *briefs.NotFoundError + conflict *briefs.ConflictError + preFailed *briefs.PreconditionFailedError + preReq *briefs.PreconditionRequiredError + ) + switch { + case errors.As(err, &unavail), errors.As(err, &badReq), errors.As(err, ¬Found), + errors.As(err, &conflict), errors.As(err, &preFailed), errors.As(err, &preReq): + return err default: return &briefs.InternalServerError{Code: "500", Message: "an internal server error occurred"} } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 2571f48e..94894d48 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -244,3 +244,75 @@ func TestBriefService_ApproveBrief_VersionGated(t *testing.T) { t.Errorf("status = %q, want approved", got.Status) } } + +// parseBriefIfMatch must accept a bare version, a quoted entity-tag, and a weak +// tag; and reject non-numeric input. +func TestParseBriefIfMatch_AcceptsQuotedETag(t *testing.T) { + cases := map[string]int64{`3`: 3, `"3"`: 3, `W/"3"`: 3, ` "42" `: 42} + for in, want := range cases { + v, err := parseBriefIfMatch(&in) + if err != nil { + t.Errorf("parseBriefIfMatch(%q) error: %v", in, err) + continue + } + if v != want { + t.Errorf("parseBriefIfMatch(%q) = %d, want %d", in, v, want) + } + } + bad := `abc` + if _, err := parseBriefIfMatch(&bad); err == nil { + t.Errorf("parseBriefIfMatch(%q) = nil error, want BadRequest", bad) + } + var nilp *string + if _, err := parseBriefIfMatch(nilp); err == nil { + t.Error("parseBriefIfMatch(nil) = nil error, want PreconditionRequired") + } +} + +// campaignEditRepo is a minimal CampaignRepository for UpdateCampaign tests. +type campaignEditRepo struct { + got *model.Campaign // the campaign passed to ReplaceCampaign + cur *model.Campaign // the stored campaign returned by GetCampaign +} + +func (r *campaignEditRepo) GetCampaign(context.Context, string, string, string) (*model.Campaign, error) { + cp := *r.cur + return &cp, nil +} +func (r *campaignEditRepo) GetCampaignByPlatform(context.Context, string, model.Provider) (*model.Campaign, error) { + return nil, domain.ErrNotFound +} +func (r *campaignEditRepo) WithDispatchLock(ctx context.Context, _ string, _ model.Provider, fn func(context.Context) error) error { + return fn(ctx) +} +func (r *campaignEditRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { + return c, nil +} +func (r *campaignEditRepo) ReplaceCampaign(_ context.Context, c *model.Campaign, _ int64) (*model.Campaign, error) { + r.got = c + return c, nil +} + +// UpdateCampaign must NOT wipe the stored config when the caller omits config. +func TestBriefService_UpdateCampaign_PreservesConfigWhenOmitted(t *testing.T) { + camps := &campaignEditRepo{cur: &model.Campaign{ + ID: "c1", ProjectID: "cncf", BriefID: "b1", Version: 2, + CampaignName: "old", Status: "active", + ConfigSnapshot: []byte(`{"budget":100}`), + }} + s := &BriefService{briefs: &fakeBriefRepo{briefs: map[string]*model.CampaignBrief{}}, campaigns: camps, jobs: newFakeJobRepo(), orch: NewOrchestrator(camps, newFakeJobRepo(), nil)} + v := "2" + _, err := s.UpdateCampaign(context.Background(), &briefs.UpdateCampaignPayload{ + ProjectID: "cncf", BriefID: "b1", CampaignID: "c1", IfMatch: &v, + Campaign: &briefs.CampaignUpdateInput{CampaignName: "new", Status: "paused"}, // Config omitted + }) + if err != nil { + t.Fatalf("UpdateCampaign: %v", err) + } + if string(camps.got.ConfigSnapshot) != `{"budget":100}` { + t.Errorf("config was overwritten: %s, want the stored {\"budget\":100}", camps.got.ConfigSnapshot) + } + if camps.got.CampaignName != "new" || camps.got.Status != "paused" { + t.Errorf("name/status not applied: %q/%q", camps.got.CampaignName, camps.got.Status) + } +} diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index ead7b9c5..bbd664f8 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -213,7 +213,11 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief } campaign, err := d.Dispatch(ctx, brief, p, config) if err != nil { - res.Error = err.Error() + // Log the raw dispatcher error (it may carry provider request/response + // detail or credentials) server-side, and store a stable, client-safe + // message in the job result, consistent with the persistence/panic paths. + slog.ErrorContext(ctx, "platform dispatch failed", "platform", p, "job_id", jobID, "error", err) + res.Error = "platform campaign creation failed" return nil } if campaign == nil { From e1421635ef3d89719f802526f1451c9f8ce1b52c Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 17:51:42 -0700 Subject: [PATCH 15/46] fix(review): preserve orphaned upstream id on persist failure (PR #11) When the upstream (paid) campaign is created but UpsertCampaign then fails, log the orphaned platform_campaign_id at ERROR (so it's recoverable out of band) and keep the upstream id in the job result, instead of discarding it. A bare retry can't rely on the read-before-dispatch guard here (no row was written), so surfacing the id is what makes reconciliation possible until provider-side idempotency keys land (LFXV2-2665). Also corrected the stale "transaction rolls back" comment (the lock is now session-scoped). Address Copilot review comment on PR #11. Signed-off-by: Misha Rautela --- internal/service/orchestrator.go | 17 +++++++++++------ internal/service/orchestrator_test.go | 7 ++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index bbd664f8..ffdc85e1 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -239,12 +239,17 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief campaign.ProjectID = brief.ProjectID campaign.Platform = p if _, err := o.campaigns.UpsertCampaign(ctx, campaign); err != nil { - // Log the raw persistence error; return a generic message so DB error - // text isn't leaked to clients via the job result. Return the error so - // the advisory-lock transaction rolls back rather than committing after - // a failed write. - slog.ErrorContext(ctx, "persist campaign failed", "platform", p, "job_id", jobID, "error", err) - res.Error = "could not persist campaign" + // The upstream (paid) campaign was already created but we failed to + // persist its row. Log the raw error AND the orphaned upstream id at + // ERROR so the campaign is recoverable/reconcilable out of band — a + // bare retry would otherwise re-create it (the read-before-dispatch + // guard has no row to find). Store a client-safe message but keep the + // upstream id in the result so it isn't lost. Return the error so + // WithDispatchLock releases the lock and the caller records a failure. + slog.ErrorContext(ctx, "persist campaign failed after upstream create — orphaned upstream campaign", + "platform", p, "job_id", jobID, "platform_campaign_id", campaign.PlatformCampaignID, "error", err) + res.Error = "created upstream campaign but failed to record it; see logs" + res.CampaignID = campaign.PlatformCampaignID return err } res.OK = true diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index dc90b654..bded6043 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -411,9 +411,14 @@ func TestOrchestrator_PersistErrorIsSanitized(t *testing.T) { if strings.Contains(string(j.Result), "pq:") || strings.Contains(string(j.Result), "constraint") { t.Errorf("result leaked raw DB error: %s", j.Result) } - if !strings.Contains(string(j.Result), "could not persist campaign") { + // The message is sanitized but the upstream id is preserved so the orphaned + // campaign isn't lost. + if !strings.Contains(string(j.Result), "failed to record it") { t.Errorf("result = %s, want the sanitized message", j.Result) } + if !strings.Contains(string(j.Result), "pc-google-ads") { + t.Errorf("result = %s, want the upstream id preserved for reconciliation", j.Result) + } } // lockCountingCampaignRepo records that WithDispatchLock wrapped the dispatch. From 552760073784aec28d0c20b74715b1455d5402c7 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 18:05:23 -0700 Subject: [PATCH 16/46] fix(review): rework single-flight to a claim row; recovery + schema fixes (PR #11, LFXV2-2665) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the held-connection advisory lock (which held one pooled connection across the HTTP dispatch while fn acquired another — deadlock risk at low pool sizes, and a blocking acquire on the non-cancelable dispatch context could hang shutdown) with an atomic claim row: - ClaimCampaignDispatch does INSERT ... ON CONFLICT (brief_id, platform) DO NOTHING of a 'pending' campaign. Exactly one worker across replicas wins (the unique index arbitrates) — no held connection, no blocking lock. A loser reuses the existing row (or, if it's still pending elsewhere, reports in-progress instead of dispatching a duplicate). The pending row also survives an upstream-create-then-crash, making the orphaned upstream campaign recoverable. - Removed WithDispatchLock (and its advisory-lock helper/const). - design: platforms binding array now has MinLength(1) so the schema rejects an empty array (dup rejection stays in the handler — OpenAPI can't express uniqueItems), fixing the generated CLI example. Tests: dispatch-goes-through-claim, claim-error-is-failure, already-claimed-pending-skips (dispatcher not called). gen/ regenerated; build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 335 +++++---- .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 711 +++++++++--------- design/brief.go | 7 +- docs/knowledge/code/internal-service.md | 17 +- docs/knowledge/log.md | 7 + gen/http/cli/lfx_v2_campaign_service/cli.go | 50 +- .../client/cli.go | 4 +- .../client/types.go | 3 + .../server/types.go | 3 + .../client/cli.go | 40 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 335 +++++---- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 711 +++++++++--------- internal/domain/brief_port.go | 18 +- .../infrastructure/postgres/campaign_repo.go | 65 +- internal/service/brief_test.go | 4 +- internal/service/orchestrator.go | 135 ++-- internal/service/orchestrator_test.go | 102 ++- 21 files changed, 1301 insertions(+), 1254 deletions(-) diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index 2c0d48c6..489e0ef2 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index f0a63ca4..4be6b82c 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -3458,39 +3458,40 @@ definitions: properties: copy: description: Ad copy - example: Molestiae est accusantium laudantium nostrum. + example: Ut mollitia nihil ducimus. event_details: description: Extracted event/course details - example: Non quo necessitatibus. + example: Sunt quae et nesciunt iure quis. event_slug: type: string description: Event/course slug - example: Facere qui omnis. + example: Possimus dolores dignissimos beatae velit laudantium. id: type: string description: Brief UUID - example: Beatae harum similique corporis id eum. + example: Officiis beatae sed aut. keywords: description: Keyword list - example: Dolores sit. + example: Non quo necessitatibus. platforms: type: array items: type: string - example: Beatae quia qui excepturi minima. + example: Id eum aut et itaque. description: Suggested default platforms example: - - Natus a. - - Quod sunt quae et nesciunt iure quis. - - Ut mollitia nihil ducimus. + - Et deleniti dolores libero facilis qui. + - Natus facere qui omnis et enim. + - Officia dolorem odio ut beatae quia qui. + - Minima illo dolores natus a sint. program_type: type: string description: Funnel context - example: Facilis qui libero. + example: Est fugiat aut dicta libero iure culpa. project_id: type: string description: Owning project - example: Et itaque rem eos et deleniti dolores. + example: Nihil est quia qui fugiat est. status: type: string description: Lifecycle status @@ -3501,31 +3502,31 @@ definitions: - archived targeting: description: Targeting recommendation - example: Exercitationem accusantium nihil. + example: Molestiae est accusantium laudantium nostrum. url: type: string description: Event/course page URL - example: Enim vitae officia dolorem odio. + example: Eum et aut quia beatae harum similique. version: type: integer description: Optimistic-concurrency version - example: 8012662392626135551 + example: 757787044039705195 format: int64 example: - copy: Sed veniam dolores quidem necessitatibus voluptatem. - event_details: Earum minus autem omnis qui debitis eum. - event_slug: Modi possimus consequatur. - id: Ipsum voluptates pariatur magni atque. - keywords: Sit reiciendis et vel beatae molestiae. + copy: Earum minus autem omnis qui debitis eum. + event_details: Cupiditate mollitia hic vel ut. + event_slug: Fugit dolor et natus sit cupiditate non. + id: Eos exercitationem. + keywords: Sed veniam dolores quidem necessitatibus voluptatem. platforms: + - Esse officia explicabo dolor deserunt aspernatur. - Aspernatur illo accusamus. - - Cupiditate mollitia hic vel ut. - program_type: Sit cupiditate non. - project_id: Omnis doloremque at fugit dolor et. + program_type: Pariatur magni atque amet omnis doloremque. + project_id: Nihil neque quod alias ipsum. status: approved - targeting: Natus vitae consequatur eos sit aut ut. - url: Eveniet esse officia explicabo dolor deserunt. - version: 6761108389050444243 + targeting: Sit reiciendis et vel beatae molestiae. + url: Modi possimus consequatur. + version: 5414041088513005988 required: - id - project_id @@ -3539,53 +3540,55 @@ definitions: properties: copy: description: Ad copy - example: Vel inventore aliquid aut non eligendi accusamus. + example: Ipsam ut sed natus et unde. event_details: description: Extracted event/course details - example: Explicabo repudiandae aut reiciendis recusandae molestias. + example: Qui impedit temporibus eveniet eos omnis cumque. event_slug: type: string description: Event/course slug (unique within the project) - example: Eos labore quia esse consectetur tenetur. + example: Eos sit aut. keywords: description: Keyword list - example: Quod impedit accusamus incidunt minus veritatis enim. + example: Explicabo repudiandae aut reiciendis recusandae molestias. platforms: type: array items: type: string - example: Et recusandae possimus. + example: Esse consectetur tenetur. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: + - Aut ut sit nisi architecto. + - Rerum et recusandae possimus quis. - Praesentium voluptate. - - Qui impedit temporibus eveniet eos omnis cumque. - - Ipsam ut sed natus et unde. program_type: type: string description: Funnel context - example: education + example: membership enum: - events - education - membership targeting: description: Targeting recommendation - example: Hic est quia pariatur odit ullam. + example: Vel inventore aliquid aut non eligendi accusamus. url: type: string description: Event/course page URL - example: Aliquam aut ut sit nisi architecto iure. + example: Est sed corrupti sit eos labore. example: - copy: In aut nam rerum. - event_details: Quae qui inventore dolorem deserunt. - event_slug: Id corrupti sed quo perferendis nemo. + copy: Quasi in aut nam rerum. + event_details: Error perferendis quae qui inventore dolorem. + event_slug: Impedit accusamus incidunt minus veritatis enim. keywords: Distinctio magnam. platforms: - - Voluptatem nihil quaerat asperiores pariatur. - - Vel veritatis hic rerum accusamus velit error. + - Id corrupti sed quo perferendis nemo. + - Quisquam nisi repellendus quos magnam aut. + - Id voluptatem nihil quaerat asperiores. + - Repellat vel veritatis hic rerum accusamus. program_type: membership targeting: Architecto deserunt vero ducimus distinctio. - url: Quisquam nisi repellendus quos magnam aut. + url: Hic est quia pariatur odit ullam. required: - program_type - event_slug @@ -3596,45 +3599,45 @@ definitions: brief_id: type: string description: Parent brief - example: Et dolorem quod. + example: Fugiat aliquid aspernatur voluptatem in cupiditate. campaign_name: type: string description: Campaign name - example: Consequatur hic voluptatem. + example: Nostrum atque illum nesciunt adipisci odit corrupti. id: type: string description: Campaign UUID - example: Placeat et minus et. + example: Architecto quae error. platform: type: string description: Channel - example: Iusto fugit non asperiores quidem natus. + example: Et dolorem quod. platform_campaign_id: type: string description: ID returned by the ad platform - example: Nostrum atque illum nesciunt adipisci odit corrupti. + example: Iusto fugit non asperiores quidem natus. project_id: type: string description: Owning project - example: Fugiat aliquid aspernatur voluptatem in cupiditate. + example: Placeat et minus et. status: type: string description: Campaign status - example: Omnis quidem dolor ipsum voluptas. + example: Consequatur hic voluptatem. version: type: integer description: Optimistic-concurrency version - example: 3737008917467127208 + example: 4612952422408203887 format: int64 example: - brief_id: Ut sint non eum expedita non. - campaign_name: Doloribus voluptas mollitia doloremque totam. - id: Id ea. - platform: Sit voluptatem ad ab. - platform_campaign_id: Tempora dolor quis totam hic quibusdam eveniet. - project_id: Dolorem necessitatibus neque consectetur occaecati earum. - status: Veniam et ducimus quos amet. - version: 1836828122944842672 + brief_id: Consectetur occaecati earum unde ut sint. + campaign_name: Hic quibusdam eveniet nostrum doloribus voluptas mollitia. + id: Quidem dolor ipsum. + platform: Eum expedita non voluptas sit. + platform_campaign_id: Ad ab quasi tempora dolor quis. + project_id: Sed occaecati id ea sunt dolorem necessitatibus. + status: Totam cum veniam. + version: 8632050897094076248 required: - id - project_id @@ -3649,7 +3652,7 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Nobis nam velit quis rem. + example: Ut nobis. platforms: type: array items: @@ -3667,12 +3670,11 @@ definitions: example: - meta-ads - google-ads - - reddit-ads + minItems: 1 example: - config: Architecto quae error. + config: Rem aliquam animi harum. platforms: - - reddit-ads - - twitter-ads + - hubspot required: - platforms CampaignUpdateInput: @@ -3682,18 +3684,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Doloremque commodi rerum esse. + example: Quos amet. config: description: Campaign configuration snapshot - example: Laudantium quia. + example: Quidem omnis totam eos non molestias. status: type: string description: Campaign status - example: Omnis totam eos non. + example: Quia doloremque commodi rerum. example: - campaign_name: Maxime recusandae. - config: Laudantium error sit nihil iure officiis nemo. - status: Accusamus debitis explicabo praesentium. + campaign_name: Quia iusto maxime. + config: Error sit nihil iure officiis nemo. + status: Illum accusamus debitis explicabo praesentium sint. required: - campaign_name - status @@ -4059,18 +4061,18 @@ definitions: $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. status: type: string description: Job status @@ -4085,18 +4087,18 @@ definitions: error: Aperiam facere voluptas quis nihil. job_id: Vel iste aut cum voluptatem. result: - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. status: partial required: - job_id @@ -4131,12 +4133,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Et exercitationem soluta possimus a aliquid. + config: Facere et exercitationem. platforms: - microsoft-ads - twitter-ads - google-ads - - google-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4169,9 +4170,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Itaque quos voluptatibus quos accusantium fugit. - config: Qui molestias. - status: Excepturi saepe sit vel perspiciatis neque. + campaign_name: Ad voluptatem. + config: Et expedita itaque quos. + status: Tempore impedit. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4188,10 +4189,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - config - credentials @@ -4205,14 +4206,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - config - credentials @@ -4227,10 +4228,10 @@ definitions: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - config - credentials @@ -4245,12 +4246,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - config - credentials @@ -4264,14 +4265,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. required: - config - credentials @@ -4286,11 +4287,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - config - credentials @@ -4305,13 +4306,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - config - credentials @@ -4323,10 +4324,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4337,7 +4338,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4348,7 +4349,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4359,8 +4360,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4371,10 +4372,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4385,9 +4386,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4398,10 +4399,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4425,12 +4426,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4442,7 +4443,7 @@ definitions: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" required: - config @@ -4455,9 +4456,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4468,9 +4469,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4482,7 +4483,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4494,8 +4495,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. required: - config LinkedinAdsConnection: diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index 099f11a8..95eac4a9 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Magnam veniam atque labore qui.","platforms":["Architecto dolorem sapiente repellendus aut.","Veritatis sint autem necessitatibus deleniti itaque.","Magnam dolorum voluptatem modi velit."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Ullam pariatur ex voluptas aspernatur.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Voluptates aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index 41282d2c..a0906ee4 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -222,7 +222,7 @@ paths: schema: type: string description: Brief UUID - example: 2df7b380-3594-4323-92b0-9a8e5a8fedcc + example: 52099480-3594-4323-92b0-9a8e5a8fedcc format: uuid example: 6d67841a-f263-4343-acd9-5ea22a27e47d responses: @@ -621,12 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Et exercitationem soluta possimus a aliquid. + config: Facere et exercitationem. platforms: - microsoft-ads - twitter-ads - google-ads - - google-ads responses: "202": description: Accepted response. @@ -635,11 +634,11 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Magnam veniam atque labore qui. + job_id: Et magni adipisci magnam veniam. platforms: - - Architecto dolorem sapiente repellendus aut. - - Veritatis sint autem necessitatibus deleniti itaque. - - Magnam dolorum voluptatem modi velit. + - Odio et corporis. + - Dolorem sapiente. + - Aut natus. status: queued "400": description: 'BadRequest: Bad request' @@ -741,14 +740,14 @@ paths: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Recusandae aut perferendis. - campaign_name: Corporis ut non. - id: Ullam pariatur ex voluptas aspernatur. - platform: Est eaque ipsam harum nisi nobis. - platform_campaign_id: Et eveniet. - project_id: Voluptates aliquam vero ducimus. - status: Eius sed qui deserunt perspiciatis nihil. - version: 5441532063507194963 + brief_id: Ex voluptas aspernatur aperiam voluptates aliquam. + campaign_name: Eaque ipsam harum nisi nobis et et. + id: Explicabo est totam qui praesentium ipsam. + platform: Ducimus neque. + platform_campaign_id: Aut perferendis natus. + project_id: Cum ipsum recusandae est adipisci ullam. + status: Excepturi corporis ut. + version: 9153915624091824945 "400": description: 'BadRequest: Bad request' content: @@ -849,9 +848,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Itaque quos voluptatibus quos accusantium fugit. - config: Qui molestias. - status: Excepturi saepe sit vel perspiciatis neque. + campaign_name: Ad voluptatem. + config: Et expedita itaque quos. + status: Tempore impedit. responses: "200": description: OK response. @@ -868,14 +867,14 @@ paths: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Provident officia officiis. - campaign_name: Rerum ut necessitatibus illum ratione. - id: Enim reiciendis sint neque. - platform: Ut mollitia accusantium dignissimos. - platform_campaign_id: Consequatur qui molestiae velit ratione nesciunt et. - project_id: Rerum facilis quia molestiae ratione officia. - status: Mollitia atque atque dolores accusantium non dolor. - version: 9077221317587809922 + brief_id: Et aut consequatur inventore enim reiciendis. + campaign_name: Ut mollitia accusantium dignissimos. + id: Ullam omnis autem. + platform: Neque ut rerum facilis quia molestiae ratione. + platform_campaign_id: Fugit provident officia officiis. + project_id: Id laboriosam nihil ea. + status: Consequatur qui molestiae velit ratione nesciunt et. + version: 476544424691753105 "400": description: 'BadRequest: Bad request' content: @@ -1022,14 +1021,14 @@ paths: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Quis quis reprehenderit non quae omnis qui. + account_id: Minima eaque earum. has_credentials: true - id: Dolor officia eligendi. - label: At odio incidunt distinctio sint qui. - login_customer_id: Quidem odio ab accusantium aut est deleniti. - project_id: Provident dicta temporibus debitis. - status: error - version: 5571372049954177452 + id: Excepturi deleniti voluptas aperiam vel. + label: Id temporibus et provident maiores neque quis. + login_customer_id: Assumenda ipsa dolor. + project_id: Laudantium amet veritatis rerum itaque consequatur laboriosam. + status: active + version: 8240960881778207137 "404": description: 'NotFound: Resource not found' content: @@ -1087,10 +1086,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. responses: "201": description: Created response. @@ -1107,14 +1106,14 @@ paths: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Id temporibus et provident maiores neque quis. - has_credentials: false - id: Provident nobis soluta culpa vitae. - label: Laudantium amet veritatis rerum itaque consequatur laboriosam. - login_customer_id: Eligendi ut. - project_id: Excepturi deleniti voluptas aperiam vel. + account_id: Nobis ut asperiores quo aut. + has_credentials: true + id: Nihil quae porro. + label: Nulla officia vitae perspiciatis eveniet. + login_customer_id: Dicta voluptate aut in. + project_id: Rem autem quae. status: error - version: 4162198444433663334 + version: 7743336992980724195 "400": description: 'BadRequest: Bad request' content: @@ -1205,14 +1204,14 @@ paths: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Eum est molestiae necessitatibus magni. + account_id: Quidem odio ab accusantium aut est deleniti. has_credentials: true - id: Deserunt aliquam necessitatibus. - label: In est. - login_customer_id: Deserunt ipsum dolorum quas error. - project_id: Ut et eligendi et numquam dolorum. - status: error - version: 3367774197321419764 + id: Odio incidunt distinctio sint. + label: Qui enim cumque saepe. + login_customer_id: Praesentium voluptatibus deserunt aliquam necessitatibus eos. + project_id: Aperiam quis quis reprehenderit non quae. + status: active + version: 5525678772225743935 "400": description: 'BadRequest: Bad request' content: @@ -1294,10 +1293,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. responses: "204": description: No Content response. @@ -1364,8 +1363,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Fugit repellendus et accusamus sed non sequi. - ok: true + message: Eligendi et. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1476,17 +1475,17 @@ paths: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Dolorem fugiat et aspernatur voluptatem nobis. - brand_kit: Delectus ex aut quia. - has_credentials: false - id: Tempore sunt itaque omnis. - label: Modi voluptatum veniam molestiae quibusdam. - portal_id: Perferendis eveniet. - project_id: Ex sunt sit beatae. - sender_email: Voluptatibus quam dicta voluptate consequuntur voluptatem est. - sender_name: Temporibus quis iste eaque ratione debitis nam. - status: inactive - version: 3577051025426830879 + account_id: In ipsa tempore incidunt velit provident perspiciatis. + brand_kit: Aspernatur voluptatem nobis. + has_credentials: true + id: Nihil sunt doloremque. + label: Ea architecto autem iste. + portal_id: Omnis ut ex sunt. + project_id: Ut ut odio odio sed minus quia. + sender_email: Beatae ut modi voluptatum veniam. + sender_name: Quibusdam consequuntur dolorem fugiat. + status: deleted + version: 5861862348723710898 "404": description: 'NotFound: Resource not found' content: @@ -1540,14 +1539,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. responses: "201": description: Created response. @@ -1564,17 +1563,17 @@ paths: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Molestiae aut fugit alias. - brand_kit: Architecto autem iste. + account_id: Porro ut et cupiditate. + brand_kit: Animi molestiae aut fugit alias nisi qui. has_credentials: true - id: Ea ullam minima voluptatem vel deleniti. - label: Vero at ut quis. - portal_id: Non unde. - project_id: Repudiandae necessitatibus dolorem enim beatae quia. - sender_email: Dolorum nihil sunt doloremque explicabo. - sender_name: Ut odio odio sed minus quia quia. + id: Eius dicta. + label: Non assumenda perspiciatis. + portal_id: Voluptatem vel. + project_id: Ullam distinctio dolore velit. + sender_email: Dolore repudiandae necessitatibus dolorem. + sender_name: Beatae quia minus vero at ut. status: active - version: 8635749132548484011 + version: 2806381801577175312 "400": description: 'BadRequest: Bad request' content: @@ -1646,12 +1645,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. responses: "200": description: OK response. @@ -1668,17 +1667,17 @@ paths: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Velit fuga quos. - brand_kit: Culpa est possimus dolores dignissimos. - has_credentials: true - id: Reprehenderit provident repudiandae sit. - label: Ut sunt aliquam. - portal_id: Sed aut quia nihil est quia. - project_id: Aut aut eos magnam quisquam et. - sender_email: Fugiat est itaque. - sender_name: Fugiat aut dicta libero. - status: active - version: 2879571083312014203 + account_id: Debitis nam. + brand_kit: Aut aut eos magnam quisquam et. + has_credentials: false + id: Eveniet sint voluptatibus quam dicta. + label: Quis iste eaque. + portal_id: Quia distinctio consequatur dolore. + project_id: Consequuntur voluptatem est qui. + sender_email: Corporis consequatur voluptatem voluptates. + sender_name: Reprehenderit provident repudiandae sit. + status: error + version: 7483108258641908951 "400": description: 'BadRequest: Bad request' content: @@ -1760,7 +1759,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. responses: "204": description: No Content response. @@ -1827,8 +1826,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Laudantium error eum et aut. - ok: true + message: Sunt aliquam et velit fuga quos est. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1939,14 +1938,14 @@ paths: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Ipsa quo vel architecto quas eligendi impedit. + account_id: Sed sed similique enim ea maiores. has_credentials: false - id: Expedita voluptatum commodi fuga ipsa. - label: Qui quidem exercitationem. - org_id: Laudantium est ut soluta neque facilis est. - project_id: Nostrum corporis quasi magnam. - status: inactive - version: 8731305521183611402 + id: In aperiam quam quis quam dolor. + label: Sit cupiditate nobis iste qui rerum. + org_id: Ratione expedita voluptatum commodi fuga ipsa quam. + project_id: Earum iusto. + status: active + version: 4984404630797976872 "404": description: 'NotFound: Resource not found' content: @@ -2001,10 +2000,10 @@ paths: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. responses: "201": description: Created response. @@ -2021,14 +2020,14 @@ paths: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Quam quis quam dolor occaecati earum iusto. - has_credentials: true - id: Occaecati et. - label: Delectus voluptatem iste nisi in. - org_id: Iste qui rerum est sed sed similique. - project_id: Natus expedita aspernatur consequuntur quod ducimus molestias. - status: active - version: 6933590282461306362 + account_id: Libero ut est rerum est occaecati et. + has_credentials: false + id: Error nulla fuga fugit repellendus et accusamus. + label: Nam quia aperiam sunt est. + org_id: Consequuntur quod. + project_id: Non sequi error assumenda quam deleniti et. + status: inactive + version: 5045833847874249009 "400": description: 'BadRequest: Bad request' content: @@ -2101,7 +2100,7 @@ paths: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" responses: "200": @@ -2119,14 +2118,14 @@ paths: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Quia quisquam corrupti distinctio voluptas eius. - has_credentials: true - id: Corrupti et nobis voluptas dignissimos. - label: Ducimus modi ut culpa excepturi blanditiis. - org_id: Distinctio sunt aliquid harum quis nam rerum. - project_id: Illum et quisquam ex est facilis. + account_id: Neque facilis est qui possimus eligendi. + has_credentials: false + id: Consequuntur qui quidem exercitationem. + label: Sed numquam necessitatibus laudantium est ut. + org_id: Et nobis voluptas dignissimos exercitationem illum. + project_id: Ipsa quo vel architecto quas eligendi impedit. status: inactive - version: 3234333099728911322 + version: 8080806383587730069 "400": description: 'BadRequest: Bad request' content: @@ -2208,7 +2207,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. responses: "204": description: No Content response. @@ -2275,7 +2274,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Est rerum. + message: Ex est facilis qui ducimus modi ut. ok: true "404": description: 'NotFound: Resource not found' @@ -2387,15 +2386,15 @@ paths: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Pariatur debitis. - app_id: Omnis neque autem ex eos. + account_id: Qui nobis et delectus quam. + app_id: Est dolor ut corporis. has_credentials: true - id: Est dolor ut corporis. - label: Illo vitae occaecati omnis. - page_id: Cupiditate quos hic. - project_id: Cupiditate ut illo dolor quaerat totam. - status: active - version: 1381780689877724774 + id: Laboriosam qui id enim. + label: Nihil corrupti repellat eius. + page_id: Aut fuga. + project_id: Magni repudiandae. + status: deleted + version: 2782071096062379507 "404": description: 'NotFound: Resource not found' content: @@ -2450,12 +2449,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. responses: "201": description: Created response. @@ -2472,15 +2471,15 @@ paths: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Laboriosam qui id enim. - app_id: Qui nobis et delectus quam. + account_id: Ad inventore voluptatum eligendi quasi. + app_id: Placeat unde distinctio ducimus qui. has_credentials: true - id: Ipsa et dolore. - label: Expedita dignissimos non sed omnis officiis et. - page_id: Nihil corrupti repellat eius. - project_id: Velit dolores omnis placeat unde distinctio ducimus. - status: error - version: 2384980829463304567 + id: Deleniti voluptates non sint inventore. + label: Porro voluptate. + page_id: Aperiam velit dolores. + project_id: Iure ut nostrum facilis suscipit. + status: inactive + version: 358292288538552244 "400": description: 'BadRequest: Bad request' content: @@ -2553,9 +2552,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. responses: "200": description: OK response. @@ -2572,15 +2571,15 @@ paths: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Magnam ut similique ea minima magnam. - app_id: Dolores est et recusandae nihil. - has_credentials: true - id: A necessitatibus molestiae. - label: Repellat non suscipit veritatis sit tempore. - page_id: Nam sit. - project_id: Unde dicta autem dolorem qui explicabo. + account_id: Quos hic doloribus. + app_id: Qui a necessitatibus molestiae qui unde. + has_credentials: false + id: Illo vitae occaecati omnis. + label: Explicabo possimus consequatur. + page_id: Eos velit eum et sint corrupti. + project_id: Pariatur debitis. status: deleted - version: 2040878603756169140 + version: 3363918130362824521 "400": description: 'BadRequest: Bad request' content: @@ -2662,8 +2661,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. responses: "204": description: No Content response. @@ -2730,7 +2729,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Velit atque laudantium ullam rerum. + message: Dolorem qui explicabo consequuntur repellat non suscipit. ok: false "404": description: 'NotFound: Resource not found' @@ -2842,14 +2841,14 @@ paths: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Vel ipsam dolores et. - customer_id: Numquam omnis ullam facilis ab sapiente. - has_credentials: true - id: Omnis autem accusamus. - label: Eligendi rerum numquam amet deserunt rem. - project_id: Est assumenda aut. + account_id: Dolor ut velit quam omnis et dolor. + customer_id: Vitae vel omnis autem accusamus mollitia. + has_credentials: false + id: Maxime dicta qui aut. + label: Velit et impedit facilis quaerat. + project_id: Suscipit eos nam ipsa. status: deleted - version: 6442954210695633704 + version: 443094643112211074 "404": description: 'NotFound: Resource not found' content: @@ -2903,14 +2902,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. responses: "201": description: Created response. @@ -2927,14 +2926,14 @@ paths: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Ipsa rerum velit et impedit. - customer_id: Ut velit quam omnis. + account_id: Repellendus porro et distinctio. + customer_id: Quia eaque. has_credentials: true - id: Aut assumenda fugiat quia eaque dolor porro. - label: Qui aut quas suscipit eos. - project_id: Alias error aut maxime. - status: inactive - version: 5504009031361040663 + id: Labore omnis provident nihil aut rerum est. + label: Sint non. + project_id: Amet rem ab. + status: error + version: 5425752825388180685 "400": description: 'BadRequest: Bad request' content: @@ -3006,9 +3005,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. responses: "200": description: OK response. @@ -3025,14 +3024,14 @@ paths: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Enim id voluptas aperiam distinctio. - customer_id: Ut et laboriosam. + account_id: Esse voluptate eum laboriosam distinctio non. + customer_id: Id aut et adipisci quo ut. has_credentials: false - id: Deleniti deserunt labore. - label: Deserunt voluptates ut culpa saepe necessitatibus veritatis. - project_id: Id aut et adipisci quo ut. + id: Rem quia vel ipsam dolores. + label: Ullam facilis ab sapiente voluptatem. + project_id: Et qui ut libero numquam. status: inactive - version: 171807855442490922 + version: 8626906144120400240 "400": description: 'BadRequest: Bad request' content: @@ -3114,10 +3113,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. responses: "204": description: No Content response. @@ -3184,7 +3183,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Expedita voluptas qui eaque. + message: Voluptates ut culpa saepe necessitatibus. ok: true "404": description: 'NotFound: Resource not found' @@ -3296,13 +3295,13 @@ paths: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Et rerum in expedita. - has_credentials: true - id: Voluptatum ducimus tempore quae eum consequatur dolore. - label: Quo veritatis quis delectus est. - project_id: Illum illum dolores tenetur ut illum. - status: active - version: 4673192311933251173 + account_id: Iusto omnis. + has_credentials: false + id: Odio totam cum deleniti placeat fuga. + label: Et ut quis ut. + project_id: Saepe voluptatem reiciendis pariatur. + status: error + version: 757606501996618102 "404": description: 'NotFound: Resource not found' content: @@ -3357,11 +3356,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. responses: "201": description: Created response. @@ -3378,13 +3377,13 @@ paths: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Iusto omnis. - has_credentials: false - id: Odio totam cum deleniti placeat fuga. - label: Et ut quis ut. - project_id: Saepe voluptatem reiciendis pariatur. - status: error - version: 757606501996618102 + account_id: Non laudantium sunt minima repudiandae illo harum. + has_credentials: true + id: Atque laudantium. + label: Enim accusantium labore esse numquam. + project_id: Rerum earum rerum adipisci. + status: inactive + version: 6816002535409129912 "400": description: 'BadRequest: Bad request' content: @@ -3457,7 +3456,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. responses: "200": description: OK response. @@ -3474,13 +3473,13 @@ paths: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Aperiam cum possimus. - has_credentials: false - id: Veniam consectetur deserunt in hic dolorum facere. - label: Magni consequatur dignissimos itaque quia. - project_id: Et reprehenderit dignissimos. - status: error - version: 3475949958922975875 + account_id: Et rerum in expedita. + has_credentials: true + id: Voluptatum ducimus tempore quae eum consequatur dolore. + label: Quo veritatis quis delectus est. + project_id: Illum illum dolores tenetur ut illum. + status: active + version: 4673192311933251173 "400": description: 'BadRequest: Bad request' content: @@ -3562,9 +3561,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. responses: "204": description: No Content response. @@ -3631,8 +3630,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sed dolore dolorem voluptatibus. - ok: false + message: Assumenda nesciunt distinctio eaque. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -3743,14 +3742,14 @@ paths: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Deserunt repellendus corrupti itaque quo sit. - funding_instrument_id: Eum et ipsum expedita reprehenderit eos. - has_credentials: false - id: Blanditiis mollitia dolores illo nostrum magnam. - label: Omnis nobis. - project_id: Nostrum tempore. - status: inactive - version: 6605548766358472787 + account_id: Id unde veritatis officiis aut fugiat. + funding_instrument_id: Voluptas tenetur nobis facere. + has_credentials: true + id: Eaque voluptate reprehenderit sed voluptatem sed illo. + label: Cum nisi numquam. + project_id: Praesentium tenetur quas at ut necessitatibus dolor. + status: active + version: 4642810346647163563 "404": description: 'NotFound: Resource not found' content: @@ -3805,13 +3804,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. responses: "201": description: Created response. @@ -3828,14 +3827,14 @@ paths: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Id unde veritatis officiis aut fugiat. - funding_instrument_id: Voluptas tenetur nobis facere. + account_id: Vitae aut ea. + funding_instrument_id: Aut sit architecto ut unde saepe. has_credentials: true - id: Eaque voluptate reprehenderit sed voluptatem sed illo. - label: Cum nisi numquam. - project_id: Praesentium tenetur quas at ut necessitatibus dolor. - status: active - version: 4642810346647163563 + id: Non iste ad rem quidem sunt qui. + label: Deleniti doloribus debitis assumenda dignissimos. + project_id: Ullam ab suscipit et labore harum. + status: error + version: 753723066786334950 "400": description: 'BadRequest: Bad request' content: @@ -3908,8 +3907,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. responses: "200": description: OK response. @@ -3926,14 +3925,14 @@ paths: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Rem error. - funding_instrument_id: Aperiam quos perferendis nisi blanditiis eveniet. + account_id: Deserunt repellendus corrupti itaque quo sit. + funding_instrument_id: Eum et ipsum expedita reprehenderit eos. has_credentials: false - id: Aperiam et nihil. - label: Distinctio amet enim. - project_id: Perspiciatis porro. + id: Blanditiis mollitia dolores illo nostrum magnam. + label: Omnis nobis. + project_id: Nostrum tempore. status: inactive - version: 3440110816039158635 + version: 6605548766358472787 "400": description: 'BadRequest: Bad request' content: @@ -4015,10 +4014,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. responses: "204": description: No Content response. @@ -4085,7 +4084,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Enim ut corporis dolorum consequatur eius. + message: Ut architecto deleniti nostrum sed aperiam. ok: true "404": description: 'NotFound: Resource not found' @@ -4151,18 +4150,22 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Dolore ut non error aut. - job_id: Vel natus provident. + error: Beatae est officia et sint. + job_id: Et dignissimos ex. result: - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - status: queued + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + status: running "400": description: 'BadRequest: Bad request' content: @@ -4863,7 +4866,7 @@ components: properties: config: description: Per-platform campaign configuration - example: Ullam eaque suscipit harum. + example: Impedit ullam eaque suscipit harum sint neque. platforms: type: array items: @@ -4882,12 +4885,13 @@ components: - meta-ads - google-ads - reddit-ads - - reddit-ads + minItems: 1 example: - config: Et veniam itaque optio consequatur nulla sint. + config: Optio consequatur nulla sint qui alias voluptatem. platforms: - - reddit-ads - linkedin-ads + - reddit-ads + - google-ads required: - platforms CampaignUpdateInput: @@ -4989,12 +4993,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Et exercitationem soluta possimus a aliquid. + config: Facere et exercitationem. platforms: - microsoft-ads - twitter-ads - google-ads - - google-ads required: - input CreateGoogleAdsRequestBody: @@ -5010,10 +5013,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - config - credentials @@ -5026,14 +5029,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - config - credentials @@ -5047,10 +5050,10 @@ components: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - config - credentials @@ -5064,12 +5067,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - config - credentials @@ -5082,14 +5085,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. required: - config - credentials @@ -5103,11 +5106,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - config - credentials @@ -5121,13 +5124,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - config - credentials @@ -5781,12 +5784,12 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Alias voluptatem ut consequatur ut recusandae. + example: Consequatur ut. platforms: type: array items: type: string - example: Qui mollitia et eum veniam. + example: Commodi qui mollitia et eum veniam. description: Platforms this job will create on example: - Eaque voluptatem omnis architecto cupiditate. @@ -7070,10 +7073,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - credentials SetCredentialHubspotRequestBody: @@ -7083,7 +7086,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -7093,7 +7096,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7103,8 +7106,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7114,9 +7117,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7126,10 +7129,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - credentials TwitterAdsConnection: @@ -7424,9 +7427,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Itaque quos voluptatibus quos accusantium fugit. - config: Qui molestias. - status: Excepturi saepe sit vel perspiciatis neque. + campaign_name: Ad voluptatem. + config: Et expedita itaque quos. + status: Tempore impedit. required: - campaign UpdateGoogleAdsRequestBody: @@ -7448,12 +7451,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. required: - config UpdateLinkedinAdsRequestBody: @@ -7464,7 +7467,7 @@ components: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" required: - config @@ -7476,9 +7479,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. required: - config UpdateMicrosoftAdsRequestBody: @@ -7488,9 +7491,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. required: - config UpdateRedditAdsRequestBody: @@ -7501,7 +7504,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. required: - config UpdateTwitterAdsRequestBody: @@ -7512,8 +7515,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. required: - config securitySchemes: diff --git a/design/brief.go b/design/brief.go index 949c5730..e58cf514 100644 --- a/design/brief.go +++ b/design/brief.go @@ -60,7 +60,12 @@ var CampaignCreateInput = Type("campaign-create-input", func() { // Constrain to the known providers so OpenAPI clients can discover the // valid values and Goa advertises them; the service also revalidates. Enum("google-ads", "linkedin-ads", "meta-ads", "reddit-ads", "twitter-ads", "microsoft-ads", "hubspot") - }), "Platforms to create campaigns on (binding selection)") + }), "Platforms to create campaigns on (binding selection)", func() { + // Reject an empty array in the schema (the handler also rejects it). Note: + // Goa/OpenAPI can't express uniqueItems, so duplicate rejection stays in + // the handler. + MinLength(1) + }) Attribute("config", Any, "Per-platform campaign configuration") Required("platforms") }) diff --git a/docs/knowledge/code/internal-service.md b/docs/knowledge/code/internal-service.md index ba20bef9..63e5af21 100644 --- a/docs/knowledge/code/internal-service.md +++ b/docs/knowledge/code/internal-service.md @@ -26,12 +26,15 @@ failure rather than risking a duplicate. Replacing a brief's content resets it t `draft` (re-approval required). Optimistic concurrency is enforced via version/If-Match (`428` when missing, `412` on mismatch). -Dispatch is durable (LFXV2-2665): each per-platform create runs under a -cross-replica Postgres advisory lock keyed on (brief, platform), so two -concurrent create-campaigns requests cannot both create an upstream campaign. -The orchestrator tracks in-flight runs and its `Shutdown` drains them (bounded) -before the DB pool closes, and on startup non-terminal jobs orphaned by a -restart are failed-forward (they cannot be safely resumed without provider -idempotency keys). +Dispatch is durable (LFXV2-2665): single-flight per (brief, platform) is +enforced by an atomic claim — `ClaimCampaignDispatch` does INSERT ... ON CONFLICT +DO NOTHING of a `pending` campaign row, so exactly one worker across replicas +wins the claim (the unique index arbitrates) with no held connection or blocking +lock. A worker that loses the claim reuses the existing row instead of dispatching +again; the pending row also survives an upstream-create-then-crash, making the +orphaned upstream campaign recoverable. The orchestrator tracks in-flight runs +and its `Shutdown` drains them (bounded) before the DB pool closes, and on +startup jobs left non-terminal beyond a staleness cutoff are failed-forward (they +cannot be safely resumed without provider idempotency keys). See [internal/service](../../../internal/service). diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index 808d5f1f..bc43e615 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -26,6 +26,13 @@ must also be mounted in `server.go`, or its routes 404 despite compiling. **Creation** — Added the `internal/platform/reddit` concept doc for the new Reddit Ads API v3 client (OAuth2 token refresh + Campaign -> Ad Group -> Ad creation) and listed it in the code index. +**Update** — Reworked LFXV2-2665 single-flight from a held-connection advisory +lock to an atomic claim row (INSERT ON CONFLICT DO NOTHING of a `pending` +campaign), removing the pool-exhaustion/blocking hazards of holding a connection +across the HTTP dispatch. The pending row is also the recovery signal for an +upstream-create-then-crash. Recovery scan uses a staleness cutoff so a rolling +deploy can't fail a job the old replica is still dispatching. + **Update** — Durable campaign dispatch (LFXV2-2665): per-platform dispatch now runs under a cross-replica Postgres advisory lock keyed on (brief, platform) so concurrent create-campaigns can't double-create upstream; the orchestrator diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index 474d1ad7..c9d2fdef 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -34,7 +34,7 @@ func UsageCommands() []string { // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + - os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + os.Args[0] + " " + "lfx-v2-campaign-service-svc readyz" + "\n" + "" } @@ -928,7 +928,7 @@ func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Et exercitationem soluta possimus a aliquid.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\",\n \"google-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"2bc32a4b-b934-4688-9631-d7caf5f559c6\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Facere et exercitationem.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"2bc32a4b-33c5-4283-be41-764e76dbf43b\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetCampaignUsage() { @@ -952,7 +952,7 @@ func lfxV2CampaignServiceBriefsGetCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"d144236c-9d18-4288-b0b2-5deae43e90e2\" --campaign-id \"e95d6c4f-dfbc-4182-aa9c-8445792b196a\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"4d408f04-2b77-4cc6-89c3-d1de8c2aff2f\" --campaign-id \"0e00e9a1-b853-4a76-b35a-79c53fbf76d6\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { @@ -980,7 +980,7 @@ func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Itaque quos voluptatibus quos accusantium fugit.\",\n \"config\": \"Qui molestias.\",\n \"status\": \"Excepturi saepe sit vel perspiciatis neque.\"\n }\n }' --project-id \"cncf\" --brief-id \"b6c4c830-3832-42db-832b-03028366023c\" --campaign-id \"65f21722-e8b5-454f-aa83-3f4f0e926aeb\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Ad voluptatem.\",\n \"config\": \"Et expedita itaque quos.\",\n \"status\": \"Tempore impedit.\"\n }\n }' --project-id \"cncf\" --brief-id \"5c18baaf-373e-4559-97ee-acbe7143a0b4\" --campaign-id \"1d09d573-4c48-4d65-8ccb-2c1c877e6d71\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsGetJobUsage() { @@ -1002,7 +1002,7 @@ func lfxV2CampaignServiceBriefsGetJobUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"9f5dd792-556c-463d-97d4-33c1852e49e3\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"90396306-a163-40f9-96e0-21f5cb20365a\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceConnectionsUsage displays the usage of the @@ -1076,7 +1076,7 @@ func lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetGoogleAdsUsage() { @@ -1182,7 +1182,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { @@ -1204,7 +1204,7 @@ func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetLinkedinAdsUsage() { @@ -1248,7 +1248,7 @@ func lfxV2CampaignServiceConnectionsUpdateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteLinkedinAdsUsage() { @@ -1310,7 +1310,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { @@ -1332,7 +1332,7 @@ func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n },\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMetaAdsUsage() { @@ -1376,7 +1376,7 @@ func lfxV2CampaignServiceConnectionsUpdateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMetaAdsUsage() { @@ -1438,7 +1438,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { @@ -1460,7 +1460,7 @@ func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n },\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n },\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetRedditAdsUsage() { @@ -1504,7 +1504,7 @@ func lfxV2CampaignServiceConnectionsUpdateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteRedditAdsUsage() { @@ -1566,7 +1566,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { @@ -1588,7 +1588,7 @@ func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n },\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n },\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetTwitterAdsUsage() { @@ -1632,7 +1632,7 @@ func lfxV2CampaignServiceConnectionsUpdateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteTwitterAdsUsage() { @@ -1694,7 +1694,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { @@ -1716,7 +1716,7 @@ func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMicrosoftAdsUsage() { @@ -1760,7 +1760,7 @@ func lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMicrosoftAdsUsage() { @@ -1822,7 +1822,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { @@ -1844,7 +1844,7 @@ func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetHubspotUsage() { @@ -1888,7 +1888,7 @@ func lfxV2CampaignServiceConnectionsUpdateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteHubspotUsage() { @@ -1950,7 +1950,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceSvcUsage displays the usage of the diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go index b8a96d4c..cb993f4e 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -220,7 +220,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Et exercitationem soluta possimus a aliquid.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\",\n \"google-ads\"\n ]\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Facere et exercitationem.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\"\n ]\n }\n }'") } if body.Input == nil { err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) @@ -310,7 +310,7 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateCampaignBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Itaque quos voluptatibus quos accusantium fugit.\",\n \"config\": \"Qui molestias.\",\n \"status\": \"Excepturi saepe sit vel perspiciatis neque.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Ad voluptatem.\",\n \"config\": \"Et expedita itaque quos.\",\n \"status\": \"Tempore impedit.\"\n }\n }'") } if body.Campaign == nil { err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index 57b873ba..ccbaabee 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -2413,6 +2413,9 @@ func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody if body.Platforms == nil { err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) } + if len(body.Platforms) < 1 { + err = goa.MergeErrors(err, goa.InvalidLengthError("body.platforms", body.Platforms, len(body.Platforms), 1, true)) + } for _, e := range body.Platforms { if !(e == "google-ads" || e == "linkedin-ads" || e == "meta-ads" || e == "reddit-ads" || e == "twitter-ads" || e == "microsoft-ads" || e == "hubspot") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.platforms[*]", e, []any{"google-ads", "linkedin-ads", "meta-ads", "reddit-ads", "twitter-ads", "microsoft-ads", "hubspot"})) diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 1f385af7..37128846 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -1703,6 +1703,9 @@ func ValidateCampaignCreateInputRequestBody(body *CampaignCreateInputRequestBody if body.Platforms == nil { err = goa.MergeErrors(err, goa.MissingFieldError("platforms", "body")) } + if len(body.Platforms) < 1 { + err = goa.MergeErrors(err, goa.InvalidLengthError("body.platforms", body.Platforms, len(body.Platforms), 1, true)) + } for _, e := range body.Platforms { if !(e == "google-ads" || e == "linkedin-ads" || e == "meta-ads" || e == "reddit-ads" || e == "twitter-ads" || e == "microsoft-ads" || e == "hubspot") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.platforms[*]", e, []any{"google-ads", "linkedin-ads", "meta-ads", "reddit-ads", "twitter-ads", "microsoft-ads", "hubspot"})) diff --git a/gen/http/lfx_v2_campaign_service_connections/client/cli.go b/gen/http/lfx_v2_campaign_service_connections/client/cli.go index 0ebcc5b4..c68bc75c 100644 --- a/gen/http/lfx_v2_campaign_service_connections/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_connections/client/cli.go @@ -24,7 +24,7 @@ func BuildCreateGoogleAdsPayload(lfxV2CampaignServiceConnectionsCreateGoogleAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -174,7 +174,7 @@ func BuildSetCredentialGoogleAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Quae porro qui rem autem quae.\",\n \"client_secret\": \"Nulla officia vitae perspiciatis eveniet.\",\n \"developer_token\": \"Nobis ut asperiores quo aut.\",\n \"refresh_token\": \"Fuga enim nihil.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -212,7 +212,7 @@ func BuildCreateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsCreateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -276,7 +276,7 @@ func BuildUpdateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsUpdateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Assumenda quam deleniti et et nam quia.\",\n \"org_id\": \"208777\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -363,7 +363,7 @@ func BuildSetCredentialLinkedinAdsPayload(lfxV2CampaignServiceConnectionsSetCred { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Sunt est labore libero.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -400,7 +400,7 @@ func BuildCreateMetaAdsPayload(lfxV2CampaignServiceConnectionsCreateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n },\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n },\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -463,7 +463,7 @@ func BuildUpdateMetaAdsPayload(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Deleniti voluptates non sint inventore.\",\n \"label\": \"Mollitia odio et dolor et consectetur.\",\n \"page_id\": \"Error ipsam maiores et maiores laudantium aut.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -548,7 +548,7 @@ func BuildSetCredentialMetaAdsPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Iure ut nostrum facilis suscipit.\",\n \"app_secret\": \"Porro voluptate.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -586,7 +586,7 @@ func BuildCreateRedditAdsPayload(lfxV2CampaignServiceConnectionsCreateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n },\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n },\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -650,7 +650,7 @@ func BuildUpdateRedditAdsPayload(lfxV2CampaignServiceConnectionsUpdateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Rerum adipisci.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -736,7 +736,7 @@ func BuildSetCredentialRedditAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Enim accusantium labore esse numquam.\",\n \"client_secret\": \"Non laudantium sunt minima repudiandae illo harum.\",\n \"refresh_token\": \"Dolorum deserunt.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -774,7 +774,7 @@ func BuildCreateTwitterAdsPayload(lfxV2CampaignServiceConnectionsCreateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n },\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n },\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -838,7 +838,7 @@ func BuildUpdateTwitterAdsPayload(lfxV2CampaignServiceConnectionsUpdateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Qui cupiditate ullam ab suscipit et.\",\n \"label\": \"Necessitatibus non iste ad rem quidem.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -924,7 +924,7 @@ func BuildSetCredentialTwitterAdsPayload(lfxV2CampaignServiceConnectionsSetCrede { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Quam officiis aut sit architecto ut unde.\",\n \"access_token_secret\": \"Sapiente possimus.\",\n \"consumer_key\": \"Harum corporis deleniti doloribus.\",\n \"consumer_secret\": \"Assumenda dignissimos beatae vitae aut ea dolor.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -962,7 +962,7 @@ func BuildCreateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsCreateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n },\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1027,7 +1027,7 @@ func BuildUpdateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsUpdateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptate necessitatibus enim et et itaque.\",\n \"customer_id\": \"Omnis mollitia aut.\",\n \"label\": \"Nobis omnis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1114,7 +1114,7 @@ func BuildSetCredentialMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsSetCre { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Quis et modi.\",\n \"client_secret\": \"Labore omnis provident nihil aut rerum est.\",\n \"developer_token\": \"Sint non.\",\n \"refresh_token\": \"Amet rem ab.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -1151,7 +1151,7 @@ func BuildCreateHubspotPayload(lfxV2CampaignServiceConnectionsCreateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1214,7 +1214,7 @@ func BuildUpdateHubspotPayload(lfxV2CampaignServiceConnectionsUpdateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Itaque fugit rerum cumque.\",\n \"brand_kit\": \"Ullam distinctio dolore velit.\",\n \"label\": \"Laudantium nostrum ratione id eius laborum aspernatur.\",\n \"portal_id\": \"Molestiae suscipit non iusto.\",\n \"sender_email\": \"Consequatur in vero soluta.\",\n \"sender_name\": \"Eius dicta.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1299,7 +1299,7 @@ func BuildSetCredentialHubspotPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Non assumenda perspiciatis.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 2c0d48c6..489e0ef2 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Molestiae est accusantium laudantium nostrum."},"event_details":{"description":"Extracted event/course details","example":"Non quo necessitatibus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Facere qui omnis."},"id":{"type":"string","description":"Brief UUID","example":"Beatae harum similique corporis id eum."},"keywords":{"description":"Keyword list","example":"Dolores sit."},"platforms":{"type":"array","items":{"type":"string","example":"Beatae quia qui excepturi minima."},"description":"Suggested default platforms","example":["Natus a.","Quod sunt quae et nesciunt iure quis.","Ut mollitia nihil ducimus."]},"program_type":{"type":"string","description":"Funnel context","example":"Facilis qui libero."},"project_id":{"type":"string","description":"Owning project","example":"Et itaque rem eos et deleniti dolores."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Exercitationem accusantium nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Enim vitae officia dolorem odio."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8012662392626135551,"format":"int64"}},"example":{"copy":"Sed veniam dolores quidem necessitatibus voluptatem.","event_details":"Earum minus autem omnis qui debitis eum.","event_slug":"Modi possimus consequatur.","id":"Ipsum voluptates pariatur magni atque.","keywords":"Sit reiciendis et vel beatae molestiae.","platforms":["Aspernatur illo accusamus.","Cupiditate mollitia hic vel ut."],"program_type":"Sit cupiditate non.","project_id":"Omnis doloremque at fugit dolor et.","status":"approved","targeting":"Natus vitae consequatur eos sit aut ut.","url":"Eveniet esse officia explicabo dolor deserunt.","version":6761108389050444243},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Vel inventore aliquid aut non eligendi accusamus."},"event_details":{"description":"Extracted event/course details","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos labore quia esse consectetur tenetur."},"keywords":{"description":"Keyword list","example":"Quod impedit accusamus incidunt minus veritatis enim."},"platforms":{"type":"array","items":{"type":"string","example":"Et recusandae possimus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Praesentium voluptate.","Qui impedit temporibus eveniet eos omnis cumque.","Ipsam ut sed natus et unde."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Hic est quia pariatur odit ullam."},"url":{"type":"string","description":"Event/course page URL","example":"Aliquam aut ut sit nisi architecto iure."}},"example":{"copy":"In aut nam rerum.","event_details":"Quae qui inventore dolorem deserunt.","event_slug":"Id corrupti sed quo perferendis nemo.","keywords":"Distinctio magnam.","platforms":["Voluptatem nihil quaerat asperiores pariatur.","Vel veritatis hic rerum accusamus velit error."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Quisquam nisi repellendus quos magnam aut."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et dolorem quod."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur hic voluptatem."},"id":{"type":"string","description":"Campaign UUID","example":"Placeat et minus et."},"platform":{"type":"string","description":"Channel","example":"Iusto fugit non asperiores quidem natus."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"status":{"type":"string","description":"Campaign status","example":"Omnis quidem dolor ipsum voluptas."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3737008917467127208,"format":"int64"}},"example":{"brief_id":"Ut sint non eum expedita non.","campaign_name":"Doloribus voluptas mollitia doloremque totam.","id":"Id ea.","platform":"Sit voluptatem ad ab.","platform_campaign_id":"Tempora dolor quis totam hic quibusdam eveniet.","project_id":"Dolorem necessitatibus neque consectetur occaecati earum.","status":"Veniam et ducimus quos amet.","version":1836828122944842672},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Nobis nam velit quis rem."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"]}},"example":{"config":"Architecto quae error.","platforms":["reddit-ads","twitter-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Doloremque commodi rerum esse."},"config":{"description":"Campaign configuration snapshot","example":"Laudantium quia."},"status":{"type":"string","description":"Campaign status","example":"Omnis totam eos non."}},"example":{"campaign_name":"Maxime recusandae.","config":"Laudantium error sit nihil iure officiis nemo.","status":"Accusamus debitis explicabo praesentium."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index f0a63ca4..4be6b82c 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -3458,39 +3458,40 @@ definitions: properties: copy: description: Ad copy - example: Molestiae est accusantium laudantium nostrum. + example: Ut mollitia nihil ducimus. event_details: description: Extracted event/course details - example: Non quo necessitatibus. + example: Sunt quae et nesciunt iure quis. event_slug: type: string description: Event/course slug - example: Facere qui omnis. + example: Possimus dolores dignissimos beatae velit laudantium. id: type: string description: Brief UUID - example: Beatae harum similique corporis id eum. + example: Officiis beatae sed aut. keywords: description: Keyword list - example: Dolores sit. + example: Non quo necessitatibus. platforms: type: array items: type: string - example: Beatae quia qui excepturi minima. + example: Id eum aut et itaque. description: Suggested default platforms example: - - Natus a. - - Quod sunt quae et nesciunt iure quis. - - Ut mollitia nihil ducimus. + - Et deleniti dolores libero facilis qui. + - Natus facere qui omnis et enim. + - Officia dolorem odio ut beatae quia qui. + - Minima illo dolores natus a sint. program_type: type: string description: Funnel context - example: Facilis qui libero. + example: Est fugiat aut dicta libero iure culpa. project_id: type: string description: Owning project - example: Et itaque rem eos et deleniti dolores. + example: Nihil est quia qui fugiat est. status: type: string description: Lifecycle status @@ -3501,31 +3502,31 @@ definitions: - archived targeting: description: Targeting recommendation - example: Exercitationem accusantium nihil. + example: Molestiae est accusantium laudantium nostrum. url: type: string description: Event/course page URL - example: Enim vitae officia dolorem odio. + example: Eum et aut quia beatae harum similique. version: type: integer description: Optimistic-concurrency version - example: 8012662392626135551 + example: 757787044039705195 format: int64 example: - copy: Sed veniam dolores quidem necessitatibus voluptatem. - event_details: Earum minus autem omnis qui debitis eum. - event_slug: Modi possimus consequatur. - id: Ipsum voluptates pariatur magni atque. - keywords: Sit reiciendis et vel beatae molestiae. + copy: Earum minus autem omnis qui debitis eum. + event_details: Cupiditate mollitia hic vel ut. + event_slug: Fugit dolor et natus sit cupiditate non. + id: Eos exercitationem. + keywords: Sed veniam dolores quidem necessitatibus voluptatem. platforms: + - Esse officia explicabo dolor deserunt aspernatur. - Aspernatur illo accusamus. - - Cupiditate mollitia hic vel ut. - program_type: Sit cupiditate non. - project_id: Omnis doloremque at fugit dolor et. + program_type: Pariatur magni atque amet omnis doloremque. + project_id: Nihil neque quod alias ipsum. status: approved - targeting: Natus vitae consequatur eos sit aut ut. - url: Eveniet esse officia explicabo dolor deserunt. - version: 6761108389050444243 + targeting: Sit reiciendis et vel beatae molestiae. + url: Modi possimus consequatur. + version: 5414041088513005988 required: - id - project_id @@ -3539,53 +3540,55 @@ definitions: properties: copy: description: Ad copy - example: Vel inventore aliquid aut non eligendi accusamus. + example: Ipsam ut sed natus et unde. event_details: description: Extracted event/course details - example: Explicabo repudiandae aut reiciendis recusandae molestias. + example: Qui impedit temporibus eveniet eos omnis cumque. event_slug: type: string description: Event/course slug (unique within the project) - example: Eos labore quia esse consectetur tenetur. + example: Eos sit aut. keywords: description: Keyword list - example: Quod impedit accusamus incidunt minus veritatis enim. + example: Explicabo repudiandae aut reiciendis recusandae molestias. platforms: type: array items: type: string - example: Et recusandae possimus. + example: Esse consectetur tenetur. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: + - Aut ut sit nisi architecto. + - Rerum et recusandae possimus quis. - Praesentium voluptate. - - Qui impedit temporibus eveniet eos omnis cumque. - - Ipsam ut sed natus et unde. program_type: type: string description: Funnel context - example: education + example: membership enum: - events - education - membership targeting: description: Targeting recommendation - example: Hic est quia pariatur odit ullam. + example: Vel inventore aliquid aut non eligendi accusamus. url: type: string description: Event/course page URL - example: Aliquam aut ut sit nisi architecto iure. + example: Est sed corrupti sit eos labore. example: - copy: In aut nam rerum. - event_details: Quae qui inventore dolorem deserunt. - event_slug: Id corrupti sed quo perferendis nemo. + copy: Quasi in aut nam rerum. + event_details: Error perferendis quae qui inventore dolorem. + event_slug: Impedit accusamus incidunt minus veritatis enim. keywords: Distinctio magnam. platforms: - - Voluptatem nihil quaerat asperiores pariatur. - - Vel veritatis hic rerum accusamus velit error. + - Id corrupti sed quo perferendis nemo. + - Quisquam nisi repellendus quos magnam aut. + - Id voluptatem nihil quaerat asperiores. + - Repellat vel veritatis hic rerum accusamus. program_type: membership targeting: Architecto deserunt vero ducimus distinctio. - url: Quisquam nisi repellendus quos magnam aut. + url: Hic est quia pariatur odit ullam. required: - program_type - event_slug @@ -3596,45 +3599,45 @@ definitions: brief_id: type: string description: Parent brief - example: Et dolorem quod. + example: Fugiat aliquid aspernatur voluptatem in cupiditate. campaign_name: type: string description: Campaign name - example: Consequatur hic voluptatem. + example: Nostrum atque illum nesciunt adipisci odit corrupti. id: type: string description: Campaign UUID - example: Placeat et minus et. + example: Architecto quae error. platform: type: string description: Channel - example: Iusto fugit non asperiores quidem natus. + example: Et dolorem quod. platform_campaign_id: type: string description: ID returned by the ad platform - example: Nostrum atque illum nesciunt adipisci odit corrupti. + example: Iusto fugit non asperiores quidem natus. project_id: type: string description: Owning project - example: Fugiat aliquid aspernatur voluptatem in cupiditate. + example: Placeat et minus et. status: type: string description: Campaign status - example: Omnis quidem dolor ipsum voluptas. + example: Consequatur hic voluptatem. version: type: integer description: Optimistic-concurrency version - example: 3737008917467127208 + example: 4612952422408203887 format: int64 example: - brief_id: Ut sint non eum expedita non. - campaign_name: Doloribus voluptas mollitia doloremque totam. - id: Id ea. - platform: Sit voluptatem ad ab. - platform_campaign_id: Tempora dolor quis totam hic quibusdam eveniet. - project_id: Dolorem necessitatibus neque consectetur occaecati earum. - status: Veniam et ducimus quos amet. - version: 1836828122944842672 + brief_id: Consectetur occaecati earum unde ut sint. + campaign_name: Hic quibusdam eveniet nostrum doloribus voluptas mollitia. + id: Quidem dolor ipsum. + platform: Eum expedita non voluptas sit. + platform_campaign_id: Ad ab quasi tempora dolor quis. + project_id: Sed occaecati id ea sunt dolorem necessitatibus. + status: Totam cum veniam. + version: 8632050897094076248 required: - id - project_id @@ -3649,7 +3652,7 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Nobis nam velit quis rem. + example: Ut nobis. platforms: type: array items: @@ -3667,12 +3670,11 @@ definitions: example: - meta-ads - google-ads - - reddit-ads + minItems: 1 example: - config: Architecto quae error. + config: Rem aliquam animi harum. platforms: - - reddit-ads - - twitter-ads + - hubspot required: - platforms CampaignUpdateInput: @@ -3682,18 +3684,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Doloremque commodi rerum esse. + example: Quos amet. config: description: Campaign configuration snapshot - example: Laudantium quia. + example: Quidem omnis totam eos non molestias. status: type: string description: Campaign status - example: Omnis totam eos non. + example: Quia doloremque commodi rerum. example: - campaign_name: Maxime recusandae. - config: Laudantium error sit nihil iure officiis nemo. - status: Accusamus debitis explicabo praesentium. + campaign_name: Quia iusto maxime. + config: Error sit nihil iure officiis nemo. + status: Illum accusamus debitis explicabo praesentium sint. required: - campaign_name - status @@ -4059,18 +4061,18 @@ definitions: $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. status: type: string description: Job status @@ -4085,18 +4087,18 @@ definitions: error: Aperiam facere voluptas quis nihil. job_id: Vel iste aut cum voluptatem. result: - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. status: partial required: - job_id @@ -4131,12 +4133,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Et exercitationem soluta possimus a aliquid. + config: Facere et exercitationem. platforms: - microsoft-ads - twitter-ads - google-ads - - google-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4169,9 +4170,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Itaque quos voluptatibus quos accusantium fugit. - config: Qui molestias. - status: Excepturi saepe sit vel perspiciatis neque. + campaign_name: Ad voluptatem. + config: Et expedita itaque quos. + status: Tempore impedit. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4188,10 +4189,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - config - credentials @@ -4205,14 +4206,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - config - credentials @@ -4227,10 +4228,10 @@ definitions: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - config - credentials @@ -4245,12 +4246,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - config - credentials @@ -4264,14 +4265,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. required: - config - credentials @@ -4286,11 +4287,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - config - credentials @@ -4305,13 +4306,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - config - credentials @@ -4323,10 +4324,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4337,7 +4338,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4348,7 +4349,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4359,8 +4360,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4371,10 +4372,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4385,9 +4386,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4398,10 +4399,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4425,12 +4426,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4442,7 +4443,7 @@ definitions: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" required: - config @@ -4455,9 +4456,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4468,9 +4469,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4482,7 +4483,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4494,8 +4495,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. required: - config LinkedinAdsConnection: diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index 099f11a8..95eac4a9 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"2df7b380-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Magnam veniam atque labore qui.","platforms":["Architecto dolorem sapiente repellendus aut.","Veritatis sint autem necessitatibus deleniti itaque.","Magnam dolorum voluptatem modi velit."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Recusandae aut perferendis.","campaign_name":"Corporis ut non.","id":"Ullam pariatur ex voluptas aspernatur.","platform":"Est eaque ipsam harum nisi nobis.","platform_campaign_id":"Et eveniet.","project_id":"Voluptates aliquam vero ducimus.","status":"Eius sed qui deserunt perspiciatis nihil.","version":5441532063507194963}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Provident officia officiis.","campaign_name":"Rerum ut necessitatibus illum ratione.","id":"Enim reiciendis sint neque.","platform":"Ut mollitia accusantium dignissimos.","platform_campaign_id":"Consequatur qui molestiae velit ratione nesciunt et.","project_id":"Rerum facilis quia molestiae ratione officia.","status":"Mollitia atque atque dolores accusantium non dolor.","version":9077221317587809922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Quis quis reprehenderit non quae omnis qui.","has_credentials":true,"id":"Dolor officia eligendi.","label":"At odio incidunt distinctio sint qui.","login_customer_id":"Quidem odio ab accusantium aut est deleniti.","project_id":"Provident dicta temporibus debitis.","status":"error","version":5571372049954177452}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Id temporibus et provident maiores neque quis.","has_credentials":false,"id":"Provident nobis soluta culpa vitae.","label":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","login_customer_id":"Eligendi ut.","project_id":"Excepturi deleniti voluptas aperiam vel.","status":"error","version":4162198444433663334}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Deserunt aliquam necessitatibus.","label":"In est.","login_customer_id":"Deserunt ipsum dolorum quas error.","project_id":"Ut et eligendi et numquam dolorum.","status":"error","version":3367774197321419764}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Fugit repellendus et accusamus sed non sequi.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Dolorem fugiat et aspernatur voluptatem nobis.","brand_kit":"Delectus ex aut quia.","has_credentials":false,"id":"Tempore sunt itaque omnis.","label":"Modi voluptatum veniam molestiae quibusdam.","portal_id":"Perferendis eveniet.","project_id":"Ex sunt sit beatae.","sender_email":"Voluptatibus quam dicta voluptate consequuntur voluptatem est.","sender_name":"Temporibus quis iste eaque ratione debitis nam.","status":"inactive","version":3577051025426830879}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Molestiae aut fugit alias.","brand_kit":"Architecto autem iste.","has_credentials":true,"id":"Ea ullam minima voluptatem vel deleniti.","label":"Vero at ut quis.","portal_id":"Non unde.","project_id":"Repudiandae necessitatibus dolorem enim beatae quia.","sender_email":"Dolorum nihil sunt doloremque explicabo.","sender_name":"Ut odio odio sed minus quia quia.","status":"active","version":8635749132548484011}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Velit fuga quos.","brand_kit":"Culpa est possimus dolores dignissimos.","has_credentials":true,"id":"Reprehenderit provident repudiandae sit.","label":"Ut sunt aliquam.","portal_id":"Sed aut quia nihil est quia.","project_id":"Aut aut eos magnam quisquam et.","sender_email":"Fugiat est itaque.","sender_name":"Fugiat aut dicta libero.","status":"active","version":2879571083312014203}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Laudantium error eum et aut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Ipsa quo vel architecto quas eligendi impedit.","has_credentials":false,"id":"Expedita voluptatum commodi fuga ipsa.","label":"Qui quidem exercitationem.","org_id":"Laudantium est ut soluta neque facilis est.","project_id":"Nostrum corporis quasi magnam.","status":"inactive","version":8731305521183611402}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Quam quis quam dolor occaecati earum iusto.","has_credentials":true,"id":"Occaecati et.","label":"Delectus voluptatem iste nisi in.","org_id":"Iste qui rerum est sed sed similique.","project_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","status":"active","version":6933590282461306362}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Quia quisquam corrupti distinctio voluptas eius.","has_credentials":true,"id":"Corrupti et nobis voluptas dignissimos.","label":"Ducimus modi ut culpa excepturi blanditiis.","org_id":"Distinctio sunt aliquid harum quis nam rerum.","project_id":"Illum et quisquam ex est facilis.","status":"inactive","version":3234333099728911322}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Sunt est labore libero."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Est rerum.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Pariatur debitis.","app_id":"Omnis neque autem ex eos.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","page_id":"Cupiditate quos hic.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Laboriosam qui id enim.","app_id":"Qui nobis et delectus quam.","has_credentials":true,"id":"Ipsa et dolore.","label":"Expedita dignissimos non sed omnis officiis et.","page_id":"Nihil corrupti repellat eius.","project_id":"Velit dolores omnis placeat unde distinctio ducimus.","status":"error","version":2384980829463304567}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Magnam ut similique ea minima magnam.","app_id":"Dolores est et recusandae nihil.","has_credentials":true,"id":"A necessitatibus molestiae.","label":"Repellat non suscipit veritatis sit tempore.","page_id":"Nam sit.","project_id":"Unde dicta autem dolorem qui explicabo.","status":"deleted","version":2040878603756169140}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Velit atque laudantium ullam rerum.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Vel ipsam dolores et.","customer_id":"Numquam omnis ullam facilis ab sapiente.","has_credentials":true,"id":"Omnis autem accusamus.","label":"Eligendi rerum numquam amet deserunt rem.","project_id":"Est assumenda aut.","status":"deleted","version":6442954210695633704}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Ipsa rerum velit et impedit.","customer_id":"Ut velit quam omnis.","has_credentials":true,"id":"Aut assumenda fugiat quia eaque dolor porro.","label":"Qui aut quas suscipit eos.","project_id":"Alias error aut maxime.","status":"inactive","version":5504009031361040663}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Enim id voluptas aperiam distinctio.","customer_id":"Ut et laboriosam.","has_credentials":false,"id":"Deleniti deserunt labore.","label":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","project_id":"Id aut et adipisci quo ut.","status":"inactive","version":171807855442490922}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Expedita voluptas qui eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Aperiam cum possimus.","has_credentials":false,"id":"Veniam consectetur deserunt in hic dolorum facere.","label":"Magni consequatur dignissimos itaque quia.","project_id":"Et reprehenderit dignissimos.","status":"error","version":3475949958922975875}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sed dolore dolorem voluptatibus.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Rem error.","funding_instrument_id":"Aperiam quos perferendis nisi blanditiis eveniet.","has_credentials":false,"id":"Aperiam et nihil.","label":"Distinctio amet enim.","project_id":"Perspiciatis porro.","status":"inactive","version":3440110816039158635}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Enim ut corporis dolorum consequatur eius.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Dolore ut non error aut.","job_id":"Vel natus provident.","result":[{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."},{"campaign_id":"Officia et sint numquam accusamus.","error":"Eos et architecto voluptas.","ok":false,"platform":"Consequatur et dignissimos ex quo praesentium voluptas."}],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ullam eaque suscipit harum."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads","reddit-ads"]}},"example":{"config":"Et veniam itaque optio consequatur nulla sint.","platforms":["reddit-ads","linkedin-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Et exercitationem soluta possimus a aliquid.","platforms":["microsoft-ads","twitter-ads","google-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."},"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"},"credentials":{"access_token":"Sunt est labore libero."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."},"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."},"credentials":{"client_id":"Quis et modi.","client_secret":"Labore omnis provident nihil aut rerum est.","developer_token":"Sint non.","refresh_token":"Amet rem ab."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."},"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."},"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Alias voluptatem ut consequatur ut recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"Qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Quae porro qui rem autem quae.","client_secret":"Nulla officia vitae perspiciatis eveniet.","developer_token":"Nobis ut asperiores quo aut.","refresh_token":"Fuga enim nihil."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Non assumenda perspiciatis."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Sunt est labore libero."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Iure ut nostrum facilis suscipit.","app_secret":"Porro voluptate."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Enim accusantium labore esse numquam.","client_secret":"Non laudantium sunt minima repudiandae illo harum.","refresh_token":"Dolorum deserunt."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Quam officiis aut sit architecto ut unde.","access_token_secret":"Sapiente possimus.","consumer_key":"Harum corporis deleniti doloribus.","consumer_secret":"Assumenda dignissimos beatae vitae aut ea dolor."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Itaque quos voluptatibus quos accusantium fugit.","config":"Qui molestias.","status":"Excepturi saepe sit vel perspiciatis neque."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Itaque fugit rerum cumque.","brand_kit":"Ullam distinctio dolore velit.","label":"Laudantium nostrum ratione id eius laborum aspernatur.","portal_id":"Molestiae suscipit non iusto.","sender_email":"Consequatur in vero soluta.","sender_name":"Eius dicta."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Assumenda quam deleniti et et nam quia.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Deleniti voluptates non sint inventore.","label":"Mollitia odio et dolor et consectetur.","page_id":"Error ipsam maiores et maiores laudantium aut."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Voluptate necessitatibus enim et et itaque.","customer_id":"Omnis mollitia aut.","label":"Nobis omnis."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Rerum adipisci."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Qui cupiditate ullam ab suscipit et.","label":"Necessitatibus non iste ad rem quidem."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 41282d2c..a0906ee4 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -222,7 +222,7 @@ paths: schema: type: string description: Brief UUID - example: 2df7b380-3594-4323-92b0-9a8e5a8fedcc + example: 52099480-3594-4323-92b0-9a8e5a8fedcc format: uuid example: 6d67841a-f263-4343-acd9-5ea22a27e47d responses: @@ -621,12 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Et exercitationem soluta possimus a aliquid. + config: Facere et exercitationem. platforms: - microsoft-ads - twitter-ads - google-ads - - google-ads responses: "202": description: Accepted response. @@ -635,11 +634,11 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Magnam veniam atque labore qui. + job_id: Et magni adipisci magnam veniam. platforms: - - Architecto dolorem sapiente repellendus aut. - - Veritatis sint autem necessitatibus deleniti itaque. - - Magnam dolorum voluptatem modi velit. + - Odio et corporis. + - Dolorem sapiente. + - Aut natus. status: queued "400": description: 'BadRequest: Bad request' @@ -741,14 +740,14 @@ paths: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Recusandae aut perferendis. - campaign_name: Corporis ut non. - id: Ullam pariatur ex voluptas aspernatur. - platform: Est eaque ipsam harum nisi nobis. - platform_campaign_id: Et eveniet. - project_id: Voluptates aliquam vero ducimus. - status: Eius sed qui deserunt perspiciatis nihil. - version: 5441532063507194963 + brief_id: Ex voluptas aspernatur aperiam voluptates aliquam. + campaign_name: Eaque ipsam harum nisi nobis et et. + id: Explicabo est totam qui praesentium ipsam. + platform: Ducimus neque. + platform_campaign_id: Aut perferendis natus. + project_id: Cum ipsum recusandae est adipisci ullam. + status: Excepturi corporis ut. + version: 9153915624091824945 "400": description: 'BadRequest: Bad request' content: @@ -849,9 +848,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Itaque quos voluptatibus quos accusantium fugit. - config: Qui molestias. - status: Excepturi saepe sit vel perspiciatis neque. + campaign_name: Ad voluptatem. + config: Et expedita itaque quos. + status: Tempore impedit. responses: "200": description: OK response. @@ -868,14 +867,14 @@ paths: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Provident officia officiis. - campaign_name: Rerum ut necessitatibus illum ratione. - id: Enim reiciendis sint neque. - platform: Ut mollitia accusantium dignissimos. - platform_campaign_id: Consequatur qui molestiae velit ratione nesciunt et. - project_id: Rerum facilis quia molestiae ratione officia. - status: Mollitia atque atque dolores accusantium non dolor. - version: 9077221317587809922 + brief_id: Et aut consequatur inventore enim reiciendis. + campaign_name: Ut mollitia accusantium dignissimos. + id: Ullam omnis autem. + platform: Neque ut rerum facilis quia molestiae ratione. + platform_campaign_id: Fugit provident officia officiis. + project_id: Id laboriosam nihil ea. + status: Consequatur qui molestiae velit ratione nesciunt et. + version: 476544424691753105 "400": description: 'BadRequest: Bad request' content: @@ -1022,14 +1021,14 @@ paths: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Quis quis reprehenderit non quae omnis qui. + account_id: Minima eaque earum. has_credentials: true - id: Dolor officia eligendi. - label: At odio incidunt distinctio sint qui. - login_customer_id: Quidem odio ab accusantium aut est deleniti. - project_id: Provident dicta temporibus debitis. - status: error - version: 5571372049954177452 + id: Excepturi deleniti voluptas aperiam vel. + label: Id temporibus et provident maiores neque quis. + login_customer_id: Assumenda ipsa dolor. + project_id: Laudantium amet veritatis rerum itaque consequatur laboriosam. + status: active + version: 8240960881778207137 "404": description: 'NotFound: Resource not found' content: @@ -1087,10 +1086,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. responses: "201": description: Created response. @@ -1107,14 +1106,14 @@ paths: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Id temporibus et provident maiores neque quis. - has_credentials: false - id: Provident nobis soluta culpa vitae. - label: Laudantium amet veritatis rerum itaque consequatur laboriosam. - login_customer_id: Eligendi ut. - project_id: Excepturi deleniti voluptas aperiam vel. + account_id: Nobis ut asperiores quo aut. + has_credentials: true + id: Nihil quae porro. + label: Nulla officia vitae perspiciatis eveniet. + login_customer_id: Dicta voluptate aut in. + project_id: Rem autem quae. status: error - version: 4162198444433663334 + version: 7743336992980724195 "400": description: 'BadRequest: Bad request' content: @@ -1205,14 +1204,14 @@ paths: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Eum est molestiae necessitatibus magni. + account_id: Quidem odio ab accusantium aut est deleniti. has_credentials: true - id: Deserunt aliquam necessitatibus. - label: In est. - login_customer_id: Deserunt ipsum dolorum quas error. - project_id: Ut et eligendi et numquam dolorum. - status: error - version: 3367774197321419764 + id: Odio incidunt distinctio sint. + label: Qui enim cumque saepe. + login_customer_id: Praesentium voluptatibus deserunt aliquam necessitatibus eos. + project_id: Aperiam quis quis reprehenderit non quae. + status: active + version: 5525678772225743935 "400": description: 'BadRequest: Bad request' content: @@ -1294,10 +1293,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. responses: "204": description: No Content response. @@ -1364,8 +1363,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Fugit repellendus et accusamus sed non sequi. - ok: true + message: Eligendi et. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1476,17 +1475,17 @@ paths: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: Dolorem fugiat et aspernatur voluptatem nobis. - brand_kit: Delectus ex aut quia. - has_credentials: false - id: Tempore sunt itaque omnis. - label: Modi voluptatum veniam molestiae quibusdam. - portal_id: Perferendis eveniet. - project_id: Ex sunt sit beatae. - sender_email: Voluptatibus quam dicta voluptate consequuntur voluptatem est. - sender_name: Temporibus quis iste eaque ratione debitis nam. - status: inactive - version: 3577051025426830879 + account_id: In ipsa tempore incidunt velit provident perspiciatis. + brand_kit: Aspernatur voluptatem nobis. + has_credentials: true + id: Nihil sunt doloremque. + label: Ea architecto autem iste. + portal_id: Omnis ut ex sunt. + project_id: Ut ut odio odio sed minus quia. + sender_email: Beatae ut modi voluptatum veniam. + sender_name: Quibusdam consequuntur dolorem fugiat. + status: deleted + version: 5861862348723710898 "404": description: 'NotFound: Resource not found' content: @@ -1540,14 +1539,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. responses: "201": description: Created response. @@ -1564,17 +1563,17 @@ paths: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Molestiae aut fugit alias. - brand_kit: Architecto autem iste. + account_id: Porro ut et cupiditate. + brand_kit: Animi molestiae aut fugit alias nisi qui. has_credentials: true - id: Ea ullam minima voluptatem vel deleniti. - label: Vero at ut quis. - portal_id: Non unde. - project_id: Repudiandae necessitatibus dolorem enim beatae quia. - sender_email: Dolorum nihil sunt doloremque explicabo. - sender_name: Ut odio odio sed minus quia quia. + id: Eius dicta. + label: Non assumenda perspiciatis. + portal_id: Voluptatem vel. + project_id: Ullam distinctio dolore velit. + sender_email: Dolore repudiandae necessitatibus dolorem. + sender_name: Beatae quia minus vero at ut. status: active - version: 8635749132548484011 + version: 2806381801577175312 "400": description: 'BadRequest: Bad request' content: @@ -1646,12 +1645,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. responses: "200": description: OK response. @@ -1668,17 +1667,17 @@ paths: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Velit fuga quos. - brand_kit: Culpa est possimus dolores dignissimos. - has_credentials: true - id: Reprehenderit provident repudiandae sit. - label: Ut sunt aliquam. - portal_id: Sed aut quia nihil est quia. - project_id: Aut aut eos magnam quisquam et. - sender_email: Fugiat est itaque. - sender_name: Fugiat aut dicta libero. - status: active - version: 2879571083312014203 + account_id: Debitis nam. + brand_kit: Aut aut eos magnam quisquam et. + has_credentials: false + id: Eveniet sint voluptatibus quam dicta. + label: Quis iste eaque. + portal_id: Quia distinctio consequatur dolore. + project_id: Consequuntur voluptatem est qui. + sender_email: Corporis consequatur voluptatem voluptates. + sender_name: Reprehenderit provident repudiandae sit. + status: error + version: 7483108258641908951 "400": description: 'BadRequest: Bad request' content: @@ -1760,7 +1759,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. responses: "204": description: No Content response. @@ -1827,8 +1826,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Laudantium error eum et aut. - ok: true + message: Sunt aliquam et velit fuga quos est. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -1939,14 +1938,14 @@ paths: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Ipsa quo vel architecto quas eligendi impedit. + account_id: Sed sed similique enim ea maiores. has_credentials: false - id: Expedita voluptatum commodi fuga ipsa. - label: Qui quidem exercitationem. - org_id: Laudantium est ut soluta neque facilis est. - project_id: Nostrum corporis quasi magnam. - status: inactive - version: 8731305521183611402 + id: In aperiam quam quis quam dolor. + label: Sit cupiditate nobis iste qui rerum. + org_id: Ratione expedita voluptatum commodi fuga ipsa quam. + project_id: Earum iusto. + status: active + version: 4984404630797976872 "404": description: 'NotFound: Resource not found' content: @@ -2001,10 +2000,10 @@ paths: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. responses: "201": description: Created response. @@ -2021,14 +2020,14 @@ paths: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Quam quis quam dolor occaecati earum iusto. - has_credentials: true - id: Occaecati et. - label: Delectus voluptatem iste nisi in. - org_id: Iste qui rerum est sed sed similique. - project_id: Natus expedita aspernatur consequuntur quod ducimus molestias. - status: active - version: 6933590282461306362 + account_id: Libero ut est rerum est occaecati et. + has_credentials: false + id: Error nulla fuga fugit repellendus et accusamus. + label: Nam quia aperiam sunt est. + org_id: Consequuntur quod. + project_id: Non sequi error assumenda quam deleniti et. + status: inactive + version: 5045833847874249009 "400": description: 'BadRequest: Bad request' content: @@ -2101,7 +2100,7 @@ paths: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" responses: "200": @@ -2119,14 +2118,14 @@ paths: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Quia quisquam corrupti distinctio voluptas eius. - has_credentials: true - id: Corrupti et nobis voluptas dignissimos. - label: Ducimus modi ut culpa excepturi blanditiis. - org_id: Distinctio sunt aliquid harum quis nam rerum. - project_id: Illum et quisquam ex est facilis. + account_id: Neque facilis est qui possimus eligendi. + has_credentials: false + id: Consequuntur qui quidem exercitationem. + label: Sed numquam necessitatibus laudantium est ut. + org_id: Et nobis voluptas dignissimos exercitationem illum. + project_id: Ipsa quo vel architecto quas eligendi impedit. status: inactive - version: 3234333099728911322 + version: 8080806383587730069 "400": description: 'BadRequest: Bad request' content: @@ -2208,7 +2207,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. responses: "204": description: No Content response. @@ -2275,7 +2274,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Est rerum. + message: Ex est facilis qui ducimus modi ut. ok: true "404": description: 'NotFound: Resource not found' @@ -2387,15 +2386,15 @@ paths: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Pariatur debitis. - app_id: Omnis neque autem ex eos. + account_id: Qui nobis et delectus quam. + app_id: Est dolor ut corporis. has_credentials: true - id: Est dolor ut corporis. - label: Illo vitae occaecati omnis. - page_id: Cupiditate quos hic. - project_id: Cupiditate ut illo dolor quaerat totam. - status: active - version: 1381780689877724774 + id: Laboriosam qui id enim. + label: Nihil corrupti repellat eius. + page_id: Aut fuga. + project_id: Magni repudiandae. + status: deleted + version: 2782071096062379507 "404": description: 'NotFound: Resource not found' content: @@ -2450,12 +2449,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. responses: "201": description: Created response. @@ -2472,15 +2471,15 @@ paths: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Laboriosam qui id enim. - app_id: Qui nobis et delectus quam. + account_id: Ad inventore voluptatum eligendi quasi. + app_id: Placeat unde distinctio ducimus qui. has_credentials: true - id: Ipsa et dolore. - label: Expedita dignissimos non sed omnis officiis et. - page_id: Nihil corrupti repellat eius. - project_id: Velit dolores omnis placeat unde distinctio ducimus. - status: error - version: 2384980829463304567 + id: Deleniti voluptates non sint inventore. + label: Porro voluptate. + page_id: Aperiam velit dolores. + project_id: Iure ut nostrum facilis suscipit. + status: inactive + version: 358292288538552244 "400": description: 'BadRequest: Bad request' content: @@ -2553,9 +2552,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. responses: "200": description: OK response. @@ -2572,15 +2571,15 @@ paths: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Magnam ut similique ea minima magnam. - app_id: Dolores est et recusandae nihil. - has_credentials: true - id: A necessitatibus molestiae. - label: Repellat non suscipit veritatis sit tempore. - page_id: Nam sit. - project_id: Unde dicta autem dolorem qui explicabo. + account_id: Quos hic doloribus. + app_id: Qui a necessitatibus molestiae qui unde. + has_credentials: false + id: Illo vitae occaecati omnis. + label: Explicabo possimus consequatur. + page_id: Eos velit eum et sint corrupti. + project_id: Pariatur debitis. status: deleted - version: 2040878603756169140 + version: 3363918130362824521 "400": description: 'BadRequest: Bad request' content: @@ -2662,8 +2661,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. responses: "204": description: No Content response. @@ -2730,7 +2729,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Velit atque laudantium ullam rerum. + message: Dolorem qui explicabo consequuntur repellat non suscipit. ok: false "404": description: 'NotFound: Resource not found' @@ -2842,14 +2841,14 @@ paths: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Vel ipsam dolores et. - customer_id: Numquam omnis ullam facilis ab sapiente. - has_credentials: true - id: Omnis autem accusamus. - label: Eligendi rerum numquam amet deserunt rem. - project_id: Est assumenda aut. + account_id: Dolor ut velit quam omnis et dolor. + customer_id: Vitae vel omnis autem accusamus mollitia. + has_credentials: false + id: Maxime dicta qui aut. + label: Velit et impedit facilis quaerat. + project_id: Suscipit eos nam ipsa. status: deleted - version: 6442954210695633704 + version: 443094643112211074 "404": description: 'NotFound: Resource not found' content: @@ -2903,14 +2902,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. responses: "201": description: Created response. @@ -2927,14 +2926,14 @@ paths: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Ipsa rerum velit et impedit. - customer_id: Ut velit quam omnis. + account_id: Repellendus porro et distinctio. + customer_id: Quia eaque. has_credentials: true - id: Aut assumenda fugiat quia eaque dolor porro. - label: Qui aut quas suscipit eos. - project_id: Alias error aut maxime. - status: inactive - version: 5504009031361040663 + id: Labore omnis provident nihil aut rerum est. + label: Sint non. + project_id: Amet rem ab. + status: error + version: 5425752825388180685 "400": description: 'BadRequest: Bad request' content: @@ -3006,9 +3005,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. responses: "200": description: OK response. @@ -3025,14 +3024,14 @@ paths: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Enim id voluptas aperiam distinctio. - customer_id: Ut et laboriosam. + account_id: Esse voluptate eum laboriosam distinctio non. + customer_id: Id aut et adipisci quo ut. has_credentials: false - id: Deleniti deserunt labore. - label: Deserunt voluptates ut culpa saepe necessitatibus veritatis. - project_id: Id aut et adipisci quo ut. + id: Rem quia vel ipsam dolores. + label: Ullam facilis ab sapiente voluptatem. + project_id: Et qui ut libero numquam. status: inactive - version: 171807855442490922 + version: 8626906144120400240 "400": description: 'BadRequest: Bad request' content: @@ -3114,10 +3113,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. responses: "204": description: No Content response. @@ -3184,7 +3183,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Expedita voluptas qui eaque. + message: Voluptates ut culpa saepe necessitatibus. ok: true "404": description: 'NotFound: Resource not found' @@ -3296,13 +3295,13 @@ paths: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Et rerum in expedita. - has_credentials: true - id: Voluptatum ducimus tempore quae eum consequatur dolore. - label: Quo veritatis quis delectus est. - project_id: Illum illum dolores tenetur ut illum. - status: active - version: 4673192311933251173 + account_id: Iusto omnis. + has_credentials: false + id: Odio totam cum deleniti placeat fuga. + label: Et ut quis ut. + project_id: Saepe voluptatem reiciendis pariatur. + status: error + version: 757606501996618102 "404": description: 'NotFound: Resource not found' content: @@ -3357,11 +3356,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. responses: "201": description: Created response. @@ -3378,13 +3377,13 @@ paths: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Iusto omnis. - has_credentials: false - id: Odio totam cum deleniti placeat fuga. - label: Et ut quis ut. - project_id: Saepe voluptatem reiciendis pariatur. - status: error - version: 757606501996618102 + account_id: Non laudantium sunt minima repudiandae illo harum. + has_credentials: true + id: Atque laudantium. + label: Enim accusantium labore esse numquam. + project_id: Rerum earum rerum adipisci. + status: inactive + version: 6816002535409129912 "400": description: 'BadRequest: Bad request' content: @@ -3457,7 +3456,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. responses: "200": description: OK response. @@ -3474,13 +3473,13 @@ paths: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Aperiam cum possimus. - has_credentials: false - id: Veniam consectetur deserunt in hic dolorum facere. - label: Magni consequatur dignissimos itaque quia. - project_id: Et reprehenderit dignissimos. - status: error - version: 3475949958922975875 + account_id: Et rerum in expedita. + has_credentials: true + id: Voluptatum ducimus tempore quae eum consequatur dolore. + label: Quo veritatis quis delectus est. + project_id: Illum illum dolores tenetur ut illum. + status: active + version: 4673192311933251173 "400": description: 'BadRequest: Bad request' content: @@ -3562,9 +3561,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. responses: "204": description: No Content response. @@ -3631,8 +3630,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sed dolore dolorem voluptatibus. - ok: false + message: Assumenda nesciunt distinctio eaque. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -3743,14 +3742,14 @@ paths: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Deserunt repellendus corrupti itaque quo sit. - funding_instrument_id: Eum et ipsum expedita reprehenderit eos. - has_credentials: false - id: Blanditiis mollitia dolores illo nostrum magnam. - label: Omnis nobis. - project_id: Nostrum tempore. - status: inactive - version: 6605548766358472787 + account_id: Id unde veritatis officiis aut fugiat. + funding_instrument_id: Voluptas tenetur nobis facere. + has_credentials: true + id: Eaque voluptate reprehenderit sed voluptatem sed illo. + label: Cum nisi numquam. + project_id: Praesentium tenetur quas at ut necessitatibus dolor. + status: active + version: 4642810346647163563 "404": description: 'NotFound: Resource not found' content: @@ -3805,13 +3804,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. responses: "201": description: Created response. @@ -3828,14 +3827,14 @@ paths: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Id unde veritatis officiis aut fugiat. - funding_instrument_id: Voluptas tenetur nobis facere. + account_id: Vitae aut ea. + funding_instrument_id: Aut sit architecto ut unde saepe. has_credentials: true - id: Eaque voluptate reprehenderit sed voluptatem sed illo. - label: Cum nisi numquam. - project_id: Praesentium tenetur quas at ut necessitatibus dolor. - status: active - version: 4642810346647163563 + id: Non iste ad rem quidem sunt qui. + label: Deleniti doloribus debitis assumenda dignissimos. + project_id: Ullam ab suscipit et labore harum. + status: error + version: 753723066786334950 "400": description: 'BadRequest: Bad request' content: @@ -3908,8 +3907,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. responses: "200": description: OK response. @@ -3926,14 +3925,14 @@ paths: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Rem error. - funding_instrument_id: Aperiam quos perferendis nisi blanditiis eveniet. + account_id: Deserunt repellendus corrupti itaque quo sit. + funding_instrument_id: Eum et ipsum expedita reprehenderit eos. has_credentials: false - id: Aperiam et nihil. - label: Distinctio amet enim. - project_id: Perspiciatis porro. + id: Blanditiis mollitia dolores illo nostrum magnam. + label: Omnis nobis. + project_id: Nostrum tempore. status: inactive - version: 3440110816039158635 + version: 6605548766358472787 "400": description: 'BadRequest: Bad request' content: @@ -4015,10 +4014,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. responses: "204": description: No Content response. @@ -4085,7 +4084,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Enim ut corporis dolorum consequatur eius. + message: Ut architecto deleniti nostrum sed aperiam. ok: true "404": description: 'NotFound: Resource not found' @@ -4151,18 +4150,22 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Dolore ut non error aut. - job_id: Vel natus provident. + error: Beatae est officia et sint. + job_id: Et dignissimos ex. result: - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - - campaign_id: Officia et sint numquam accusamus. - error: Eos et architecto voluptas. - ok: false - platform: Consequatur et dignissimos ex quo praesentium voluptas. - status: queued + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + - campaign_id: Et voluptatem voluptatem voluptatem. + error: Omnis doloribus qui. + ok: true + platform: Nobis velit in. + status: running "400": description: 'BadRequest: Bad request' content: @@ -4863,7 +4866,7 @@ components: properties: config: description: Per-platform campaign configuration - example: Ullam eaque suscipit harum. + example: Impedit ullam eaque suscipit harum sint neque. platforms: type: array items: @@ -4882,12 +4885,13 @@ components: - meta-ads - google-ads - reddit-ads - - reddit-ads + minItems: 1 example: - config: Et veniam itaque optio consequatur nulla sint. + config: Optio consequatur nulla sint qui alias voluptatem. platforms: - - reddit-ads - linkedin-ads + - reddit-ads + - google-ads required: - platforms CampaignUpdateInput: @@ -4989,12 +4993,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Et exercitationem soluta possimus a aliquid. + config: Facere et exercitationem. platforms: - microsoft-ads - twitter-ads - google-ads - - google-ads required: - input CreateGoogleAdsRequestBody: @@ -5010,10 +5013,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - config - credentials @@ -5026,14 +5029,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - config - credentials @@ -5047,10 +5050,10 @@ components: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - config - credentials @@ -5064,12 +5067,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - config - credentials @@ -5082,14 +5085,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. credentials: - client_id: Quis et modi. - client_secret: Labore omnis provident nihil aut rerum est. - developer_token: Sint non. - refresh_token: Amet rem ab. + client_id: Nisi blanditiis eveniet quasi ea. + client_secret: Ut corporis dolorum consequatur eius perferendis nobis. + developer_token: Et et itaque sunt. + refresh_token: Vel voluptate necessitatibus. required: - config - credentials @@ -5103,11 +5106,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - config - credentials @@ -5121,13 +5124,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - config - credentials @@ -5781,12 +5784,12 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Alias voluptatem ut consequatur ut recusandae. + example: Consequatur ut. platforms: type: array items: type: string - example: Qui mollitia et eum veniam. + example: Commodi qui mollitia et eum veniam. description: Platforms this job will create on example: - Eaque voluptatem omnis architecto cupiditate. @@ -7070,10 +7073,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Quae porro qui rem autem quae. - client_secret: Nulla officia vitae perspiciatis eveniet. - developer_token: Nobis ut asperiores quo aut. - refresh_token: Fuga enim nihil. + client_id: Natus provident est. + client_secret: Id dolore. + developer_token: Non error. + refresh_token: Accusamus aperiam eos et architecto voluptas rerum. required: - credentials SetCredentialHubspotRequestBody: @@ -7083,7 +7086,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Non assumenda perspiciatis. + private_app_token: Molestiae suscipit non iusto. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -7093,7 +7096,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Sunt est labore libero. + access_token: Eum est molestiae necessitatibus magni. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7103,8 +7106,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Iure ut nostrum facilis suscipit. - app_secret: Porro voluptate. + access_token: Eius est rerum illo mollitia. + app_secret: Et dolor et consectetur sint error. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7114,9 +7117,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Enim accusantium labore esse numquam. - client_secret: Non laudantium sunt minima repudiandae illo harum. - refresh_token: Dolorum deserunt. + client_id: Magnam ut similique ea minima magnam. + client_secret: Ut quo iure. + refresh_token: Sit est dolores est et. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7126,10 +7129,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Quam officiis aut sit architecto ut unde. - access_token_secret: Sapiente possimus. - consumer_key: Harum corporis deleniti doloribus. - consumer_secret: Assumenda dignissimos beatae vitae aut ea dolor. + access_token: Possimus et. + access_token_secret: Deserunt consequuntur omnis. + consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. + consumer_secret: Ut aperiam. required: - credentials TwitterAdsConnection: @@ -7424,9 +7427,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Itaque quos voluptatibus quos accusantium fugit. - config: Qui molestias. - status: Excepturi saepe sit vel perspiciatis neque. + campaign_name: Ad voluptatem. + config: Et expedita itaque quos. + status: Tempore impedit. required: - campaign UpdateGoogleAdsRequestBody: @@ -7448,12 +7451,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Itaque fugit rerum cumque. - brand_kit: Ullam distinctio dolore velit. - label: Laudantium nostrum ratione id eius laborum aspernatur. - portal_id: Molestiae suscipit non iusto. - sender_email: Consequatur in vero soluta. - sender_name: Eius dicta. + account_id: Voluptas aperiam. + brand_kit: Itaque fugit rerum cumque. + label: Dolores enim. + portal_id: Assumenda harum eos eveniet ut et laboriosam. + sender_email: Quos expedita voluptas qui eaque. + sender_name: Laudantium nostrum ratione id eius laborum aspernatur. required: - config UpdateLinkedinAdsRequestBody: @@ -7464,7 +7467,7 @@ components: example: config: account_id: "538170226" - label: Assumenda quam deleniti et et nam quia. + label: Dolorum consequatur in est. org_id: "208777" required: - config @@ -7476,9 +7479,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Deleniti voluptates non sint inventore. - label: Mollitia odio et dolor et consectetur. - page_id: Error ipsam maiores et maiores laudantium aut. + app_id: Distinctio sunt aliquid harum quis nam rerum. + label: Excepturi blanditiis officiis quia quisquam. + page_id: Distinctio voluptas eius error autem est. required: - config UpdateMicrosoftAdsRequestBody: @@ -7488,9 +7491,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Voluptate necessitatibus enim et et itaque. - customer_id: Omnis mollitia aut. - label: Nobis omnis. + account_id: Enim non rem error voluptas deserunt. + customer_id: Officiis aperiam quos. + label: Nihil dolores perspiciatis porro veniam distinctio. required: - config UpdateRedditAdsRequestBody: @@ -7501,7 +7504,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Rerum adipisci. + label: Sit tempore. required: - config UpdateTwitterAdsRequestBody: @@ -7512,8 +7515,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Qui cupiditate ullam ab suscipit et. - label: Necessitatibus non iste ad rem quidem. + funding_instrument_id: Deserunt in hic dolorum facere ipsa et. + label: Repellat veniam. required: - config securitySchemes: diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index 7618bdc6..bf124141 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -44,13 +44,17 @@ type CampaignReader interface { // ErrNotFound. Used to make dispatch idempotent: a brief already dispatched to // a platform must not create a second upstream (paid) campaign on retry. GetCampaignByPlatform(ctx context.Context, briefID string, platform model.Provider) (*model.Campaign, error) - // WithDispatchLock runs fn while holding a cross-connection (cross-replica) - // advisory lock keyed on (briefID, platform), serializing dispatch for that - // pair so two concurrent create-campaigns requests can't both create an - // upstream campaign. The lock is released when fn returns. fn's error is - // propagated; a failure to acquire the lock returns an error without running - // fn. - WithDispatchLock(ctx context.Context, briefID string, platform model.Provider, fn func(context.Context) error) error + // ClaimCampaignDispatch atomically claims the right to dispatch (brief, + // platform) by inserting a placeholder campaign row (status 'pending') via + // INSERT ... ON CONFLICT (brief_id, platform) DO NOTHING. Exactly one worker + // wins across all replicas — the (brief_id, platform) unique index arbitrates, + // with no held connection and no blocking lock. It returns: + // - claimed=true, row=the pending row → this worker owns the dispatch; + // - claimed=false, row=the existing row → another worker already claimed or + // completed it; the caller reuses that row instead of dispatching again. + // The placeholder row also survives an upstream-create-then-crash, making the + // orphan recoverable (its status stays 'pending'). + ClaimCampaignDispatch(ctx context.Context, projectID, briefID string, platform model.Provider, jobID string) (claimed bool, row *model.Campaign, err error) } // CampaignWriter mutates campaigns. diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index c8b95276..9ce53dd7 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -7,8 +7,6 @@ import ( "context" "errors" "fmt" - "log/slog" - "time" "github.com/jackc/pgx/v5" @@ -16,11 +14,6 @@ import ( "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" ) -// advisoryUnlockTimeout bounds the explicit advisory-lock release so a slow -// unlock can't wedge connection return; the lock also frees when the session -// ends, so this is a backstop. -const advisoryUnlockTimeout = 5 * time.Second - // CampaignRepo is a pgx-backed implementation of domain.CampaignRepository. type CampaignRepo struct { db *Pool @@ -31,48 +24,30 @@ func NewCampaignRepo(pool *Pool) *CampaignRepo { return &CampaignRepo{db: pool} var _ domain.CampaignRepository = (*CampaignRepo)(nil) -// WithDispatchLock runs fn while holding a SESSION-level Postgres advisory lock -// keyed on (briefID, platform), acquired on a dedicated pooled connection and -// released explicitly when fn returns. A session lock (not a transaction lock) -// is used deliberately: fn's own repository calls go through the shared pool -// (r.db) and commit independently, so the lock must live on a separate -// connection that stays held for fn's whole duration rather than being tied to a -// transaction fn isn't part of. Serialization is what matters — while one worker -// holds the lock, a second worker for the same pair blocks here, and once it -// proceeds its committed-read idempotency check sees the first worker's persisted -// row and reuses it. The lock is cross-replica (it lives in the database) and -// released even if fn panics (deferred Unlock + connection release). The two-key -// hashtext form makes distinct pairs rarely collide; a collision only serializes -// two unrelated pairs, which is harmless. -func (r *CampaignRepo) WithDispatchLock(ctx context.Context, briefID string, platform model.Provider, fn func(context.Context) error) error { - conn, err := r.db.Acquire(ctx) +// ClaimCampaignDispatch atomically claims the right to dispatch (brief, platform) +// by inserting a placeholder 'pending' campaign row. The (brief_id, platform) +// unique index makes the claim single-winner across all replicas without holding +// a connection or a blocking lock: INSERT ... ON CONFLICT DO NOTHING inserts a +// row (claimed) or does nothing (already claimed/completed). No RETURNING is used +// because ON CONFLICT DO NOTHING returns no row on conflict, so we detect the +// winner via RowsAffected and then read the current row to return it. +func (r *CampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, briefID string, platform model.Provider, jobID string) (bool, *model.Campaign, error) { + q := `INSERT INTO campaigns (project_id, brief_id, job_id, platform, campaign_name, status) + VALUES ($1, $2, $3, $4, '', 'pending') + ON CONFLICT (brief_id, platform) DO NOTHING` + tag, err := r.db.Exec(ctx, q, projectID, briefID, jobID, string(platform)) if err != nil { - return fmt.Errorf("acquire dispatch-lock connection: %w", err) + return false, nil, fmt.Errorf("claim campaign dispatch: %w", err) } - defer conn.Release() + claimed := tag.RowsAffected() == 1 - if _, err := conn.Exec(ctx, - `SELECT pg_advisory_lock(hashtext($1), hashtext($2))`, - briefID, string(platform), - ); err != nil { - return fmt.Errorf("acquire dispatch lock: %w", err) + row, gerr := r.GetCampaignByPlatform(ctx, briefID, platform) + if gerr != nil { + // The row must exist now (we or someone else just wrote it); a not-found + // here is a genuine error. + return claimed, nil, fmt.Errorf("read campaign after claim: %w", gerr) } - // Release the session lock on the same connection before returning it to the - // pool; use a background context so a cancelled ctx still frees the lock. - defer func() { - unlockCtx, cancel := context.WithTimeout(context.Background(), advisoryUnlockTimeout) - defer cancel() - if _, uerr := conn.Exec(unlockCtx, - `SELECT pg_advisory_unlock(hashtext($1), hashtext($2))`, - briefID, string(platform), - ); uerr != nil { - // The lock also frees when the session (connection) ends, so a failed - // explicit unlock is not fatal; surface it for diagnostics. - slog.WarnContext(ctx, "failed to release dispatch advisory lock", "brief_id", briefID, "platform", platform, "error", uerr) - } - }() - - return fn(ctx) + return claimed, row, nil } const campaignCols = `id::text, project_id::text, brief_id::text, job_id::text, platform, platform_campaign_id, campaign_name, diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 94894d48..d7740a4c 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -282,8 +282,8 @@ func (r *campaignEditRepo) GetCampaign(context.Context, string, string, string) func (r *campaignEditRepo) GetCampaignByPlatform(context.Context, string, model.Provider) (*model.Campaign, error) { return nil, domain.ErrNotFound } -func (r *campaignEditRepo) WithDispatchLock(ctx context.Context, _ string, _ model.Provider, fn func(context.Context) error) error { - return fn(ctx) +func (r *campaignEditRepo) ClaimCampaignDispatch(context.Context, string, string, model.Provider, string) (bool, *model.Campaign, error) { + return true, nil, nil } func (r *campaignEditRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { return c, nil diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index ffdc85e1..eab679d7 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -6,7 +6,6 @@ package service import ( "context" "encoding/json" - "errors" "log/slog" "sync" @@ -187,81 +186,73 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief *model.CampaignBrief, p model.Provider, config json.RawMessage) platformResult { res := platformResult{Platform: string(p)} - lockErr := o.campaigns.WithDispatchLock(ctx, brief.ID, p, func(ctx context.Context) error { - // Idempotency guard FIRST, before resolving the dispatcher, so an - // already-persisted platform is reported ok even if its dispatcher is no - // longer registered. Under the lock, a concurrent request's persisted row - // is visible here, closing the duplicate-create window. - if existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ID, p); lerr == nil { - if existing.PlatformCampaignID != "" { - res.OK = true - res.CampaignID = existing.PlatformCampaignID - return nil - } - } else if !errors.Is(lerr, domain.ErrNotFound) { - // Log the underlying repository error server-side; return a generic - // message so raw DB error text isn't surfaced to clients via GetJob. - slog.ErrorContext(ctx, "existing-campaign lookup failed", "platform", p, "job_id", jobID, "error", lerr) - res.Error = "could not verify existing campaign" - return nil + // Single-flight claim: atomically insert a 'pending' placeholder for (brief, + // platform). Exactly one worker across all replicas wins (the unique index + // arbitrates) — no held connection, no blocking lock. + claimed, existing, err := o.campaigns.ClaimCampaignDispatch(ctx, brief.ProjectID, brief.ID, p, jobID) + if err != nil { + slog.ErrorContext(ctx, "claim dispatch failed", "platform", p, "job_id", jobID, "error", err) + res.Error = "could not claim campaign dispatch" + return res + } + if !claimed { + // Another worker owns (or already completed) this pair. + if existing != nil && existing.PlatformCampaignID != "" { + // Already created upstream — reuse it (idempotent). + res.OK = true + res.CampaignID = existing.PlatformCampaignID + return res } + // Still pending elsewhere: don't dispatch again (that's the whole point of + // the claim). Report it as in-progress rather than a failure or a duplicate. + res.Error = "another dispatch for this platform is already in progress" + return res + } - d, ok := o.dispatchers[p] - if !ok { - res.Error = "no dispatcher registered for platform" - return nil - } - campaign, err := d.Dispatch(ctx, brief, p, config) - if err != nil { - // Log the raw dispatcher error (it may carry provider request/response - // detail or credentials) server-side, and store a stable, client-safe - // message in the job result, consistent with the persistence/panic paths. - slog.ErrorContext(ctx, "platform dispatch failed", "platform", p, "job_id", jobID, "error", err) - res.Error = "platform campaign creation failed" - return nil - } - if campaign == nil { - // Defensive: a dispatcher must return a non-nil campaign on success. - res.Error = "dispatcher returned no campaign" - return nil - } - if campaign.PlatformCampaignID == "" { - // A successful dispatch must yield an upstream campaign id; without one - // the result can't honestly be reported ok, and a later retry couldn't - // recognize it via the idempotency guard. Treat as a failure. - res.Error = "dispatcher returned no upstream campaign id" - return nil - } - // Stamp ownership before persisting so a dispatcher can't cause a campaign - // to be written with missing/wrong ownership. - campaign.JobID = &jobID - campaign.BriefID = brief.ID - campaign.ProjectID = brief.ProjectID - campaign.Platform = p - if _, err := o.campaigns.UpsertCampaign(ctx, campaign); err != nil { - // The upstream (paid) campaign was already created but we failed to - // persist its row. Log the raw error AND the orphaned upstream id at - // ERROR so the campaign is recoverable/reconcilable out of band — a - // bare retry would otherwise re-create it (the read-before-dispatch - // guard has no row to find). Store a client-safe message but keep the - // upstream id in the result so it isn't lost. Return the error so - // WithDispatchLock releases the lock and the caller records a failure. - slog.ErrorContext(ctx, "persist campaign failed after upstream create — orphaned upstream campaign", - "platform", p, "job_id", jobID, "platform_campaign_id", campaign.PlatformCampaignID, "error", err) - res.Error = "created upstream campaign but failed to record it; see logs" - res.CampaignID = campaign.PlatformCampaignID - return err - } - res.OK = true + // We own the claim (a 'pending' row now exists). From here, any early return + // leaves that pending row behind; it is the recoverable record of an + // in-progress/failed dispatch (recovered by the startup scan) and blocks a + // concurrent duplicate. + d, ok := o.dispatchers[p] + if !ok { + res.Error = "no dispatcher registered for platform" + return res + } + campaign, derr := d.Dispatch(ctx, brief, p, config) + if derr != nil { + // Log the raw dispatcher error (it may carry provider request/response + // detail or credentials) server-side; store a stable, client-safe message. + slog.ErrorContext(ctx, "platform dispatch failed", "platform", p, "job_id", jobID, "error", derr) + res.Error = "platform campaign creation failed" + return res + } + if campaign == nil { + res.Error = "dispatcher returned no campaign" + return res + } + if campaign.PlatformCampaignID == "" { + res.Error = "dispatcher returned no upstream campaign id" + return res + } + // Stamp ownership, then update the claimed row in place (Upsert on the same + // (brief, platform) fills in the real upstream id and status). + campaign.JobID = &jobID + campaign.BriefID = brief.ID + campaign.ProjectID = brief.ProjectID + campaign.Platform = p + if _, err := o.campaigns.UpsertCampaign(ctx, campaign); err != nil { + // The upstream (paid) campaign was created but recording it failed. The + // 'pending' claim row remains, so this is recoverable/reconcilable out of + // band and a duplicate can't be created behind the claim. Log the raw error + // and the orphaned upstream id; keep the id in the result. + slog.ErrorContext(ctx, "persist campaign failed after upstream create — pending claim retained", + "platform", p, "job_id", jobID, "platform_campaign_id", campaign.PlatformCampaignID, "error", err) + res.Error = "created upstream campaign but failed to record it; see logs" res.CampaignID = campaign.PlatformCampaignID - return nil - }) - if lockErr != nil && res.Error == "" { - // The lock itself failed (couldn't begin/acquire); record a generic failure. - slog.ErrorContext(ctx, "dispatch lock failed", "platform", p, "job_id", jobID, "error", lockErr) - res.Error = "could not acquire dispatch lock" - res.OK = false + return res } + res.OK = true + res.CampaignID = campaign.PlatformCampaignID return res } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index bded6043..69123e17 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -71,7 +71,7 @@ func (r *fakeJobRepo) FailStuckJobs(_ context.Context, jobErr string) (int64, er return n, nil } -// fakeCampaignRepo records upserted campaigns. +// fakeCampaignRepo records upserted campaigns and simulates the claim table. type fakeCampaignRepo struct { mu sync.Mutex upserted []*model.Campaign @@ -81,6 +81,8 @@ type fakeCampaignRepo struct { // byPlatformErr, when set, is returned by GetCampaignByPlatform to simulate a // transient lookup failure. byPlatformErr error + // claimErr, when set, is returned by ClaimCampaignDispatch. + claimErr error } func (r *fakeCampaignRepo) GetCampaign(context.Context, string, string, string) (*model.Campaign, error) { @@ -98,9 +100,26 @@ func (r *fakeCampaignRepo) GetCampaignByPlatform(_ context.Context, briefID stri } return nil, domain.ErrNotFound } -func (r *fakeCampaignRepo) WithDispatchLock(ctx context.Context, _ string, _ model.Provider, fn func(context.Context) error) error { - // No real lock in tests; just run fn. Serialization is exercised separately. - return fn(ctx) + +// ClaimCampaignDispatch simulates INSERT ... ON CONFLICT DO NOTHING: if an entry +// for (brief, platform) already exists it's a conflict (not claimed) returning +// the existing row; otherwise it inserts a pending placeholder and claims. +func (r *fakeCampaignRepo) ClaimCampaignDispatch(_ context.Context, projectID, briefID string, platform model.Provider, jobID string) (bool, *model.Campaign, error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.claimErr != nil { + return false, nil, r.claimErr + } + key := briefID + "|" + string(platform) + if c, ok := r.existing[key]; ok { + return false, c, nil + } + pending := &model.Campaign{ProjectID: projectID, BriefID: briefID, Platform: platform, JobID: &jobID, Status: "pending"} + if r.existing == nil { + r.existing = map[string]*model.Campaign{} + } + r.existing[key] = pending + return true, pending, nil } func (r *fakeCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { @@ -268,12 +287,12 @@ func TestOrchestrator_SkipsAlreadyDispatchedPlatform(t *testing.T) { } } -// TestOrchestrator_TransientLookupErrorIsFailure verifies that a transient error -// from the existing-campaign lookup is recorded as a platform failure rather -// than proceeding to a create that could duplicate. -func TestOrchestrator_TransientLookupErrorIsFailure(t *testing.T) { +// TestOrchestrator_ClaimErrorIsFailure verifies that a failure to claim the +// dispatch slot is recorded as a platform failure and the dispatcher is never +// called (so no create can duplicate). +func TestOrchestrator_ClaimErrorIsFailure(t *testing.T) { jobs := newFakeJobRepo() - camps := &fakeCampaignRepo{byPlatformErr: errors.New("db down")} + camps := &fakeCampaignRepo{claimErr: errors.New("db down")} disp := &countingDispatcher{} orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ model.ProviderGoogleAds: disp, @@ -288,7 +307,36 @@ func TestOrchestrator_TransientLookupErrorIsFailure(t *testing.T) { calls := disp.calls disp.mu.Unlock() if calls != 0 { - t.Errorf("Dispatch called %d times, want 0 (must not create when lookup is uncertain)", calls) + t.Errorf("Dispatch called %d times, want 0 (must not create when the claim failed)", calls) + } +} + +// TestOrchestrator_AlreadyClaimedPendingSkips verifies that when another worker +// holds the pending claim (no upstream id yet), this worker does not dispatch. +func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { + jobs := newFakeJobRepo() + // Seed a pending claim (no upstream id) for the pair, so ClaimCampaignDispatch + // returns not-claimed with a still-pending row. + camps := &fakeCampaignRepo{existing: map[string]*model.Campaign{ + "b1|" + string(model.ProviderGoogleAds): {ID: "c1", Status: "pending", PlatformCampaignID: ""}, + }} + disp := &countingDispatcher{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: disp, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + // A single in-progress platform aggregates to failed (not ok), and the + // dispatcher must not have been called. + disp.mu.Lock() + calls := disp.calls + disp.mu.Unlock() + if calls != 0 { + t.Errorf("Dispatch called %d times, want 0 (another worker holds the claim)", calls) + } + if !strings.Contains(string(j.Result), "already in progress") { + t.Errorf("result = %s, want an in-progress message", j.Result) } } @@ -421,25 +469,25 @@ func TestOrchestrator_PersistErrorIsSanitized(t *testing.T) { } } -// lockCountingCampaignRepo records that WithDispatchLock wrapped the dispatch. -type lockCountingCampaignRepo struct { +// claimCountingCampaignRepo records that each dispatch went through the claim. +type claimCountingCampaignRepo struct { fakeCampaignRepo - mu sync.Mutex - locks int + cmu sync.Mutex + claims int } -func (r *lockCountingCampaignRepo) WithDispatchLock(ctx context.Context, briefID string, p model.Provider, fn func(context.Context) error) error { - r.mu.Lock() - r.locks++ - r.mu.Unlock() - return fn(ctx) +func (r *claimCountingCampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, briefID string, p model.Provider, jobID string) (bool, *model.Campaign, error) { + r.cmu.Lock() + r.claims++ + r.cmu.Unlock() + return r.fakeCampaignRepo.ClaimCampaignDispatch(ctx, projectID, briefID, p, jobID) } -// TestOrchestrator_DispatchRunsUnderLock verifies dispatch is wrapped in the -// (brief, platform) advisory lock. -func TestOrchestrator_DispatchRunsUnderLock(t *testing.T) { +// TestOrchestrator_DispatchGoesThroughClaim verifies each per-platform dispatch +// claims the (brief, platform) single-flight slot. +func TestOrchestrator_DispatchGoesThroughClaim(t *testing.T) { jobs := newFakeJobRepo() - camps := &lockCountingCampaignRepo{} + camps := &claimCountingCampaignRepo{} orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ model.ProviderGoogleAds: okDispatcher{}, model.ProviderLinkedInAds: okDispatcher{}, @@ -447,10 +495,10 @@ func TestOrchestrator_DispatchRunsUnderLock(t *testing.T) { brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) waitForTerminal(t, jobs, id) - camps.mu.Lock() - defer camps.mu.Unlock() - if camps.locks != 2 { - t.Errorf("WithDispatchLock called %d times, want 2 (one per platform)", camps.locks) + camps.cmu.Lock() + defer camps.cmu.Unlock() + if camps.claims != 2 { + t.Errorf("ClaimCampaignDispatch called %d times, want 2 (one per platform)", camps.claims) } } From ea1e213bf1b3c3862f7f4893e930540d92acd9fe Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 18:09:10 -0700 Subject: [PATCH 17/46] fix(review): cancel in-flight runs on drain timeout; document orphan campaign_id (PR #11) - Shutdown now cancels in-flight dispatch runs (via a shared root context the orchestrator owns) when the drain deadline expires, instead of merely stopping to wait and leaving them running against a closing pool. Runs are parented on that root context rather than context.WithoutCancel. - design: document that PlatformResult.campaign_id is present when ok AND on the specific create-succeeded-but-persist-failed path (so the orphaned upstream id isn't lost), matching the implementation. Test: shutdown drain timeout cancels the dispatch context. gen/ regenerated; build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- .../kodata/gen/http/openapi.json | 2 +- .../kodata/gen/http/openapi.yaml | 2 +- .../kodata/gen/http/openapi3.json | 2 +- .../kodata/gen/http/openapi3.yaml | 2 +- design/brief.go | 2 +- .../client/types.go | 4 +- .../server/types.go | 4 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 2 +- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 2 +- gen/lfx_v2_campaign_service_briefs/service.go | 4 +- internal/service/orchestrator.go | 27 ++++++++---- internal/service/orchestrator_test.go | 42 +++++++++++++++++++ 14 files changed, 80 insertions(+), 19 deletions(-) diff --git a/cmd/campaign-service/kodata/gen/http/openapi.json b/cmd/campaign-service/kodata/gen/http/openapi.json index 489e0ef2..44812a60 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.json +++ b/cmd/campaign-service/kodata/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi.yaml b/cmd/campaign-service/kodata/gen/http/openapi.yaml index 4be6b82c..816318a4 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi.yaml @@ -4838,7 +4838,7 @@ definitions: properties: campaign_id: type: string - description: Upstream platform campaign id (present when ok) + description: Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost. example: Ex et alias ea asperiores quas. error: type: string diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.json b/cmd/campaign-service/kodata/gen/http/openapi3.json index 95eac4a9..e9c5187f 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.json +++ b/cmd/campaign-service/kodata/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/cmd/campaign-service/kodata/gen/http/openapi3.yaml b/cmd/campaign-service/kodata/gen/http/openapi3.yaml index a0906ee4..609c0b00 100644 --- a/cmd/campaign-service/kodata/gen/http/openapi3.yaml +++ b/cmd/campaign-service/kodata/gen/http/openapi3.yaml @@ -6739,7 +6739,7 @@ components: properties: campaign_id: type: string - description: Upstream platform campaign id (present when ok) + description: Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost. example: Laudantium dolor ipsam recusandae maxime. error: type: string diff --git a/design/brief.go b/design/brief.go index e58cf514..5bb26258 100644 --- a/design/brief.go +++ b/design/brief.go @@ -86,7 +86,7 @@ var JobCreateResponse = Type("job-create-response", func() { var PlatformResult = Type("platform-result", func() { Attribute("platform", String, "Platform this result is for") Attribute("ok", Boolean, "Whether the campaign was created (or reused) successfully") - Attribute("campaign_id", String, "Upstream platform campaign id (present when ok)") + Attribute("campaign_id", String, "Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.") Attribute("error", String, "Failure reason (present when not ok)") Required("platform", "ok") }) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index ccbaabee..dd9f3ce4 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -779,7 +779,9 @@ type PlatformResultResponseBody struct { Platform *string `form:"platform,omitempty" json:"platform,omitempty" xml:"platform,omitempty"` // Whether the campaign was created (or reused) successfully OK *bool `form:"ok,omitempty" json:"ok,omitempty" xml:"ok,omitempty"` - // Upstream platform campaign id (present when ok) + // Upstream platform campaign id. Present when ok; also set on the specific + // failure where the upstream campaign was created but recording it failed, so + // the orphaned id isn't lost. CampaignID *string `form:"campaign_id,omitempty" json:"campaign_id,omitempty" xml:"campaign_id,omitempty"` // Failure reason (present when not ok) Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 37128846..93e9dadf 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -738,7 +738,9 @@ type PlatformResultResponseBody struct { Platform string `form:"platform" json:"platform" xml:"platform"` // Whether the campaign was created (or reused) successfully OK bool `form:"ok" json:"ok" xml:"ok"` - // Upstream platform campaign id (present when ok) + // Upstream platform campaign id. Present when ok; also set on the specific + // failure where the upstream campaign was created but recording it failed, so + // the orphaned id isn't lost. CampaignID *string `form:"campaign_id,omitempty" json:"campaign_id,omitempty" xml:"campaign_id,omitempty"` // Failure reason (present when not ok) Error *string `form:"error,omitempty" json:"error,omitempty" xml:"error,omitempty"` diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 489e0ef2..44812a60 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 4be6b82c..816318a4 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -4838,7 +4838,7 @@ definitions: properties: campaign_id: type: string - description: Upstream platform campaign id (present when ok) + description: Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost. example: Ex et alias ea asperiores quas. error: type: string diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index 95eac4a9..e9c5187f 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id (present when ok)","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index a0906ee4..609c0b00 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -6739,7 +6739,7 @@ components: properties: campaign_id: type: string - description: Upstream platform campaign id (present when ok) + description: Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost. example: Laudantium dolor ipsam recusandae maxime. error: type: string diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index edcc4ec8..128f2591 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -258,7 +258,9 @@ type PlatformResult struct { Platform string // Whether the campaign was created (or reused) successfully OK bool - // Upstream platform campaign id (present when ok) + // Upstream platform campaign id. Present when ok; also set on the specific + // failure where the upstream campaign was created but recording it failed, so + // the orphaned id isn't lost. CampaignID *string // Failure reason (present when not ok) Error *string diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index eab679d7..8bf1f5f0 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -38,9 +38,14 @@ type Orchestrator struct { // process (and the DB pool) goes away. mu guards the shutting-down flag so a // Start racing with Shutdown either registers on wg or is rejected, never // launches an untracked goroutine after Shutdown has stopped waiting. - mu sync.Mutex - wg sync.WaitGroup - draining bool + // rootCtx/rootCancel parent every dispatch run so Shutdown can cancel them if + // the drain deadline expires (rather than leaving them running against a + // closing pool). + mu sync.Mutex + wg sync.WaitGroup + draining bool + rootCtx context.Context + rootCancel context.CancelFunc } // NewOrchestrator constructs an Orchestrator. dispatchers may be empty; a @@ -49,14 +54,17 @@ func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobReposit if dispatchers == nil { dispatchers = map[model.Provider]PlatformDispatcher{} } - return &Orchestrator{campaigns: campaigns, jobs: jobs, dispatchers: dispatchers} + rootCtx, rootCancel := context.WithCancel(context.Background()) + return &Orchestrator{campaigns: campaigns, jobs: jobs, dispatchers: dispatchers, rootCtx: rootCtx, rootCancel: rootCancel} } // Shutdown waits (bounded by ctx) for in-flight dispatch runs to finish, so a // graceful shutdown doesn't close the database pool out from under a dispatch // that already created an upstream campaign but hasn't persisted it yet. After -// Shutdown is called, Start rejects new work. Returns ctx.Err() if the deadline -// elapses before all runs complete. +// Shutdown is called, Start rejects new work. If the drain deadline (ctx) +// elapses first, it cancels the in-flight runs (via the shared root context) so +// they stop promptly instead of running against a closing pool, and returns +// ctx.Err(). func (o *Orchestrator) Shutdown(ctx context.Context) error { o.mu.Lock() o.draining = true @@ -69,8 +77,10 @@ func (o *Orchestrator) Shutdown(ctx context.Context) error { }() select { case <-done: + o.rootCancel() return nil case <-ctx.Done(): + o.rootCancel() // stop in-flight runs rather than leaving them detached return ctx.Err() } } @@ -106,7 +116,10 @@ func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, pl return "", err } - dispatchCtx := context.WithoutCancel(ctx) + // Parent the run on the orchestrator's root context (not the request context), + // so it survives the request ending but can still be cancelled by Shutdown if + // the drain deadline expires. + dispatchCtx := o.rootCtx go func() { defer o.wg.Done() o.run(dispatchCtx, job.ID, brief, platforms, config) diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 69123e17..4c1fce06 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -588,3 +588,45 @@ func TestFailStuckJobs(t *testing.T) { t.Error("non-terminal jobs were not failed") } } + +// TestOrchestrator_ShutdownCancelsOnTimeout verifies that when the drain deadline +// expires, Shutdown cancels the in-flight run's context (rather than leaving it +// running against a closing pool). +func TestOrchestrator_ShutdownCancelsOnTimeout(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + ctxSeen := make(chan context.Context, 1) + disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + <-disp.started + dctx := <-ctxSeen + + // Drain with an already-past deadline so Shutdown times out immediately and + // cancels the run context. + deadctx, cancel := context.WithTimeout(context.Background(), time.Millisecond) + defer cancel() + _ = orch.Shutdown(deadctx) + + select { + case <-dctx.Done(): + // good: the dispatch context was cancelled by Shutdown's timeout path. + case <-time.After(time.Second): + t.Error("dispatch context was not cancelled after drain timeout") + } + close(disp.release) +} + +type ctxCapturingDispatcher struct { + started chan struct{} + release chan struct{} + ctxSeen chan context.Context +} + +func (d *ctxCapturingDispatcher) Dispatch(ctx context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + d.ctxSeen <- ctx + close(d.started) + <-d.release + return &model.Campaign{PlatformCampaignID: "pc-" + string(p), Status: "active", CampaignName: "n"}, nil +} From 86fb436ff82dad0103c5757ecf6b0a43905af227 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 18:17:02 -0700 Subject: [PATCH 18/46] fix(review): claim safety, global dispatch limit (PR #11) - Resolve the dispatcher and reuse an already-completed campaign BEFORE claiming, so a platform with no registered dispatcher (the current default) never leaves a permanent 'pending' claim row that blocks the pair forever. - Release the pending claim (DeleteDispatchClaim, status='pending'-guarded, so it can never delete a created campaign) when dispatch fails before the upstream campaign is created, so a transient failure doesn't block retries. - Bound concurrent provider dispatches process-wide with a shared semaphore in the orchestrator; the per-job errgroup SetLimit let N concurrent jobs each get maxParallelDispatch slots, leaving total provider calls unbounded. Tests: no-dispatcher leaves no pending claim; existing behaviors preserved. gen/ unchanged; build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- docs/knowledge/log.md | 8 +++ internal/domain/brief_port.go | 5 ++ .../infrastructure/postgres/campaign_repo.go | 11 +++ internal/service/brief_test.go | 3 + internal/service/orchestrator.go | 69 +++++++++++++++---- internal/service/orchestrator_test.go | 29 ++++++++ 6 files changed, 113 insertions(+), 12 deletions(-) diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index bc43e615..6bf7a4e0 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -26,6 +26,14 @@ must also be mounted in `server.go`, or its routes 404 despite compiling. **Creation** — Added the `internal/platform/reddit` concept doc for the new Reddit Ads API v3 client (OAuth2 token refresh + Campaign -> Ad Group -> Ad creation) and listed it in the code index. +**Update** — Hardened claim-based dispatch: resolve the dispatcher and reuse an +already-completed campaign BEFORE claiming (so a no-dispatcher platform never +leaves a permanent pending claim), release the pending claim if dispatch fails +before the upstream campaign is created, and bound concurrent provider calls with +a process-wide semaphore (previously the per-job errgroup limit let N concurrent +jobs each get maxParallelDispatch slots). Shutdown cancels in-flight runs on +drain timeout. + **Update** — Reworked LFXV2-2665 single-flight from a held-connection advisory lock to an atomic claim row (INSERT ON CONFLICT DO NOTHING of a `pending` campaign), removing the pool-exhaustion/blocking hazards of holding a connection diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index bf124141..96e09e2a 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -55,6 +55,11 @@ type CampaignReader interface { // The placeholder row also survives an upstream-create-then-crash, making the // orphan recoverable (its status stays 'pending'). ClaimCampaignDispatch(ctx context.Context, projectID, briefID string, platform model.Provider, jobID string) (claimed bool, row *model.Campaign, err error) + // DeleteDispatchClaim removes a still-'pending' claim row for (brief, platform) + // so the pair can be retried after a dispatch fails before the upstream + // campaign is created. It only deletes rows still in 'pending' status, so it + // can never remove a real (created) campaign. + DeleteDispatchClaim(ctx context.Context, briefID string, platform model.Provider) error } // CampaignWriter mutates campaigns. diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index 9ce53dd7..2ab5e0c8 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -50,6 +50,17 @@ func (r *CampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, bri return claimed, row, nil } +// DeleteDispatchClaim removes a still-'pending' claim row so a failed dispatch +// doesn't permanently block the (brief, platform) pair. The status guard means +// it can only ever delete a placeholder claim, never a created campaign. +func (r *CampaignRepo) DeleteDispatchClaim(ctx context.Context, briefID string, platform model.Provider) error { + q := `DELETE FROM campaigns WHERE brief_id=$1 AND platform=$2 AND status='pending'` + if _, err := r.db.Exec(ctx, q, briefID, string(platform)); err != nil { + return fmt.Errorf("delete dispatch claim: %w", err) + } + return nil +} + const campaignCols = `id::text, project_id::text, brief_id::text, job_id::text, platform, platform_campaign_id, campaign_name, status, budget_amount, budget_type, start_date, end_date, config_snapshot, result, version, created_at, updated_at` diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index d7740a4c..2721cd29 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -285,6 +285,9 @@ func (r *campaignEditRepo) GetCampaignByPlatform(context.Context, string, model. func (r *campaignEditRepo) ClaimCampaignDispatch(context.Context, string, string, model.Provider, string) (bool, *model.Campaign, error) { return true, nil, nil } +func (r *campaignEditRepo) DeleteDispatchClaim(context.Context, string, model.Provider) error { + return nil +} func (r *campaignEditRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { return c, nil } diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 8bf1f5f0..cdc4723f 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -46,6 +46,10 @@ type Orchestrator struct { draining bool rootCtx context.Context rootCancel context.CancelFunc + // sem is a process-wide semaphore bounding concurrent provider dispatches + // across ALL jobs (a per-job errgroup limit would let N concurrent jobs each + // get maxParallelDispatch slots, leaving total provider calls unbounded). + sem chan struct{} } // NewOrchestrator constructs an Orchestrator. dispatchers may be empty; a @@ -55,7 +59,14 @@ func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobReposit dispatchers = map[model.Provider]PlatformDispatcher{} } rootCtx, rootCancel := context.WithCancel(context.Background()) - return &Orchestrator{campaigns: campaigns, jobs: jobs, dispatchers: dispatchers, rootCtx: rootCtx, rootCancel: rootCancel} + return &Orchestrator{ + campaigns: campaigns, + jobs: jobs, + dispatchers: dispatchers, + rootCtx: rootCtx, + rootCancel: rootCancel, + sem: make(chan struct{}, maxParallelDispatch), + } } // Shutdown waits (bounded by ctx) for in-flight dispatch runs to finish, so a @@ -139,7 +150,6 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa results := make([]platformResult, len(platforms)) g, gctx := errgroup.WithContext(ctx) - g.SetLimit(maxParallelDispatch) for i, p := range platforms { i, p := i, p @@ -148,6 +158,18 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa // return a non-nil error from the group; failures are recorded. res := platformResult{Platform: string(p)} + // Bound concurrent dispatches process-wide (across all jobs) via the + // shared semaphore. Honor cancellation so a draining shutdown doesn't + // block here. + select { + case o.sem <- struct{}{}: + defer func() { <-o.sem }() + case <-gctx.Done(): + res.Error = "dispatch cancelled" + results[i] = res + return nil + } + // Recover from a panic in a dispatcher (or future code here): a panic // in this detached goroutine would otherwise crash the whole process // mid-job. Record it as a platform failure and keep the group intact. @@ -199,6 +221,24 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief *model.CampaignBrief, p model.Provider, config json.RawMessage) platformResult { res := platformResult{Platform: string(p)} + // Fast path: if this pair already has a completed campaign (upstream id set), + // reuse it — idempotent, and valid even if no dispatcher is registered for the + // platform anymore. + if existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ID, p); lerr == nil && existing.PlatformCampaignID != "" { + res.OK = true + res.CampaignID = existing.PlatformCampaignID + return res + } + + // Resolve the dispatcher BEFORE claiming: a "no dispatcher" outcome must not + // leave a permanent pending claim that blocks the pair forever (which, with + // the currently-empty dispatcher map, would happen on every request). + d, ok := o.dispatchers[p] + if !ok { + res.Error = "no dispatcher registered for platform" + return res + } + // Single-flight claim: atomically insert a 'pending' placeholder for (brief, // platform). Exactly one worker across all replicas wins (the unique index // arbitrates) — no held connection, no blocking lock. @@ -222,28 +262,33 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief return res } - // We own the claim (a 'pending' row now exists). From here, any early return - // leaves that pending row behind; it is the recoverable record of an - // in-progress/failed dispatch (recovered by the startup scan) and blocks a - // concurrent duplicate. - d, ok := o.dispatchers[p] - if !ok { - res.Error = "no dispatcher registered for platform" - return res + // We own the claim (a 'pending' row now exists). If we fail BEFORE the + // upstream campaign is created, release the pending claim so the pair isn't + // blocked and can be retried. Once the upstream campaign exists, we do NOT + // release (the row is the record of the created campaign / recoverable orphan). + releaseClaim := func() { + if derr := o.campaigns.DeleteDispatchClaim(ctx, brief.ID, p); derr != nil { + slog.ErrorContext(ctx, "failed to release pending dispatch claim", "platform", p, "job_id", jobID, "error", derr) + } } + campaign, derr := d.Dispatch(ctx, brief, p, config) if derr != nil { - // Log the raw dispatcher error (it may carry provider request/response - // detail or credentials) server-side; store a stable, client-safe message. + // Dispatch failed; treat the upstream campaign as not created and release + // the claim so the pair can be retried rather than blocked. Log the raw + // dispatcher error server-side; store a stable, client-safe message. slog.ErrorContext(ctx, "platform dispatch failed", "platform", p, "job_id", jobID, "error", derr) + releaseClaim() res.Error = "platform campaign creation failed" return res } if campaign == nil { + releaseClaim() res.Error = "dispatcher returned no campaign" return res } if campaign.PlatformCampaignID == "" { + releaseClaim() res.Error = "dispatcher returned no upstream campaign id" return res } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 4c1fce06..f5d773d9 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -122,6 +122,16 @@ func (r *fakeCampaignRepo) ClaimCampaignDispatch(_ context.Context, projectID, b return true, pending, nil } +func (r *fakeCampaignRepo) DeleteDispatchClaim(_ context.Context, briefID string, platform model.Provider) error { + r.mu.Lock() + defer r.mu.Unlock() + key := briefID + "|" + string(platform) + if c, ok := r.existing[key]; ok && c.Status == "pending" { + delete(r.existing, key) + } + return nil +} + func (r *fakeCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { r.mu.Lock() defer r.mu.Unlock() @@ -630,3 +640,22 @@ func (d *ctxCapturingDispatcher) Dispatch(ctx context.Context, _ *model.Campaign <-d.release return &model.Campaign{PlatformCampaignID: "pc-" + string(p), Status: "active", CampaignName: "n"}, nil } + +// TestOrchestrator_NoDispatcherDoesNotLeavePendingClaim verifies that when no +// dispatcher is registered, no pending claim row is left behind (which would +// permanently block the pair). +func TestOrchestrator_NoDispatcherDoesNotLeavePendingClaim(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, nil) // no dispatchers + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + waitForTerminal(t, jobs, id) + camps.mu.Lock() + defer camps.mu.Unlock() + // No claim should have been inserted (dispatcher checked first), so existing + // is empty and no pending row blocks the pair. + if _, ok := camps.existing["b1|"+string(model.ProviderGoogleAds)]; ok { + t.Error("a pending claim row was left behind for a platform with no dispatcher") + } +} From 6b9e4901620dbc97796897403269abe4af8de71d Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 18:23:51 -0700 Subject: [PATCH 19/46] fix(review): retain claim on ambiguous dispatch error; stale comments; drain grace (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - On a dispatch error (which does NOT prove the provider rejected the create — a timeout can leave a campaign created upstream), retain the pending claim instead of releasing it, so a blind retry can't double-create. Only release on definite no-create cases (nil campaign / empty upstream id, i.e. a dispatcher bug). - Shutdown, after cancelling in-flight runs on a drain timeout, now waits a bounded grace for them to unwind before returning, so Container.Close doesn't close the pool mid-statement. - Update stale comments/log that still described the removed advisory-lock design (the shipped design is the atomic claim row) and the context.WithoutCancel note (runs are parented on the root context). build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- docs/knowledge/log.md | 14 +++++---- internal/service/orchestrator.go | 50 +++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index 6bf7a4e0..1bc39721 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -41,12 +41,14 @@ across the HTTP dispatch. The pending row is also the recovery signal for an upstream-create-then-crash. Recovery scan uses a staleness cutoff so a rolling deploy can't fail a job the old replica is still dispatching. -**Update** — Durable campaign dispatch (LFXV2-2665): per-platform dispatch now -runs under a cross-replica Postgres advisory lock keyed on (brief, platform) so -concurrent create-campaigns can't double-create upstream; the orchestrator -drains in-flight runs on graceful shutdown before the pool closes; and startup -fails-forward jobs left non-terminal by a restart. Added CampaignRepository. -WithDispatchLock and JobRepository.FailStuckJobs. +**Update** — Durable campaign dispatch (LFXV2-2665): per-platform single-flight +via an atomic claim row (ClaimCampaignDispatch — INSERT ON CONFLICT DO NOTHING of +a 'pending' campaign; see the later hardening entries above for the final shape, +which superseded an initial advisory-lock attempt), so concurrent +create-campaigns can't double-create upstream; the orchestrator drains in-flight +runs on graceful shutdown before the pool closes; and startup fails-forward jobs +left non-terminal by a restart. Added CampaignRepository.ClaimCampaignDispatch / +DeleteDispatchClaim and JobRepository.FailStuckJobs. **Update** — PR #11 review round 3: validate brief_id/campaign_id/job_id path params as UUIDs (400 instead of a PostgreSQL cast 500); make brief approval diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index cdc4723f..ed5bc2a9 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -8,6 +8,7 @@ import ( "encoding/json" "log/slog" "sync" + "time" "golang.org/x/sync/errgroup" @@ -19,6 +20,10 @@ import ( // maxParallelDispatch bounds concurrent per-platform campaign creation. const maxParallelDispatch = 5 +// cancelGracePeriod is how long Shutdown waits, after cancelling in-flight runs +// on a drain timeout, for them to unwind before it returns (and the pool closes). +const cancelGracePeriod = 2 * time.Second + // PlatformDispatcher creates a campaign on one ad platform. Implementations are // the per-provider adapters (added as those integrations land); the // orchestrator is agnostic to them. @@ -91,7 +96,17 @@ func (o *Orchestrator) Shutdown(ctx context.Context) error { o.rootCancel() return nil case <-ctx.Done(): - o.rootCancel() // stop in-flight runs rather than leaving them detached + // Drain deadline hit: cancel in-flight runs, then give them a brief bounded + // grace to observe cancellation and unwind before we return (and the caller + // closes the DB pool). Without this wait, Container.Close could close the + // pool while a just-cancelled run is still mid-statement. + o.rootCancel() + grace := time.NewTimer(cancelGracePeriod) + defer grace.Stop() + select { + case <-done: + case <-grace.C: + } return ctx.Err() } } @@ -107,8 +122,9 @@ type platformResult struct { // Start creates a queued job for the brief and launches dispatch asynchronously, // returning the job id immediately. The caller polls GetJob for progress. // -// The dispatch goroutine uses context.WithoutCancel so it survives the request -// context ending, matching the documented async model. +// The dispatch goroutine runs under the orchestrator's root context (not the +// request context), so it survives the request ending but can still be cancelled +// by Shutdown when the drain deadline expires. func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, platforms []model.Provider, config json.RawMessage) (string, error) { // Register the run with the drain WaitGroup under the lock so a concurrent // Shutdown can't start waiting between the draining check and wg.Add (which @@ -211,12 +227,13 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa } } -// dispatchPlatform creates (or reuses) the campaign for a single platform. The -// idempotency read, the upstream create, and the persist all run under a -// cross-replica advisory lock keyed on (brief, platform), so two concurrent -// create-campaigns requests for the same pair cannot both create an upstream -// campaign: the second waits on the lock, then observes the first's persisted -// row and reuses it. campaign_id is always the upstream platform id, so the +// dispatchPlatform creates (or reuses) the campaign for a single platform. +// Single-flight is enforced by an atomic claim row (ClaimCampaignDispatch: +// INSERT ... ON CONFLICT (brief_id, platform) DO NOTHING) — no held connection, +// no blocking lock — so two concurrent create-campaigns for the same pair cannot +// both create an upstream campaign: exactly one wins the claim (the unique index +// arbitrates); the other reuses the existing row or, if it's still pending, is +// reported in-progress. campaign_id is always the upstream platform id, so the // field means the same on the reuse and create paths. func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief *model.CampaignBrief, p model.Provider, config json.RawMessage) platformResult { res := platformResult{Platform: string(p)} @@ -274,20 +291,25 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief campaign, derr := d.Dispatch(ctx, brief, p, config) if derr != nil { - // Dispatch failed; treat the upstream campaign as not created and release - // the claim so the pair can be retried rather than blocked. Log the raw - // dispatcher error server-side; store a stable, client-safe message. - slog.ErrorContext(ctx, "platform dispatch failed", "platform", p, "job_id", jobID, "error", derr) - releaseClaim() + // A dispatch error does NOT prove the provider rejected the create — a + // timeout or dropped connection can leave a campaign created upstream. So + // we deliberately do NOT release the claim here: the 'pending' row stays, + // blocking a blind retry from double-creating (and marking the pair for + // reconciliation). Log the raw dispatcher error server-side; store a + // stable, client-safe message. + slog.ErrorContext(ctx, "platform dispatch failed (claim retained; outcome unknown)", "platform", p, "job_id", jobID, "error", derr) res.Error = "platform campaign creation failed" return res } if campaign == nil { + // A nil campaign with no error is a dispatcher bug — no upstream campaign + // was created, so releasing the claim to allow a retry is safe. releaseClaim() res.Error = "dispatcher returned no campaign" return res } if campaign.PlatformCampaignID == "" { + // Likewise: no upstream id means no created campaign — safe to release. releaseClaim() res.Error = "dispatcher returned no upstream campaign id" return res From 7fdc6e5750f654dae416f1480440c38ab84916f1 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 18:38:23 -0700 Subject: [PATCH 20/46] fix(review): quote ETag responses; release claim on pre-create dispatch errors (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Emit quoted HTTP entity-tags (RFC 7232): brief and campaign responses now return ETag: "3" (via briefETag), matching what parseBriefIfMatch already accepts, so a standards-compliant client can round-trip the validator. - Distinguish dispatcher error kinds: a dispatcher may implement NoUpstreamCreate() to signal the error occurred before any upstream create (input/config validation) — in that case the pending claim is released so the pair can be retried. An ambiguous error (e.g. timeout, which may have created a campaign) still retains the claim to prevent a duplicate. Tests: quoted ETag round-trips; pre-create error releases the claim. gen/ unchanged; build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- internal/service/brief.go | 9 ++++-- internal/service/orchestrator.go | 35 ++++++++++++++++---- internal/service/orchestrator_test.go | 46 +++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/internal/service/brief.go b/internal/service/brief.go index da8114a9..b8e9d7b9 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -291,10 +291,15 @@ func briefResult(b *model.CampaignBrief) *briefs.Brief { Targeting: unmarshalAny(b.Targeting), Status: string(b.Status), Version: b.Version, - Etag: optStr(etag(b.Version)), + Etag: optStr(briefETag(b.Version)), } } +// briefETag renders the version as a quoted HTTP entity-tag (RFC 7232), e.g. +// `"3"`. parseBriefIfMatch accepts both this quoted form and a bare integer, so +// a client can round-trip the returned validator. +func briefETag(version int64) string { return `"` + strconv.FormatInt(version, 10) + `"` } + func campaignResult(c *model.Campaign) *briefs.Campaign { return &briefs.Campaign{ ID: c.ID, @@ -305,7 +310,7 @@ func campaignResult(c *model.Campaign) *briefs.Campaign { CampaignName: c.CampaignName, Status: c.Status, Version: c.Version, - Etag: optStr(etag(c.Version)), + Etag: optStr(briefETag(c.Version)), } } diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index ed5bc2a9..afee7a7a 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -6,6 +6,7 @@ package service import ( "context" "encoding/json" + "errors" "log/slog" "sync" "time" @@ -33,6 +34,20 @@ type PlatformDispatcher interface { Dispatch(ctx context.Context, brief *model.CampaignBrief, platform model.Provider, config json.RawMessage) (*model.Campaign, error) } +// noUpstreamCreator lets a dispatcher signal that a returned error occurred +// BEFORE any upstream (paid) create call — e.g. input validation or config +// errors — so the orchestrator can safely release the claim and allow a retry. +// A plain error (which might follow a timeout that did create a campaign) is +// treated conservatively: the claim is retained to prevent a duplicate. +type noUpstreamCreator interface{ NoUpstreamCreate() bool } + +// dispatchErrIsPreCreate reports whether a dispatcher error is known to have +// occurred before any upstream create (safe to release the claim). +func dispatchErrIsPreCreate(err error) bool { + var n noUpstreamCreator + return errors.As(err, &n) && n.NoUpstreamCreate() +} + // Orchestrator runs async multi-platform campaign creation for a brief. type Orchestrator struct { campaigns domain.CampaignRepository @@ -291,13 +306,19 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief campaign, derr := d.Dispatch(ctx, brief, p, config) if derr != nil { - // A dispatch error does NOT prove the provider rejected the create — a - // timeout or dropped connection can leave a campaign created upstream. So - // we deliberately do NOT release the claim here: the 'pending' row stays, - // blocking a blind retry from double-creating (and marking the pair for - // reconciliation). Log the raw dispatcher error server-side; store a - // stable, client-safe message. - slog.ErrorContext(ctx, "platform dispatch failed (claim retained; outcome unknown)", "platform", p, "job_id", jobID, "error", derr) + // A dispatch error usually does NOT prove the provider rejected the create — + // a timeout or dropped connection can leave a campaign created upstream — so + // by default we RETAIN the pending claim to block a blind retry from + // double-creating. The exception: a dispatcher can signal (via + // NoUpstreamCreate) that the error occurred before any create call (e.g. + // input/config validation), in which case releasing the claim to allow a + // retry is safe. + if dispatchErrIsPreCreate(derr) { + slog.ErrorContext(ctx, "platform dispatch failed before upstream create (claim released)", "platform", p, "job_id", jobID, "error", derr) + releaseClaim() + } else { + slog.ErrorContext(ctx, "platform dispatch failed (claim retained; outcome unknown)", "platform", p, "job_id", jobID, "error", derr) + } res.Error = "platform campaign creation failed" return res } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index f5d773d9..d6fee5da 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -659,3 +659,49 @@ func TestOrchestrator_NoDispatcherDoesNotLeavePendingClaim(t *testing.T) { t.Error("a pending claim row was left behind for a platform with no dispatcher") } } + +// preCreateErrDispatcher fails with an error that signals no upstream create. +type preCreateErr struct{} + +func (preCreateErr) Error() string { return "invalid input" } +func (preCreateErr) NoUpstreamCreate() bool { return true } + +type preCreateErrDispatcher struct{} + +func (preCreateErrDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, _ model.Provider, _ json.RawMessage) (*model.Campaign, error) { + return nil, preCreateErr{} +} + +// TestOrchestrator_PreCreateErrorReleasesClaim verifies that a dispatcher error +// signalling no-upstream-create releases the claim (so the pair can be retried), +// unlike an ambiguous error which retains it. +func TestOrchestrator_PreCreateErrorReleasesClaim(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: preCreateErrDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + waitForTerminal(t, jobs, id) + camps.mu.Lock() + defer camps.mu.Unlock() + // The pre-create error should have released the pending claim. + if _, ok := camps.existing["b1|"+string(model.ProviderGoogleAds)]; ok { + t.Error("pre-create dispatcher error should have released the pending claim") + } +} + +// TestBriefETagIsQuoted verifies the emitted ETag is a quoted entity-tag. +func TestBriefETagIsQuoted(t *testing.T) { + if got := briefETag(3); got != `"3"` { + t.Errorf("briefETag(3) = %q, want \"3\"", got) + } + // And the parser round-trips it. + v, err := parseBriefIfMatch(strPtr(briefETag(7))) + if err != nil || v != 7 { + t.Errorf("round-trip of briefETag(7) = %d, %v; want 7, nil", v, err) + } +} + +func strPtr(s string) *string { return &s } From 3c74e801e8e28843d55be32402ebe1d114b34742 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 19:02:35 -0700 Subject: [PATCH 21/46] fix(review): sequence shutdown; roll back claim on read failure (PR #11) - Shut down the HTTP server BEFORE closing the container (was concurrent): srv.Shutdown stops accepting requests and drains handlers first, so no new dispatch can be Started, then cont.Close drains in-flight dispatch and closes the pool. Removes the race where a just-accepted request could Start a dispatch while the pool is being closed. - ClaimCampaignDispatch: if the INSERT wins but the follow-up read fails, roll back the just-inserted pending row (best effort) and report claimed=false, so a failed claim doesn't leave a pending row that blocks the pair forever. build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 34 +++++++------------ .../infrastructure/postgres/campaign_repo.go | 14 ++++++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 27d8c9f3..e419d642 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -13,7 +13,6 @@ import ( "log/slog" "net/http" "os" - "sync" briefsvcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_briefs/server" connsvcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_connections/server" @@ -172,25 +171,18 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container slog.InfoContext(ctx, "shutdown initiated") } - var wg sync.WaitGroup - wg.Add(2) - - go func() { - defer wg.Done() - shutdownCtx, cancel := context.WithTimeout(context.Background(), constants.DefaultShutdownTimeout) - defer cancel() - if err := srv.Shutdown(shutdownCtx); err != nil { - slog.ErrorContext(ctx, "HTTP server shutdown error", log.ErrKey, err) - } - }() - - go func() { - defer wg.Done() - if err := cont.Close(); err != nil { - slog.ErrorContext(ctx, "container close error", log.ErrKey, err) - } - }() - - wg.Wait() + // Shut down in order, not concurrently: first stop the HTTP server (stops + // accepting new requests and drains in-flight handlers, so no new dispatch + // can be Started), THEN close the container (which drains in-flight dispatch + // and only then closes the DB pool). Running these concurrently risks a + // just-accepted request Starting a dispatch while the pool is being closed. + shutdownCtx, cancel := context.WithTimeout(context.Background(), constants.DefaultShutdownTimeout) + defer cancel() + if err := srv.Shutdown(shutdownCtx); err != nil { + slog.ErrorContext(ctx, "HTTP server shutdown error", log.ErrKey, err) + } + if err := cont.Close(); err != nil { + slog.ErrorContext(ctx, "container close error", log.ErrKey, err) + } return nil } diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index 2ab5e0c8..ba94d4be 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -43,9 +43,17 @@ func (r *CampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, bri row, gerr := r.GetCampaignByPlatform(ctx, briefID, platform) if gerr != nil { - // The row must exist now (we or someone else just wrote it); a not-found - // here is a genuine error. - return claimed, nil, fmt.Errorf("read campaign after claim: %w", gerr) + // The row must exist now (we or someone else just wrote it); a read failure + // here is a genuine error. If WE just inserted the pending row, roll it back + // (best effort) so a failed claim doesn't leave a pending row that blocks the + // pair forever; report claimed=false so the caller treats it as a clean + // failure with nothing to release. + if claimed { + if derr := r.DeleteDispatchClaim(ctx, briefID, platform); derr != nil { + return false, nil, fmt.Errorf("read campaign after claim: %w (and failed to roll back pending claim: %v)", gerr, derr) + } + } + return false, nil, fmt.Errorf("read campaign after claim: %w", gerr) } return claimed, row, nil } From 77f3279367f4da6e5ad9f34d41ae2c22f8e52730 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 19:10:41 -0700 Subject: [PATCH 22/46] fix(ci): add license header to 000003 migration files (PR #11) The new migration 000003 up/down SQL files were missing the required license header, failing the License Header Check. Add it to match the other migrations. Signed-off-by: Misha Rautela --- .../migrations/000003_brief_partial_unique_slug.down.sql | 3 +++ .../migrations/000003_brief_partial_unique_slug.up.sql | 3 +++ 2 files changed, 6 insertions(+) diff --git a/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql index 26447ed4..bd0bec1c 100644 --- a/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql +++ b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.down.sql @@ -1,3 +1,6 @@ +-- Copyright The Linux Foundation and each contributor to LFX. +-- SPDX-License-Identifier: MIT + -- Revert to the 000002 schema: full uniqueness constraint and UUID project_id. -- The UUID casts assume every stored project_id is a valid UUID; a slug-valued -- row would fail the cast, which is the intended signal that the down migration diff --git a/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql index 426228a3..26b10a7e 100644 --- a/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql +++ b/internal/infrastructure/postgres/migrations/000003_brief_partial_unique_slug.up.sql @@ -1,3 +1,6 @@ +-- Copyright The Linux Foundation and each contributor to LFX. +-- SPDX-License-Identifier: MIT + -- Reconcile the campaign_briefs / campaigns schema with the rest of the service. -- This is a SEPARATE migration rather than an edit to 000002: golang-migrate -- records applied versions and never re-runs them, so any change to an From a92aff0d7ab1f4e2499b6195e593b8a804c33572 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 20:44:20 -0700 Subject: [PATCH 23/46] fix(review): detach claim-release context; clarify skip semantics; container nits (PR #11) - releaseClaim (DeleteDispatchClaim) now runs on a fresh bounded context detached from the dispatch context. On shutdown/timeout the dispatch ctx is already cancelled, so reusing it would fail the cleanup DELETE and leak the pending claim exactly when we need to free it. - The already-claimed-by-another-worker path now reports a clear "skipped: another concurrent dispatch owns this platform" message (was "in progress", which contradicted the resulting non-ok/failed aggregate for this job). - no-DB startup warning now names both connection AND brief/campaign endpoints; dispatchers is an initialized empty map (not a typed-nil) to remove the accidental-mutation footgun. build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- internal/container/container.go | 4 ++-- internal/service/orchestrator.go | 23 ++++++++++++++++++----- internal/service/orchestrator_test.go | 4 ++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/internal/container/container.go b/internal/container/container.go index a16bc1eb..5a9e8d54 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -58,7 +58,7 @@ func NewContainer(cfg *config.Config) (*Container, error) { c := &Container{Config: cfg} if cfg.DatabaseURL == "" { - slog.Warn("database URL not set; connection endpoints will return 503 Service Unavailable") + slog.Warn("database URL not set; connection and brief/campaign endpoints will return 503 Service Unavailable") c.Service = service.NewCampaignService(nil) // Wire the connection + brief services with nil repos so their routes are // still mounted and return the typed 503 ServiceUnavailable advertised by @@ -108,7 +108,7 @@ func NewContainer(cfg *config.Config) (*Container, error) { // persistence) is exercised end to end regardless. Log a startup warning so // this gap is visible in production logs rather than silently producing jobs // that always finish "failed" with "no dispatcher registered". - dispatchers := map[model.Provider]service.PlatformDispatcher(nil) + dispatchers := map[model.Provider]service.PlatformDispatcher{} if len(dispatchers) == 0 { slog.Warn("no platform dispatchers registered; campaign creation will record jobs but perform no upstream dispatch") } diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index afee7a7a..afcb8003 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -25,6 +25,10 @@ const maxParallelDispatch = 5 // on a drain timeout, for them to unwind before it returns (and the pool closes). const cancelGracePeriod = 2 * time.Second +// claimReleaseTimeout bounds the best-effort pending-claim cleanup, which runs on +// a context detached from the (possibly-cancelled) dispatch context. +const claimReleaseTimeout = 5 * time.Second + // PlatformDispatcher creates a campaign on one ad platform. Implementations are // the per-provider adapters (added as those integrations land); the // orchestrator is agnostic to them. @@ -288,9 +292,13 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief res.CampaignID = existing.PlatformCampaignID return res } - // Still pending elsewhere: don't dispatch again (that's the whole point of - // the claim). Report it as in-progress rather than a failure or a duplicate. - res.Error = "another dispatch for this platform is already in progress" + // Another worker holds the pending claim: don't dispatch again (the point of + // the claim). This job did not create the campaign, so it's recorded as not + // ok (OK stays false) — which aggregates to failed/partial for THIS job — + // with a message making clear it's owned by a concurrent run, not a real + // failure. The other run will complete it; a poll of that run (or a re-poll + // after it finishes) reflects the true outcome. + res.Error = "skipped: another concurrent dispatch owns this platform" return res } @@ -299,8 +307,13 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief // blocked and can be retried. Once the upstream campaign exists, we do NOT // release (the row is the record of the created campaign / recoverable orphan). releaseClaim := func() { - if derr := o.campaigns.DeleteDispatchClaim(ctx, brief.ID, p); derr != nil { - slog.ErrorContext(ctx, "failed to release pending dispatch claim", "platform", p, "job_id", jobID, "error", derr) + // Use a fresh bounded context, not the dispatch ctx: on shutdown/timeout the + // dispatch ctx is already cancelled, and reusing it would make the cleanup + // DELETE fail and leak the pending claim exactly when we most need to free it. + rctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), claimReleaseTimeout) + defer cancel() + if derr := o.campaigns.DeleteDispatchClaim(rctx, brief.ID, p); derr != nil { + slog.ErrorContext(rctx, "failed to release pending dispatch claim", "platform", p, "job_id", jobID, "error", derr) } } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index d6fee5da..b4983688 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -345,8 +345,8 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { if calls != 0 { t.Errorf("Dispatch called %d times, want 0 (another worker holds the claim)", calls) } - if !strings.Contains(string(j.Result), "already in progress") { - t.Errorf("result = %s, want an in-progress message", j.Result) + if !strings.Contains(string(j.Result), "another concurrent dispatch owns") { + t.Errorf("result = %s, want a concurrent-owner skip message", j.Result) } } From c665414363b68c173b8eaf0c0e8b7f6202a63744 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 20:57:53 -0700 Subject: [PATCH 24/46] fix(review): finalize jobs on detached ctx; bounded shutdown; claim rollback ctx (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The terminal job-status write now runs on a context detached from the dispatch context (bounded by jobFinalizeTimeout). On the drain-timeout path Shutdown cancels the run ctx, and using it for the terminal write was guaranteed to fail and leave the job stuck non-terminal — now it always reaches a terminal state. - ClaimCampaignDispatch's rollback-on-read-failure runs on a detached ctx too (the read typically fails because ctx was cancelled, which would also fail the rollback DELETE and leak the placeholder). - Graceful shutdown now shares ONE deadline across both phases: server.go passes the shutdown context into Container.Close(ctx), so HTTP-drain + dispatch-drain are bounded by DefaultShutdownTimeout together rather than summing two independent timeouts that could exceed the Kubernetes grace period. build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 7 +++++- internal/container/container.go | 10 +++++---- internal/container/container_test.go | 3 ++- .../infrastructure/postgres/campaign_repo.go | 14 +++++++++++- internal/service/orchestrator.go | 22 ++++++++++++++----- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index e419d642..b5b36bd2 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -176,12 +176,17 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container // can be Started), THEN close the container (which drains in-flight dispatch // and only then closes the DB pool). Running these concurrently risks a // just-accepted request Starting a dispatch while the pool is being closed. + // + // Both phases share ONE overall deadline (DefaultShutdownTimeout) so the total + // graceful-shutdown time is bounded and stays within a standard Kubernetes + // terminationGracePeriodSeconds — a sequential sum of two independent timeouts + // could otherwise exceed it and get SIGKILLed mid-drain. shutdownCtx, cancel := context.WithTimeout(context.Background(), constants.DefaultShutdownTimeout) defer cancel() if err := srv.Shutdown(shutdownCtx); err != nil { slog.ErrorContext(ctx, "HTTP server shutdown error", log.ErrKey, err) } - if err := cont.Close(); err != nil { + if err := cont.Close(shutdownCtx); err != nil { slog.ErrorContext(ctx, "container close error", log.ErrKey, err) } return nil diff --git a/internal/container/container.go b/internal/container/container.go index 5a9e8d54..063c6cd4 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -138,11 +138,13 @@ func NewContainer(cfg *config.Config) (*Container, error) { } // Close releases any resources held by the container. It first drains in-flight -// campaign dispatch (bounded) so a dispatch that already created an upstream -// campaign isn't cut off before it persists, THEN closes the database pool. -func (c *Container) Close() error { +// campaign dispatch (bounded by ctx and by dispatchDrainTimeout, whichever is +// sooner) so a dispatch that already created an upstream campaign isn't cut off +// before it persists, THEN closes the database pool. ctx is the shared +// graceful-shutdown deadline, so the drain can't run past the overall budget. +func (c *Container) Close(ctx context.Context) error { if c.orch != nil { - drainCtx, cancel := context.WithTimeout(context.Background(), dispatchDrainTimeout) + drainCtx, cancel := context.WithTimeout(ctx, dispatchDrainTimeout) defer cancel() if err := c.orch.Shutdown(drainCtx); err != nil { slog.Warn("timed out draining in-flight dispatch on shutdown", "error", err) diff --git a/internal/container/container_test.go b/internal/container/container_test.go index 8f1ee41d..f20f8778 100644 --- a/internal/container/container_test.go +++ b/internal/container/container_test.go @@ -4,6 +4,7 @@ package container import ( + "context" "testing" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/config" @@ -22,7 +23,7 @@ func TestNewContainer_NoDatabase(t *testing.T) { require.NotNil(t, cont) assert.NotNil(t, cont.Service) assert.NotNil(t, cont.Connections) - require.NoError(t, cont.Close()) + require.NoError(t, cont.Close(context.Background())) } func TestNewContainer_UnsupportedEngine(t *testing.T) { diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index ba94d4be..66ccca27 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "time" "github.com/jackc/pgx/v5" @@ -19,6 +20,11 @@ type CampaignRepo struct { db *Pool } +// claimRollbackTimeout bounds the best-effort rollback of a just-inserted pending +// claim when the follow-up read fails; it runs on a context detached from the +// (possibly-cancelled) request context. +const claimRollbackTimeout = 5 * time.Second + // NewCampaignRepo returns a CampaignRepo backed by pool. func NewCampaignRepo(pool *Pool) *CampaignRepo { return &CampaignRepo{db: pool} } @@ -49,9 +55,15 @@ func (r *CampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, bri // pair forever; report claimed=false so the caller treats it as a clean // failure with nothing to release. if claimed { - if derr := r.DeleteDispatchClaim(ctx, briefID, platform); derr != nil { + // Roll back on a context detached from ctx: the read likely failed + // BECAUSE ctx was cancelled, and reusing it for the DELETE would fail + // too, leaking the just-committed placeholder. + rbCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), claimRollbackTimeout) + if derr := r.DeleteDispatchClaim(rbCtx, briefID, platform); derr != nil { + cancel() return false, nil, fmt.Errorf("read campaign after claim: %w (and failed to roll back pending claim: %v)", gerr, derr) } + cancel() } return false, nil, fmt.Errorf("read campaign after claim: %w", gerr) } diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index afcb8003..80b646fa 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -29,6 +29,11 @@ const cancelGracePeriod = 2 * time.Second // a context detached from the (possibly-cancelled) dispatch context. const claimReleaseTimeout = 5 * time.Second +// jobFinalizeTimeout bounds the terminal job-status write, which runs on a +// context detached from the dispatch context so a cancelled run still reaches a +// terminal state instead of being stuck queued/running. +const jobFinalizeTimeout = 10 * time.Second + // PlatformDispatcher creates a campaign on one ad platform. Implementations are // the per-provider adapters (added as those integrations land); the // orchestrator is agnostic to them. @@ -230,19 +235,26 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa slog.ErrorContext(ctx, "campaign dispatch returned an error", "job_id", jobID, "error", werr) } + // Finalize on a context detached from cancellation: on the drain-timeout path + // Shutdown cancels this run's ctx, and using it for the terminal write would + // guarantee the write fails and leave the job stuck non-terminal. A bounded + // detached context lets the job always reach a terminal state. + finCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), jobFinalizeTimeout) + defer cancel() + status := aggregateStatus(results) payload, err := json.Marshal(results) if err != nil { // Don't store a null result (which would make the job unpollable); // record the marshal failure in the job's error field and fail the job. - slog.ErrorContext(ctx, "failed to marshal job result", "job_id", jobID, "error", err) - if uerr := o.jobs.UpdateJobStatus(ctx, jobID, model.JobFailed, nil, "failed to serialize job result: "+err.Error()); uerr != nil { - slog.ErrorContext(ctx, "failed to finalize campaign job", "job_id", jobID, "error", uerr) + slog.ErrorContext(finCtx, "failed to marshal job result", "job_id", jobID, "error", err) + if uerr := o.jobs.UpdateJobStatus(finCtx, jobID, model.JobFailed, nil, "failed to serialize job result: "+err.Error()); uerr != nil { + slog.ErrorContext(finCtx, "failed to finalize campaign job", "job_id", jobID, "error", uerr) } return } - if err := o.jobs.UpdateJobStatus(ctx, jobID, status, payload, ""); err != nil { - slog.ErrorContext(ctx, "failed to finalize campaign job", "job_id", jobID, "error", err) + if err := o.jobs.UpdateJobStatus(finCtx, jobID, status, payload, ""); err != nil { + slog.ErrorContext(finCtx, "failed to finalize campaign job", "job_id", jobID, "error", err) } } From 7697d44de1c9d58aeb651c1a2977f4fbda352a2b Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 21:15:29 -0700 Subject: [PATCH 25/46] fix(review): reject weak entity-tags in If-Match (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If-Match requires the strong comparison function (RFC 7232 §3.1), so a weak validator W/"3" must NOT authorize a conditional write. parseBriefIfMatch now rejects a W/ (or w/) prefixed tag with a 400 instead of stripping the prefix and treating it as a match. Strong quoted tags ("3") and the bare version are still accepted. Test updated to assert weak tags are rejected. build/vet/golangci-lint/ okfvalidate/test -race all clean. Address Copilot review comment on PR #11. Signed-off-by: Misha Rautela --- internal/service/brief.go | 11 +++++++---- internal/service/brief_test.go | 12 +++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/internal/service/brief.go b/internal/service/brief.go index b8e9d7b9..333ebc38 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -320,11 +320,14 @@ func parseBriefIfMatch(ifMatch *string) (int64, error) { if ifMatch == nil || *ifMatch == "" { return 0, &briefs.PreconditionRequiredError{Code: "428", Message: "an If-Match header is required"} } - // Accept both the bare version we emit and a standards-compliant quoted - // entity-tag (RFC 7232 `If-Match: "3"`), plus the weak-tag `W/"3"` form, since - // caches and conformant clients may echo the ETag quoted. + // Accept the bare version we emit and a standards-compliant STRONG quoted + // entity-tag (RFC 7232 `If-Match: "3"`). Reject a weak validator (`W/"3"`): + // RFC 7232 §3.1 requires If-Match to use the strong comparison function, so a + // weak tag must NOT authorize a write. raw := strings.TrimSpace(*ifMatch) - raw = strings.TrimPrefix(raw, "W/") + if strings.HasPrefix(raw, "W/") || strings.HasPrefix(raw, "w/") { + return 0, &briefs.BadRequestError{Code: "400", Message: "If-Match must be a strong validator; weak tags (W/\"…\") are not accepted"} + } raw = strings.Trim(raw, `"`) v, err := strconv.ParseInt(raw, 10, 64) if err != nil { diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 2721cd29..8a318190 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -245,10 +245,11 @@ func TestBriefService_ApproveBrief_VersionGated(t *testing.T) { } } -// parseBriefIfMatch must accept a bare version, a quoted entity-tag, and a weak -// tag; and reject non-numeric input. +// parseBriefIfMatch accepts a bare version and a strong quoted entity-tag, and +// rejects non-numeric input AND weak validators (If-Match requires strong +// comparison per RFC 7232). func TestParseBriefIfMatch_AcceptsQuotedETag(t *testing.T) { - cases := map[string]int64{`3`: 3, `"3"`: 3, `W/"3"`: 3, ` "42" `: 42} + cases := map[string]int64{`3`: 3, `"3"`: 3, ` "42" `: 42} for in, want := range cases { v, err := parseBriefIfMatch(&in) if err != nil { @@ -259,6 +260,11 @@ func TestParseBriefIfMatch_AcceptsQuotedETag(t *testing.T) { t.Errorf("parseBriefIfMatch(%q) = %d, want %d", in, v, want) } } + for _, weak := range []string{`W/"3"`, `w/"3"`} { + if _, err := parseBriefIfMatch(&weak); err == nil { + t.Errorf("parseBriefIfMatch(%q) = nil error, want weak-tag rejection", weak) + } + } bad := `abc` if _, err := parseBriefIfMatch(&bad); err == nil { t.Errorf("parseBriefIfMatch(%q) = nil error, want BadRequest", bad) From 7152257478d7a22b6b78a8bb1e058ced3ff5656b Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 21:38:06 -0700 Subject: [PATCH 26/46] fix(review): reject unbalanced If-Match quote; grace >= finalize timeout (PR #11) - parseBriefIfMatch strips exactly one BALANCED pair of surrounding quotes and rejects an unbalanced quote (`"3` or `3"`) with a 400, instead of strings.Trim removing any number of quotes and accepting it as version 3. - cancelGracePeriod is now jobFinalizeTimeout+1s (was a fixed 2s < the 10s finalize timeout): a run cancelled at the drain deadline needs at least the finalize window to write its terminal status on the detached context before the pool closes. build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- internal/service/brief.go | 11 ++++++++++- internal/service/orchestrator.go | 5 ++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/service/brief.go b/internal/service/brief.go index 333ebc38..fff7fbb6 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -328,7 +328,16 @@ func parseBriefIfMatch(ifMatch *string) (int64, error) { if strings.HasPrefix(raw, "W/") || strings.HasPrefix(raw, "w/") { return 0, &briefs.BadRequestError{Code: "400", Message: "If-Match must be a strong validator; weak tags (W/\"…\") are not accepted"} } - raw = strings.Trim(raw, `"`) + // Strip exactly one balanced pair of surrounding quotes; reject an unbalanced + // quote (e.g. `"3` or `3"`) rather than silently accepting it as version 3. + hasOpen := strings.HasPrefix(raw, `"`) + hasClose := strings.HasSuffix(raw, `"`) + switch { + case hasOpen && hasClose && len(raw) >= 2: + raw = raw[1 : len(raw)-1] + case hasOpen || hasClose: + return 0, &briefs.BadRequestError{Code: "400", Message: "If-Match has an unbalanced quote"} + } v, err := strconv.ParseInt(raw, 10, 64) if err != nil { return 0, &briefs.BadRequestError{Code: "400", Message: "If-Match must be an integer version"} diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 80b646fa..9898c284 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -23,7 +23,10 @@ const maxParallelDispatch = 5 // cancelGracePeriod is how long Shutdown waits, after cancelling in-flight runs // on a drain timeout, for them to unwind before it returns (and the pool closes). -const cancelGracePeriod = 2 * time.Second +// It must be >= jobFinalizeTimeout so a run cancelled at the drain deadline still +// has time to write its terminal status (on the detached finalize context) before +// the pool is closed. +const cancelGracePeriod = jobFinalizeTimeout + time.Second // claimReleaseTimeout bounds the best-effort pending-claim cleanup, which runs on // a context detached from the (possibly-cancelled) dispatch context. From 6a6ae83c42e00a626fa09d5f424f534153c7741a Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 21:48:40 -0700 Subject: [PATCH 27/46] fix(review): retain claim on ambiguous nil/empty result; bound drain+grace to budget (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - A (nil, nil) dispatcher result or an empty upstream id is ambiguous — it does NOT prove no upstream campaign was created — so RETAIN the pending claim (as with an ambiguous dispatch error) instead of releasing it, preventing a blind retry from double-creating. (Supersedes the earlier release-on-nil behavior; the conservative retain is the safe choice.) - Bound graceful shutdown so drain + post-cancel grace can't overrun the overall budget: dispatchDrainTimeout reduced to 12s and an init() asserts dispatchDrainTimeout + service.CancelGracePeriod <= DefaultShutdownTimeout, so the grace no longer runs an unbounded 11s beyond the shutdown deadline. Exported CancelGracePeriod for that check. build/vet/golangci-lint/okfvalidate/test -race all clean. Address Copilot review comments on PR #11. Signed-off-by: Misha Rautela --- internal/container/container.go | 13 ++++++++++++- internal/service/orchestrator.go | 19 ++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/internal/container/container.go b/internal/container/container.go index 063c6cd4..29c1969e 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -18,6 +18,7 @@ import ( "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/crypto" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/postgres" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/service" + "github.com/linuxfoundation/lfx-v2-campaign-service/pkg/constants" ) // startupDBTimeout bounds the database connection/ping during container init so @@ -28,7 +29,17 @@ const startupDBTimeout = 15 * time.Second // dispatchDrainTimeout bounds how long shutdown waits for in-flight campaign // dispatch to finish before the pool is closed. Kept under the server's overall // shutdown budget so draining can't outlast the graceful-shutdown window. -const dispatchDrainTimeout = 20 * time.Second +// dispatchDrainTimeout must leave room for the orchestrator's post-cancel grace +// (service.CancelGracePeriod) within the overall graceful-shutdown budget +// (constants.DefaultShutdownTimeout), so drain + grace can't overrun it and get +// SIGKILLed. It is validated against that budget in an init() below. +const dispatchDrainTimeout = 12 * time.Second + +func init() { + if dispatchDrainTimeout+service.CancelGracePeriod > constants.DefaultShutdownTimeout { + panic("dispatchDrainTimeout + service.CancelGracePeriod exceeds DefaultShutdownTimeout") + } +} // Container holds all application dependencies. type Container struct { diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 9898c284..d74a9518 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -26,7 +26,7 @@ const maxParallelDispatch = 5 // It must be >= jobFinalizeTimeout so a run cancelled at the drain deadline still // has time to write its terminal status (on the detached finalize context) before // the pool is closed. -const cancelGracePeriod = jobFinalizeTimeout + time.Second +const CancelGracePeriod = jobFinalizeTimeout + time.Second // claimReleaseTimeout bounds the best-effort pending-claim cleanup, which runs on // a context detached from the (possibly-cancelled) dispatch context. @@ -128,7 +128,7 @@ func (o *Orchestrator) Shutdown(ctx context.Context) error { // closes the DB pool). Without this wait, Container.Close could close the // pool while a just-cancelled run is still mid-statement. o.rootCancel() - grace := time.NewTimer(cancelGracePeriod) + grace := time.NewTimer(CancelGracePeriod) defer grace.Stop() select { case <-done: @@ -351,15 +351,20 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief return res } if campaign == nil { - // A nil campaign with no error is a dispatcher bug — no upstream campaign - // was created, so releasing the claim to allow a retry is safe. - releaseClaim() + // A (nil, nil) result is ambiguous: it does NOT prove no upstream campaign + // was created (a dispatcher could create the campaign, then fail to build + // its return value). Treat it like the ambiguous error path — RETAIN the + // claim so a blind retry can't double-create; the pending row flags the + // pair for reconciliation. + slog.ErrorContext(ctx, "dispatcher returned no campaign (claim retained; outcome unknown)", "platform", p, "job_id", jobID) res.Error = "dispatcher returned no campaign" return res } if campaign.PlatformCampaignID == "" { - // Likewise: no upstream id means no created campaign — safe to release. - releaseClaim() + // An empty upstream id is likewise ambiguous (the create may have happened + // but the id wasn't captured), so RETAIN the claim rather than releasing it + // and risking a duplicate on retry. + slog.ErrorContext(ctx, "dispatcher returned no upstream campaign id (claim retained; outcome unknown)", "platform", p, "job_id", jobID) res.Error = "dispatcher returned no upstream campaign id" return res } From 7635b6bb0b236abc6ea3b01388cd316b3f84fbe9 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 22:01:45 -0700 Subject: [PATCH 28/46] fix(review): defensively copy caller slices before async dispatch (PR #11) Start now copies the caller-owned platforms slice and config bytes before handing them to the dispatch goroutine, so a caller that reuses or mutates either after Start returns can't race the async run. Cheap and removes the latent aliasing footgun regardless of the current call site. build/vet/golangci-lint/test -race all clean. Address Copilot review comment on PR #11. Signed-off-by: Misha Rautela --- internal/service/orchestrator.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index d74a9518..e96d9dd4 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -170,13 +170,19 @@ func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, pl return "", err } + // Defensively copy the caller-owned slices before handing them to the async + // goroutine, so a caller that reuses/mutates its platforms slice or config + // bytes after Start returns can't race the dispatch run. + platformsCopy := append([]model.Provider(nil), platforms...) + configCopy := append(json.RawMessage(nil), config...) + // Parent the run on the orchestrator's root context (not the request context), // so it survives the request ending but can still be cancelled by Shutdown if // the drain deadline expires. dispatchCtx := o.rootCtx go func() { defer o.wg.Done() - o.run(dispatchCtx, job.ID, brief, platforms, config) + o.run(dispatchCtx, job.ID, brief, platformsCopy, configCopy) }() return job.ID, nil From c83c90de3cc7e76f2a684856f8ed81c5ed611344 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 23:15:24 -0700 Subject: [PATCH 29/46] fix(review): bound total graceful-shutdown time across both phases (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two shutdown phases (srv.Shutdown then Container.Close) shared one 25s context, but the orchestrator's post-cancel grace timer is wall-clock, not ctx-bound. So HTTP drain could consume most of the budget and Container.Close would still add its full drain+grace on top — worst case ~36s, past DefaultShutdownTimeout and any matched terminationGracePeriodSeconds, risking a SIGKILL mid-drain. The old init() assertion silently assumed HTTP drain was instantaneous. Fix (addresses the Dealako review [major] on shutdown budgeting): - Budget the phases separately: HTTPShutdownTimeout and ContainerCloseTimeout (= dispatchDrainTimeout + CancelGracePeriod), each with its own Background()-derived deadline, so the total is a true sum bounded by DefaultShutdownTimeout. Reduced dispatchDrainTimeout 12s->8s so the HTTP phase keeps a positive (6s) share; init() now also panics if the HTTP phase budget is non-positive. - Cap the orchestrator grace wait at the caller's remaining context budget so it can never overrun the reserved phase window. - Correct the server.go comment that wrongly claimed a shared deadline bounded the total. - Tests: TestOrchestrator_ShutdownGraceBoundedByContext and TestShutdownBudgetComposes lock in the invariant. Also run go mod tidy so golang.org/x/sync (now a direct import via errgroup) is no longer marked // indirect (Asitha review hygiene flag). Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 23 ++++++++++++------ go.mod | 2 +- internal/container/container.go | 35 +++++++++++++++++++++------ internal/container/container_test.go | 15 ++++++++++++ internal/service/orchestrator.go | 17 ++++++++++++- internal/service/orchestrator_test.go | 34 ++++++++++++++++++++++++++ 6 files changed, 108 insertions(+), 18 deletions(-) diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index b5b36bd2..140c4f7f 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -177,16 +177,23 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container // and only then closes the DB pool). Running these concurrently risks a // just-accepted request Starting a dispatch while the pool is being closed. // - // Both phases share ONE overall deadline (DefaultShutdownTimeout) so the total - // graceful-shutdown time is bounded and stays within a standard Kubernetes - // terminationGracePeriodSeconds — a sequential sum of two independent timeouts - // could otherwise exceed it and get SIGKILLed mid-drain. - shutdownCtx, cancel := context.WithTimeout(context.Background(), constants.DefaultShutdownTimeout) - defer cancel() - if err := srv.Shutdown(shutdownCtx); err != nil { + // Each phase gets its OWN bounded deadline rather than sharing one context. + // A shared context would not bound the total: srv.Shutdown could consume the + // whole budget draining HTTP handlers, leaving Container.Close's drain+grace + // (whose orchestrator grace timer is otherwise wall-clock, not ctx-bound) to + // add its full window on top — pushing the real total past + // DefaultShutdownTimeout and risking a SIGKILL mid-drain. Budgeting the + // phases separately makes the total a true sum: httpShutdownTimeout + + // (dispatchDrainTimeout + CancelGracePeriod) <= DefaultShutdownTimeout, which + // container.go asserts at init. + httpCtx, cancelHTTP := context.WithTimeout(context.Background(), container.HTTPShutdownTimeout) + defer cancelHTTP() + if err := srv.Shutdown(httpCtx); err != nil { slog.ErrorContext(ctx, "HTTP server shutdown error", log.ErrKey, err) } - if err := cont.Close(shutdownCtx); err != nil { + closeCtx, cancelClose := context.WithTimeout(context.Background(), container.ContainerCloseTimeout) + defer cancelClose() + if err := cont.Close(closeCtx); err != nil { slog.ErrorContext(ctx, "container close error", log.ErrKey, err) } return nil diff --git a/go.mod b/go.mod index 8a07f1ec..57bcb73b 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( go.opentelemetry.io/otel/trace v1.44.0 goa.design/clue v1.2.1 goa.design/goa/v3 v3.25.3 + golang.org/x/sync v0.21.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -56,7 +57,6 @@ require ( go.opentelemetry.io/proto/otlp v1.10.0 // indirect golang.org/x/mod v0.36.0 // indirect golang.org/x/net v0.56.0 // indirect - golang.org/x/sync v0.21.0 // indirect golang.org/x/sys v0.46.0 // indirect golang.org/x/term v0.44.0 // indirect golang.org/x/text v0.38.0 // indirect diff --git a/internal/container/container.go b/internal/container/container.go index 29c1969e..8f24b0e4 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -26,19 +26,38 @@ import ( // restart it) rather than wedging startup indefinitely. const startupDBTimeout = 15 * time.Second -// dispatchDrainTimeout bounds how long shutdown waits for in-flight campaign -// dispatch to finish before the pool is closed. Kept under the server's overall -// shutdown budget so draining can't outlast the graceful-shutdown window. -// dispatchDrainTimeout must leave room for the orchestrator's post-cancel grace -// (service.CancelGracePeriod) within the overall graceful-shutdown budget -// (constants.DefaultShutdownTimeout), so drain + grace can't overrun it and get -// SIGKILLed. It is validated against that budget in an init() below. -const dispatchDrainTimeout = 12 * time.Second +// dispatchDrainTimeout bounds how long Container.Close waits for in-flight +// campaign dispatch to finish before the pool is closed. Together with the +// orchestrator's post-cancel grace (service.CancelGracePeriod) it forms +// ContainerCloseTimeout, which is reserved out of the overall graceful-shutdown +// budget (constants.DefaultShutdownTimeout) so the HTTP-drain phase and this +// phase can't sum past it and get SIGKILLed. Validated by the init() below. +const dispatchDrainTimeout = 8 * time.Second + +// ContainerCloseTimeout is the wall-clock budget for Container.Close: the +// orchestrator drain (dispatchDrainTimeout) plus its post-cancel grace +// (service.CancelGracePeriod). The server budgets the HTTP-shutdown phase and +// this container-close phase separately (see HTTPShutdownTimeout), so the total +// graceful shutdown is a true sum bounded by constants.DefaultShutdownTimeout. +const ContainerCloseTimeout = dispatchDrainTimeout + service.CancelGracePeriod + +// HTTPShutdownTimeout is the wall-clock budget for draining in-flight HTTP +// handlers before the container is closed. It is whatever remains of the overall +// graceful-shutdown budget after the container-close phase is reserved, so the +// two sequential phases can never sum past DefaultShutdownTimeout (which would +// otherwise risk a SIGKILL mid-drain — the orchestrator's grace timer is +// wall-clock, not bound by a shared context). +const HTTPShutdownTimeout = constants.DefaultShutdownTimeout - ContainerCloseTimeout func init() { if dispatchDrainTimeout+service.CancelGracePeriod > constants.DefaultShutdownTimeout { panic("dispatchDrainTimeout + service.CancelGracePeriod exceeds DefaultShutdownTimeout") } + // The HTTP phase must have a positive budget once the container-close phase + // is reserved; otherwise HTTP handlers would get no drain window at all. + if HTTPShutdownTimeout <= 0 { + panic("HTTPShutdownTimeout is non-positive: ContainerCloseTimeout consumes the entire DefaultShutdownTimeout") + } } // Container holds all application dependencies. diff --git a/internal/container/container_test.go b/internal/container/container_test.go index f20f8778..180b27c7 100644 --- a/internal/container/container_test.go +++ b/internal/container/container_test.go @@ -8,10 +8,25 @@ import ( "testing" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/config" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/service" + "github.com/linuxfoundation/lfx-v2-campaign-service/pkg/constants" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +// TestShutdownBudgetComposes verifies the two graceful-shutdown phases sum to at +// most the overall budget, so the sequential srv.Shutdown then Container.Close +// can never overrun DefaultShutdownTimeout (which would risk a SIGKILL +// mid-drain). This guards the invariant the init() in container.go panics on. +func TestShutdownBudgetComposes(t *testing.T) { + // The container-close phase reserves drain + post-cancel grace. + assert.Equal(t, dispatchDrainTimeout+service.CancelGracePeriod, ContainerCloseTimeout) + // The HTTP phase gets a positive share of the remaining budget. + assert.Positive(t, HTTPShutdownTimeout, "HTTP shutdown phase must have a positive budget") + // The two phases together stay within the overall budget. + assert.LessOrEqual(t, HTTPShutdownTimeout+ContainerCloseTimeout, constants.DefaultShutdownTimeout) +} + func TestNewContainer_NoDatabase(t *testing.T) { cfg := &config.Config{ Host: "*", diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index e96d9dd4..df014a0b 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -128,7 +128,22 @@ func (o *Orchestrator) Shutdown(ctx context.Context) error { // closes the DB pool). Without this wait, Container.Close could close the // pool while a just-cancelled run is still mid-statement. o.rootCancel() - grace := time.NewTimer(CancelGracePeriod) + // Cap the grace wait at whatever the caller's context budget still allows, + // so the post-cancel unwind can never push total shutdown past the deadline + // the caller reserved for this phase (Container.Close budgets exactly + // dispatchDrainTimeout + CancelGracePeriod). Without the cap the timer is + // pure wall-clock and would add its full CancelGracePeriod on top of a + // deadline that may already be near-exhausted. + graceDur := CancelGracePeriod + if deadline, ok := ctx.Deadline(); ok { + if remaining := time.Until(deadline); remaining < graceDur { + graceDur = remaining + } + } + if graceDur <= 0 { + return ctx.Err() + } + grace := time.NewTimer(graceDur) defer grace.Stop() select { case <-done: diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index b4983688..126d3f03 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -628,6 +628,40 @@ func TestOrchestrator_ShutdownCancelsOnTimeout(t *testing.T) { close(disp.release) } +// TestOrchestrator_ShutdownGraceBoundedByContext verifies that when the drain +// deadline elapses while a dispatch is still stuck, the post-cancel grace wait +// does not exceed the caller's context budget (it must not add a full, +// wall-clock CancelGracePeriod on top of an already-expired deadline). +func TestOrchestrator_ShutdownGraceBoundedByContext(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + ctxSeen := make(chan context.Context, 1) + disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + <-disp.started + <-ctxSeen // drain the captured ctx so Dispatch can proceed to <-release + + // Short drain budget; the dispatch never releases, so Shutdown must hit the + // deadline path and then wait at most the remaining budget for the grace, + // NOT the full CancelGracePeriod (which is >> this budget). + const budget = 50 * time.Millisecond + deadctx, cancel := context.WithTimeout(context.Background(), budget) + defer cancel() + + start := time.Now() + _ = orch.Shutdown(deadctx) + elapsed := time.Since(start) + + // Allow generous slack for scheduling, but it must be far below the full + // wall-clock CancelGracePeriod that the old (unbounded) timer would impose. + if elapsed >= CancelGracePeriod { + t.Errorf("Shutdown waited %v (>= full CancelGracePeriod %v); grace not bounded by context", elapsed, CancelGracePeriod) + } + close(disp.release) +} + type ctxCapturingDispatcher struct { started chan struct{} release chan struct{} From e0ea197a89b64dd913264e34fa07224a5f014ab4 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 23:34:40 -0700 Subject: [PATCH 30/46] fix(review): give the shutdown grace phase its own budget (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prior fix budgeted the HTTP and container-close phases separately, but Container.Close still passed Orchestrator.Shutdown a context limited to only dispatchDrainTimeout. Combined with the grace timer being capped at the context's remaining budget, the grace collapsed to ~0: when the drain deadline hit, the pool could close while a just-cancelled dispatch was still persisting job/campaign state — risking stuck jobs or partial writes. Fix (addresses the Copilot finding on container.go:182): - Orchestrator.Shutdown now takes an explicit drainTimeout and runs two separately-budgeted phases: a clean drain bounded by drainTimeout, then (only if that elapses and the OUTER ctx still has budget) a post-cancel grace bounded by CancelGracePeriod and the remaining ctx. The outer ctx must carry the full drain+grace budget. - Container.Close passes the full closeCtx (ContainerCloseTimeout = dispatchDrainTimeout + CancelGracePeriod) and the drain timeout as a param, so the grace phase always has its reserved window. - Tests: ShutdownGivesGraceWhenBudgetRemains proves the grace actually runs when budget remains; ShutdownGraceBoundedByContext still proves it can't overrun the deadline. Signed-off-by: Misha Rautela --- internal/container/container.go | 18 +++--- internal/service/orchestrator.go | 80 ++++++++++++++++----------- internal/service/orchestrator_test.go | 58 +++++++++++++++++-- 3 files changed, 112 insertions(+), 44 deletions(-) diff --git a/internal/container/container.go b/internal/container/container.go index 8f24b0e4..45063865 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -168,15 +168,19 @@ func NewContainer(cfg *config.Config) (*Container, error) { } // Close releases any resources held by the container. It first drains in-flight -// campaign dispatch (bounded by ctx and by dispatchDrainTimeout, whichever is -// sooner) so a dispatch that already created an upstream campaign isn't cut off -// before it persists, THEN closes the database pool. ctx is the shared -// graceful-shutdown deadline, so the drain can't run past the overall budget. +// campaign dispatch so a dispatch that already created an upstream campaign +// isn't cut off before it persists, THEN closes the database pool. +// +// Orchestrator.Shutdown runs two separately-budgeted phases: a clean drain +// bounded by dispatchDrainTimeout, then (only if that elapses) a post-cancel +// grace bounded by CancelGracePeriod. Both must fit within ctx, so ctx MUST +// carry the full ContainerCloseTimeout (= dispatchDrainTimeout + +// CancelGracePeriod), not just the drain timeout — otherwise the grace phase +// would have zero budget and the pool could close while a just-cancelled +// dispatch is still finalizing job/campaign state. func (c *Container) Close(ctx context.Context) error { if c.orch != nil { - drainCtx, cancel := context.WithTimeout(ctx, dispatchDrainTimeout) - defer cancel() - if err := c.orch.Shutdown(drainCtx); err != nil { + if err := c.orch.Shutdown(ctx, dispatchDrainTimeout); err != nil { slog.Warn("timed out draining in-flight dispatch on shutdown", "error", err) } } diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index df014a0b..0d8e88fb 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -101,14 +101,24 @@ func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobReposit } } -// Shutdown waits (bounded by ctx) for in-flight dispatch runs to finish, so a -// graceful shutdown doesn't close the database pool out from under a dispatch -// that already created an upstream campaign but hasn't persisted it yet. After -// Shutdown is called, Start rejects new work. If the drain deadline (ctx) -// elapses first, it cancels the in-flight runs (via the shared root context) so -// they stop promptly instead of running against a closing pool, and returns -// ctx.Err(). -func (o *Orchestrator) Shutdown(ctx context.Context) error { +// Shutdown drains in-flight dispatch runs so a graceful shutdown doesn't close +// the database pool out from under a dispatch that already created an upstream +// campaign but hasn't persisted it yet. After Shutdown is called, Start rejects +// new work. +// +// The two phases have SEPARATE budgets so neither starves the other: +// - Clean drain waits up to drainTimeout for all runs to finish on their own. +// - If that elapses, in-flight runs are cancelled (via the shared root +// context) and Shutdown then waits a post-cancel grace for them to observe +// cancellation and finalize before returning (and the caller closes the +// pool). That grace is bounded by CancelGracePeriod AND by whatever the +// outer ctx still allows, whichever is sooner — so the grace timer can +// never push total shutdown past the budget the caller reserved. +// +// ctx is the overall budget for BOTH phases (drain + grace); the caller sizes it +// as dispatchDrainTimeout + CancelGracePeriod. Passing ctx already limited to +// only drainTimeout would leave no room for the grace and defeat its purpose. +func (o *Orchestrator) Shutdown(ctx context.Context, drainTimeout time.Duration) error { o.mu.Lock() o.draining = true o.mu.Unlock() @@ -118,38 +128,42 @@ func (o *Orchestrator) Shutdown(ctx context.Context) error { o.wg.Wait() close(done) }() + + // Phase 1: clean drain, bounded by drainTimeout and the outer ctx. + drainCtx, cancelDrain := context.WithTimeout(ctx, drainTimeout) + defer cancelDrain() select { case <-done: o.rootCancel() return nil - case <-ctx.Done(): - // Drain deadline hit: cancel in-flight runs, then give them a brief bounded - // grace to observe cancellation and unwind before we return (and the caller - // closes the DB pool). Without this wait, Container.Close could close the - // pool while a just-cancelled run is still mid-statement. - o.rootCancel() - // Cap the grace wait at whatever the caller's context budget still allows, - // so the post-cancel unwind can never push total shutdown past the deadline - // the caller reserved for this phase (Container.Close budgets exactly - // dispatchDrainTimeout + CancelGracePeriod). Without the cap the timer is - // pure wall-clock and would add its full CancelGracePeriod on top of a - // deadline that may already be near-exhausted. - graceDur := CancelGracePeriod - if deadline, ok := ctx.Deadline(); ok { - if remaining := time.Until(deadline); remaining < graceDur { - graceDur = remaining - } - } - if graceDur <= 0 { + case <-drainCtx.Done(): + if ctx.Err() != nil { + // The OUTER budget (not just the drain window) is exhausted: cancel and + // return without a grace wait we have no budget for. + o.rootCancel() return ctx.Err() } - grace := time.NewTimer(graceDur) - defer grace.Stop() - select { - case <-done: - case <-grace.C: + } + + // Phase 2: drain deadline hit but outer budget remains. Cancel in-flight runs + // and give them a post-cancel grace to unwind before the pool is closed. + o.rootCancel() + graceDur := CancelGracePeriod + if deadline, ok := ctx.Deadline(); ok { + if remaining := time.Until(deadline); remaining < graceDur { + graceDur = remaining } - return ctx.Err() + } + if graceDur <= 0 { + return context.DeadlineExceeded + } + grace := time.NewTimer(graceDur) + defer grace.Stop() + select { + case <-done: + return nil + case <-grace.C: + return context.DeadlineExceeded } } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 126d3f03..53c48fcd 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -539,7 +539,7 @@ func TestOrchestrator_ShutdownDrainsInFlight(t *testing.T) { shutdownReturned := make(chan error, 1) go func() { - shutdownReturned <- orch.Shutdown(context.Background()) + shutdownReturned <- orch.Shutdown(context.Background(), 5*time.Second) }() // Shutdown must NOT return while the dispatch is blocked. @@ -568,7 +568,7 @@ func TestOrchestrator_StartRejectedAfterShutdown(t *testing.T) { orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ model.ProviderGoogleAds: okDispatcher{}, }) - if err := orch.Shutdown(context.Background()); err != nil { + if err := orch.Shutdown(context.Background(), 5*time.Second); err != nil { t.Fatalf("Shutdown: %v", err) } brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} @@ -617,7 +617,7 @@ func TestOrchestrator_ShutdownCancelsOnTimeout(t *testing.T) { // cancels the run context. deadctx, cancel := context.WithTimeout(context.Background(), time.Millisecond) defer cancel() - _ = orch.Shutdown(deadctx) + _ = orch.Shutdown(deadctx, time.Millisecond) select { case <-dctx.Done(): @@ -651,7 +651,7 @@ func TestOrchestrator_ShutdownGraceBoundedByContext(t *testing.T) { defer cancel() start := time.Now() - _ = orch.Shutdown(deadctx) + _ = orch.Shutdown(deadctx, time.Millisecond) elapsed := time.Since(start) // Allow generous slack for scheduling, but it must be far below the full @@ -662,6 +662,56 @@ func TestOrchestrator_ShutdownGraceBoundedByContext(t *testing.T) { close(disp.release) } +// TestOrchestrator_ShutdownGivesGraceWhenBudgetRemains verifies the two phases +// are budgeted separately: when the drain window elapses but the OUTER ctx still +// has budget, Shutdown actually spends a post-cancel grace waiting for the +// cancelled dispatch to unwind — it must NOT return immediately (which would let +// Container.Close close the pool mid-finalize). This guards the regression where +// Close passed a ctx limited to only the drain timeout, leaving zero grace. +func TestOrchestrator_ShutdownGivesGraceWhenBudgetRemains(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + ctxSeen := make(chan context.Context, 1) + disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + <-disp.started + dctx := <-ctxSeen // the dispatch's own context, cancelled by rootCancel + + // Outer budget comfortably exceeds the tiny drain window, so after drain + // times out there is real grace budget left. + outerCtx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + graceObserved := make(chan struct{}) + go func() { + // The dispatch releases only once it observes its context cancellation — + // i.e. during the grace phase, proving grace actually ran. + <-dctx.Done() + close(graceObserved) + close(disp.release) + }() + + start := time.Now() + _ = orch.Shutdown(outerCtx, 20*time.Millisecond) + elapsed := time.Since(start) + + select { + case <-graceObserved: + default: + t.Fatal("dispatch context was never cancelled; grace phase did not run") + } + // Shutdown must have waited past the drain window (the grace phase happened), + // but well within the outer budget. + if elapsed < 20*time.Millisecond { + t.Errorf("Shutdown returned in %v, before the drain window elapsed; grace phase was skipped", elapsed) + } + if elapsed >= time.Second { + t.Errorf("Shutdown waited %v, at/over the full outer budget", elapsed) + } +} + type ctxCapturingDispatcher struct { started chan struct{} release chan struct{} From 0e0b454095580b90fd990d4884c157632b843e9e Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Fri, 10 Jul 2026 23:51:05 -0700 Subject: [PATCH 31/46] fix(review): bound provider calls and add periodic stuck-job sweep (PR #11) Two durable-dispatch gaps from review: - The dispatch context had no deadline (only cancelled at shutdown), so a provider call that never returns would hold its job "running" and one of the maxParallelDispatch semaphore slots forever. Bound each Dispatch call with providerCallTimeout (2m), derived from the dispatch ctx so a shutdown cancel still propagates. A hung upstream now fails the job and frees the slot. - The one-time startup scan can't recover a job orphaned by a crash younger than staleJobCutoff (too new to look stuck at boot, never re-examined). Add a background StartRecoverySweeper goroutine that re-runs FailStuckJobs every recoverySweepInterval (5m). It is wg-tracked and stops promptly on Shutdown via a dedicated stopSweeper signal (it's maintenance, not in-flight work, so it must not block the dispatch drain). Tests: RecoverySweeperStopsOnShutdown verifies the sweeper is tracked and stops without blocking the drain or firing a tick. Signed-off-by: Misha Rautela --- internal/container/container.go | 5 ++ internal/service/orchestrator.go | 72 ++++++++++++++++++++++++++- internal/service/orchestrator_test.go | 42 ++++++++++++++-- 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/internal/container/container.go b/internal/container/container.go index 45063865..5334adc8 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -156,6 +156,11 @@ func NewContainer(cfg *config.Config) (*Container, error) { slog.Info("recovered stuck jobs on startup", "count", n) } + // The startup scan can't recover a job orphaned by a crash younger than the + // stale cutoff (too new to look stuck at boot, never re-examined). A periodic + // sweep catches those; it stops on Shutdown via the orchestrator's root ctx. + orch.StartRecoverySweeper() + // The health service's readiness depends on the database pool (Readyz). c.Service = service.NewCampaignService(pool) diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 0d8e88fb..c3c0ff2c 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -32,6 +32,15 @@ const CancelGracePeriod = jobFinalizeTimeout + time.Second // a context detached from the (possibly-cancelled) dispatch context. const claimReleaseTimeout = 5 * time.Second +// providerCallTimeout bounds a single provider Dispatch call. The dispatch +// context is otherwise only cancelled at shutdown, so a provider call that hangs +// (unresponsive upstream, dropped connection with no client timeout) would leave +// its job "running" forever and permanently occupy one of the maxParallelDispatch +// semaphore slots. This ceiling guarantees the slot and job are released. It is +// generous: real ad-platform create flows are multi-request but complete in well +// under a minute. +const providerCallTimeout = 2 * time.Minute + // jobFinalizeTimeout bounds the terminal job-status write, which runs on a // context detached from the dispatch context so a cancelled run still reaches a // terminal state instead of being stuck queued/running. @@ -78,6 +87,13 @@ type Orchestrator struct { draining bool rootCtx context.Context rootCancel context.CancelFunc + // stopSweeper signals the background recovery sweeper (if started) to stop. + // Closed once, guarded by sweeperOnce, at the start of Shutdown so the sweeper + // exits promptly without waiting for the dispatch-drain deadline. The sweeper + // is a periodic maintenance loop, not in-flight work, so it can stop + // immediately — unlike dispatch runs, which drain first. + stopSweeper chan struct{} + sweeperOnce sync.Once // sem is a process-wide semaphore bounding concurrent provider dispatches // across ALL jobs (a per-job errgroup limit would let N concurrent jobs each // get maxParallelDispatch slots, leaving total provider calls unbounded). @@ -97,10 +113,54 @@ func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobReposit dispatchers: dispatchers, rootCtx: rootCtx, rootCancel: rootCancel, + stopSweeper: make(chan struct{}), sem: make(chan struct{}, maxParallelDispatch), } } +// recoverySweepInterval is how often the background sweeper re-scans for stuck +// jobs. The startup scan alone can't recover a job orphaned by a crash less than +// staleJobCutoff ago (it's too young to be considered stuck at boot and is never +// re-examined); a periodic sweep eventually catches it. Kept well below +// staleJobCutoff so a newly-stuck job is picked up within roughly one cutoff +// window rather than only on the next restart. +const recoverySweepInterval = 5 * time.Minute + +// StartRecoverySweeper launches a background goroutine that periodically fails +// jobs stuck past staleJobCutoff, complementing the one-time startup scan so a +// job orphaned by a crash younger than the cutoff is still eventually recovered. +// The goroutine is tracked by wg and stops when the root context is cancelled +// (i.e. on Shutdown), so it never runs against a closing pool. Call once after +// construction. +func (o *Orchestrator) StartRecoverySweeper() { + o.wg.Add(1) + go func() { + defer o.wg.Done() + ticker := time.NewTicker(recoverySweepInterval) + defer ticker.Stop() + for { + select { + case <-o.stopSweeper: + return + case <-o.rootCtx.Done(): + return + case <-ticker.C: + // Bound each sweep so a slow DB can't wedge the goroutine. Detach from + // rootCtx so a sweep already in flight isn't cut mid-statement by the + // stop signal; the loop still exits on the next iteration. + sctx, cancel := context.WithTimeout(context.WithoutCancel(o.rootCtx), jobFinalizeTimeout) + n, err := o.jobs.FailStuckJobs(sctx, "job did not complete before a service restart") + cancel() + if err != nil { + slog.ErrorContext(o.rootCtx, "periodic stuck-job sweep failed", "error", err) + } else if n > 0 { + slog.InfoContext(o.rootCtx, "periodic stuck-job sweep recovered jobs", "count", n) + } + } + } + }() +} + // Shutdown drains in-flight dispatch runs so a graceful shutdown doesn't close // the database pool out from under a dispatch that already created an upstream // campaign but hasn't persisted it yet. After Shutdown is called, Start rejects @@ -123,6 +183,11 @@ func (o *Orchestrator) Shutdown(ctx context.Context, drainTimeout time.Duration) o.draining = true o.mu.Unlock() + // Stop the periodic recovery sweeper immediately (it's maintenance, not + // in-flight work) so wg.Wait below only blocks on real dispatch runs. Safe to + // call whether or not the sweeper was started. + o.sweeperOnce.Do(func() { close(o.stopSweeper) }) + done := make(chan struct{}) go func() { o.wg.Wait() @@ -367,7 +432,12 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief } } - campaign, derr := d.Dispatch(ctx, brief, p, config) + // Bound the provider call so a hung upstream can't hold this job "running" and + // its semaphore slot indefinitely. Derived from the dispatch ctx so a shutdown + // cancel still propagates, but with its own ceiling. + callCtx, cancelCall := context.WithTimeout(ctx, providerCallTimeout) + defer cancelCall() + campaign, derr := d.Dispatch(callCtx, brief, p, config) if derr != nil { // A dispatch error usually does NOT prove the provider rejected the create — // a timeout or dropped connection can leave a campaign created upstream — so diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 53c48fcd..cea311f8 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -18,9 +18,10 @@ import ( // fakeJobRepo records job status transitions. type fakeJobRepo struct { - mu sync.Mutex - jobs map[string]*model.CampaignJob - counter int + mu sync.Mutex + jobs map[string]*model.CampaignJob + counter int + failStuckCalls int } func newFakeJobRepo() *fakeJobRepo { return &fakeJobRepo{jobs: map[string]*model.CampaignJob{}} } @@ -57,9 +58,16 @@ func (r *fakeJobRepo) UpdateJobStatus(_ context.Context, id string, status model return nil } +func (r *fakeJobRepo) failStuckCallCount() int { + r.mu.Lock() + defer r.mu.Unlock() + return r.failStuckCalls +} + func (r *fakeJobRepo) FailStuckJobs(_ context.Context, jobErr string) (int64, error) { r.mu.Lock() defer r.mu.Unlock() + r.failStuckCalls++ var n int64 for _, j := range r.jobs { if j.Status == model.JobQueued || j.Status == model.JobRunning { @@ -560,6 +568,34 @@ func TestOrchestrator_ShutdownDrainsInFlight(t *testing.T) { } } +// TestOrchestrator_RecoverySweeperStopsOnShutdown verifies the background +// recovery sweeper is tracked by the wait group and stops promptly on Shutdown +// (it must not block the drain until a ticker fires), so Shutdown returns +// quickly with no in-flight dispatch. +func TestOrchestrator_RecoverySweeperStopsOnShutdown(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, nil) + orch.StartRecoverySweeper() + + done := make(chan error, 1) + go func() { done <- orch.Shutdown(context.Background(), 5*time.Second) }() + + select { + case err := <-done: + if err != nil { + t.Errorf("Shutdown err = %v, want nil", err) + } + case <-time.After(2 * time.Second): + t.Fatal("Shutdown did not return promptly; sweeper likely blocked the drain") + } + // The sweeper interval (5m) is far longer than this test, so FailStuckJobs + // must not have been called by a tick — it stopped on the stop signal. + if c := jobs.failStuckCallCount(); c != 0 { + t.Errorf("FailStuckJobs called %d times; sweeper should have stopped before any tick", c) + } +} + // TestOrchestrator_StartRejectedAfterShutdown verifies Start refuses new work // once Shutdown has been initiated. func TestOrchestrator_StartRejectedAfterShutdown(t *testing.T) { From 98b71e763d16517e706b5c0d1448d57f920f02e2 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Sat, 11 Jul 2026 00:04:34 -0700 Subject: [PATCH 32/46] fix(review): honor ctx cancel in grace wait, bound dispatch queue wait (PR #11) Two follow-up review findings: - The post-cancel grace select observed only <-done and the grace timer, not <-ctx.Done(). A caller that cancels ctx (rather than hitting the deadline we pre-accounted for) would still block the full CancelGracePeriod. Added a <-ctx.Done() case so a cancel ends the wait promptly. - A platform's wait on the process-wide dispatch semaphore was unbounded, so a large backlog could keep a job queued longer than staleJobCutoff and the recovery sweep would wrongly fail a still-live job. Bounded the wait with dispatchQueueTimeout (10m); on timeout the platform is recorded failed and the job finalizes. queue + provider-call + finalize now stays within the 15m cutoff, so a progressing job can't look stuck. Updated FailStuckJobs' doc to state the cutoff-vs-live-job invariant and that the sweep is periodic. Test: ShutdownGraceHonorsContextCancel locks in the cancel-during-grace path. Signed-off-by: Misha Rautela --- internal/infrastructure/postgres/job_repo.go | 22 ++++++------ internal/service/orchestrator.go | 28 +++++++++++++-- internal/service/orchestrator_test.go | 36 ++++++++++++++++++++ 3 files changed, 73 insertions(+), 13 deletions(-) diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index 140e9cde..637492b0 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -79,17 +79,19 @@ func (r *JobRepo) UpdateJobStatus(ctx context.Context, id string, status model.J } // FailStuckJobs marks non-terminal jobs older than staleJobCutoff as failed. Run -// once on startup: a queued/running job's dispatch goroutine lives only in the -// process that created it, so after a restart such a job would otherwise stay -// non-terminal forever. Fail-forward (rather than resume) because a -// partially-dispatched job cannot be safely re-driven without provider-side -// idempotency keys. +// on startup AND periodically (see Orchestrator.StartRecoverySweeper): a +// queued/running job's dispatch goroutine lives only in the process that created +// it, so after a crash such a job would otherwise stay non-terminal forever. +// Fail-forward (rather than resume) because a partially-dispatched job cannot be +// safely re-driven without provider-side idempotency keys. // -// The age cutoff is important during rolling deploys: an old pod can still be -// actively dispatching a recently-created job while a new pod boots, so only -// jobs that have been idle (no update) longer than the cutoff — well beyond any -// live dispatch — are considered orphaned. A live job is updated to running on -// start and to terminal on finish, so a genuinely-stuck job stops being touched. +// The age cutoff must exceed the longest a LIVE job can go without a status +// write, or the sweep would wrongly fail an in-progress job. The orchestrator +// bounds that: a platform waits at most dispatchQueueTimeout for a slot, then +// the provider call is bounded by providerCallTimeout, then a terminal write +// follows — all well within staleJobCutoff (15m). During a rolling deploy an old +// pod can still be dispatching a recently-created job while a new pod boots, so +// only jobs idle (no update) beyond the cutoff are treated as orphaned. func (r *JobRepo) FailStuckJobs(ctx context.Context, jobErr string) (int64, error) { q := `UPDATE campaign_jobs SET status='failed', error=$1, updated_at=now() WHERE status IN ('queued','running') diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index c3c0ff2c..ccf2e1f7 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -32,6 +32,14 @@ const CancelGracePeriod = jobFinalizeTimeout + time.Second // a context detached from the (possibly-cancelled) dispatch context. const claimReleaseTimeout = 5 * time.Second +// dispatchQueueTimeout bounds how long a platform waits for a semaphore slot +// before it's recorded as failed. Without it, a large backlog could keep a job +// queued longer than staleJobCutoff, so the recovery sweep would wrongly fail a +// still-live job. Kept comfortably below staleJobCutoff (15m) even added to +// providerCallTimeout and the finalize write, so a job that is actually +// progressing always reaches a terminal state before it could look stuck. +const dispatchQueueTimeout = 10 * time.Minute + // providerCallTimeout bounds a single provider Dispatch call. The dispatch // context is otherwise only cancelled at shutdown, so a provider call that hangs // (unresponsive upstream, dropped connection with no client timeout) would leave @@ -229,6 +237,10 @@ func (o *Orchestrator) Shutdown(ctx context.Context, drainTimeout time.Duration) return nil case <-grace.C: return context.DeadlineExceeded + case <-ctx.Done(): + // Caller cancelled (not just a deadline we already accounted for): stop + // waiting immediately rather than blocking out the whole grace window. + return ctx.Err() } } @@ -303,12 +315,22 @@ func (o *Orchestrator) run(ctx context.Context, jobID string, brief *model.Campa // Bound concurrent dispatches process-wide (across all jobs) via the // shared semaphore. Honor cancellation so a draining shutdown doesn't - // block here. + // block here, and bound the wait so a large backlog can't keep a job + // queued so long it looks stuck to the recovery sweep (which would then + // wrongly fail a still-live job). If no slot frees in time, record this + // platform as failed and let the job finalize promptly. + queueCtx, cancelQueue := context.WithTimeout(gctx, dispatchQueueTimeout) select { case o.sem <- struct{}{}: + cancelQueue() defer func() { <-o.sem }() - case <-gctx.Done(): - res.Error = "dispatch cancelled" + case <-queueCtx.Done(): + cancelQueue() + if gctx.Err() != nil { + res.Error = "dispatch cancelled" + } else { + res.Error = "dispatch queue timed out waiting for a slot" + } results[i] = res return nil } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index cea311f8..71ace097 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -568,6 +568,42 @@ func TestOrchestrator_ShutdownDrainsInFlight(t *testing.T) { } } +// TestOrchestrator_ShutdownGraceHonorsContextCancel verifies that during the +// post-cancel grace wait, a caller CANCEL of ctx (not just its deadline) ends +// the wait promptly instead of blocking the full CancelGracePeriod. +func TestOrchestrator_ShutdownGraceHonorsContextCancel(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + ctxSeen := make(chan context.Context, 1) + disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + <-disp.started + <-ctxSeen + + // A cancelable ctx with no deadline; the dispatch never releases, so Shutdown + // enters the grace wait. Cancelling ctx must unblock it well before the full + // CancelGracePeriod. + ctx, cancel := context.WithCancel(context.Background()) + done := make(chan error, 1) + go func() { done <- orch.Shutdown(ctx, 10*time.Millisecond) }() + + // Let the drain window elapse so Shutdown is in the grace wait, then cancel. + time.Sleep(40 * time.Millisecond) + start := time.Now() + cancel() + select { + case <-done: + case <-time.After(2 * time.Second): + t.Fatal("Shutdown did not return after ctx cancel during grace") + } + if elapsed := time.Since(start); elapsed >= CancelGracePeriod { + t.Errorf("grace wait took %v after cancel; did not observe ctx cancellation", elapsed) + } + close(disp.release) +} + // TestOrchestrator_RecoverySweeperStopsOnShutdown verifies the background // recovery sweeper is tracked by the wait group and stops promptly on Shutdown // (it must not block the drain until a ticker fires), so Shutdown returns From 0d5449cf7cb8496e3950494b610ac85a326d6b55 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 13 Jul 2026 16:48:40 -0700 Subject: [PATCH 33/46] fix(review): index recovery query; interruptible sweeper; force-close on shutdown (PR #11) Addresses copilot[bot] review threads on PR #11: - Add migration 000004: partial index idx_campaign_jobs_recovery on campaign_jobs (updated_at) WHERE status IN ('queued','running') so the periodic FailStuckJobs recovery sweep no longer full-scans the table as terminal job history grows. Up/down provided; concept doc updated. - Give the recovery sweeper a dedicated cancel context (sweeperCtx), cancelled at the very start of Shutdown before the dispatch drain, so a sweep blocked in the DB is interrupted promptly and the sweeper's shutdown never competes with the dispatch-drain budget. Still tracked by wg so the pool isn't closed under it. Removes the detached-context design that could not be interrupted. - server.go: after graceful Shutdown(ctx) expires with handlers still running, force srv.Close() before container/pool close so no straggler handler touches the pool as it closes. Full handler-completion tracking is residual under LFXV2-2665. Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 22 ++++- cmd/campaign-service/server_test.go | 28 ++++--- .../code/internal-infrastructure-postgres.md | 19 +++++ ...0004_campaign_jobs_recovery_index.down.sql | 5 ++ ...000004_campaign_jobs_recovery_index.up.sql | 25 ++++++ internal/service/orchestrator.go | 81 ++++++++++++------- internal/service/orchestrator_test.go | 77 ++++++++++++++++++ 7 files changed, 218 insertions(+), 39 deletions(-) create mode 100644 internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.down.sql create mode 100644 internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.up.sql diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 140c4f7f..00d51e01 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -38,6 +38,8 @@ func StartServer(ctx context.Context, cfg *config.Config) error { return err } + // NOTE: debug.LogPayloads() is intentionally NOT applied. Every authenticated + // payload carries a BearerToken (a valid JWT), and the connection service's // create/set-credential payloads carry plaintext provider credentials (OAuth // refresh tokens, client secrets), so enabling it would leak those secrets // into logs. debug.HTTP() IS still applied below, but in clue v1.2.1 it does @@ -186,10 +188,28 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container // phases separately makes the total a true sum: httpShutdownTimeout + // (dispatchDrainTimeout + CancelGracePeriod) <= DefaultShutdownTimeout, which // container.go asserts at init. + // Shutdown ordering is explicit: + // 1. graceful srv.Shutdown(httpCtx) — stop accepting, drain handlers. + // 2. on httpCtx expiry, force srv.Close() — http.Server.Shutdown RETURNS on + // ctx expiry even if handlers are STILL running; those stragglers could + // then touch the DB pool while container/pool close runs (and pgxpool.Close + // itself can block on a connection a handler still holds). Close() forcibly + // terminates all connections so no handler is still using the pool when it + // closes. Force-close only after a timeout — on a clean Shutdown there are + // no lingering connections and Close() is a harmless no-op. + // 3. THEN cont.Close(closeCtx) — drain in-flight dispatch, then close the pool. + // Fully coordinating handler completion (waiting out each straggler) needs + // cross-request tracking beyond this PR — tracked in LFXV2-2665; the srv.Close() + // hardening here removes the pool-use-after-close hazard in-scope. httpCtx, cancelHTTP := context.WithTimeout(context.Background(), container.HTTPShutdownTimeout) defer cancelHTTP() if err := srv.Shutdown(httpCtx); err != nil { - slog.ErrorContext(ctx, "HTTP server shutdown error", log.ErrKey, err) + slog.ErrorContext(ctx, "HTTP server shutdown error; force-closing lingering connections", log.ErrKey, err) + // Shutdown's ctx expired with handlers still running (or it otherwise + // failed). Force-close so no straggler can touch the pool as it closes. + if cerr := srv.Close(); cerr != nil { + slog.ErrorContext(ctx, "HTTP server force-close error", log.ErrKey, cerr) + } } closeCtx, cancelClose := context.WithTimeout(context.Background(), container.ContainerCloseTimeout) defer cancelClose() diff --git a/cmd/campaign-service/server_test.go b/cmd/campaign-service/server_test.go index 8eec48f8..ae592900 100644 --- a/cmd/campaign-service/server_test.go +++ b/cmd/campaign-service/server_test.go @@ -10,6 +10,7 @@ import ( "strings" "testing" + briefsvc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" connsvc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_connections" svc "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_svc" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/config" @@ -25,11 +26,13 @@ import ( // (any non-404 status, e.g. 401/503, proves it is mounted). func TestConnectionRoutesAreMounted(t *testing.T) { endpoints := svc.NewEndpoints(service.NewCampaignService(nil)) - // The no-DB connection service is a real Service whose routes return a typed - // 503 rather than 404 — perfect for proving the route is mounted. + // The no-DB connection and brief services are real Services whose routes + // return a typed 503 rather than 404 — perfect for proving the route is + // mounted. connEndpoints := connsvc.NewEndpoints(service.NewConnectionService(nil, nil)) + briefEndpoints := briefsvc.NewEndpoints(service.NewBriefService(nil, nil, nil, nil)) - mux, err := buildMux(context.Background(), &config.Config{}, endpoints, connEndpoints) + mux, err := buildMux(context.Background(), &config.Config{}, endpoints, connEndpoints, briefEndpoints) if err != nil { t.Fatalf("buildMux: %v", err) } @@ -41,6 +44,7 @@ func TestConnectionRoutesAreMounted(t *testing.T) { path string }{ {"connection google-ads create", http.MethodPost, "/projects/proj-123/connection-google-ads"}, + {"brief create", http.MethodPost, "/projects/proj-123/briefs"}, {"campaign health livez", http.MethodGet, "/livez"}, } for _, tc := range cases { @@ -56,12 +60,18 @@ func TestConnectionRoutesAreMounted(t *testing.T) { } } -// TestBuildMuxNilConnEndpointsFailsLoud verifies the fail-loud guard: a nil -// connEndpoints (a programmer-level mis-wiring) returns an error rather than -// silently building a mux with the connection routes unmounted. -func TestBuildMuxNilConnEndpointsFailsLoud(t *testing.T) { +// TestBuildMuxNilEndpointsFailsLoud verifies the fail-loud guard: a nil +// connEndpoints or briefEndpoints (a programmer-level mis-wiring) returns an +// error rather than silently building a mux with those routes unmounted. +func TestBuildMuxNilEndpointsFailsLoud(t *testing.T) { endpoints := svc.NewEndpoints(service.NewCampaignService(nil)) - if _, err := buildMux(context.Background(), &config.Config{}, endpoints, nil); err == nil { - t.Fatal("expected buildMux to fail loudly when connEndpoints is nil, got nil error") + connEndpoints := connsvc.NewEndpoints(service.NewConnectionService(nil, nil)) + briefEndpoints := briefsvc.NewEndpoints(service.NewBriefService(nil, nil, nil, nil)) + + if _, err := buildMux(context.Background(), &config.Config{}, endpoints, nil, briefEndpoints); err == nil { + t.Error("expected buildMux to fail loudly when connEndpoints is nil, got nil error") + } + if _, err := buildMux(context.Background(), &config.Config{}, endpoints, connEndpoints, nil); err == nil { + t.Error("expected buildMux to fail loudly when briefEndpoints is nil, got nil error") } } diff --git a/docs/knowledge/code/internal-infrastructure-postgres.md b/docs/knowledge/code/internal-infrastructure-postgres.md index 4c98c327..06521141 100644 --- a/docs/knowledge/code/internal-infrastructure-postgres.md +++ b/docs/knowledge/code/internal-infrastructure-postgres.md @@ -14,4 +14,23 @@ with `otelpgx`), migration runner, and repository implementations. `ReadinessChecker` interface. Pool open fails fast on ping failure so unreachable databases do not wedge startup. +## Migrations + +SQL migrations live under `migrations/` and are embedded (`//go:embed *.sql`) +so golang-migrate's iofs source can run them from the compiled binary. Each +version is a paired `NNNNNN_name.up.sql` / `.down.sql`; applied versions are +never re-run, so a schema change is always a NEW version, never an edit to an +applied file. + +- `000001` — connection tables. +- `000002` — brief, campaign, and async-job tables. Indexes: `campaign_jobs` + on `brief_id`; `campaigns` on `project_id`. `(brief_id, platform)` / + `(project_id, event_slug)` uniqueness covers those leftmost columns. +- `000003` — brief `project_id` UUID→TEXT and partial-unique + `(project_id, event_slug)` excluding archived rows. +- `000004` — partial index `idx_campaign_jobs_recovery` on + `campaign_jobs (updated_at) WHERE status IN ('queued','running')`, supporting + the periodic stuck-job recovery sweep (`JobRepo.FailStuckJobs`) so it does not + full-scan campaign_jobs as terminal job history grows. + See [internal/infrastructure/postgres](../../../internal/infrastructure/postgres). diff --git a/internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.down.sql b/internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.down.sql new file mode 100644 index 00000000..48cbf3f2 --- /dev/null +++ b/internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.down.sql @@ -0,0 +1,5 @@ +-- Copyright The Linux Foundation and each contributor to LFX. +-- SPDX-License-Identifier: MIT + +-- Drop the partial recovery index added in 000004.up.sql. +DROP INDEX IF EXISTS idx_campaign_jobs_recovery; diff --git a/internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.up.sql b/internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.up.sql new file mode 100644 index 00000000..75cb68d7 --- /dev/null +++ b/internal/infrastructure/postgres/migrations/000004_campaign_jobs_recovery_index.up.sql @@ -0,0 +1,25 @@ +-- Copyright The Linux Foundation and each contributor to LFX. +-- SPDX-License-Identifier: MIT + +-- Support the stuck-job recovery query (JobRepo.FailStuckJobs), which runs on +-- startup AND every recoverySweepInterval (5m) on EVERY replica: +-- +-- UPDATE campaign_jobs SET ... WHERE status IN ('queued','running') +-- AND updated_at < now() - ; +-- +-- 000002 only indexes brief_id, so this predicate does a full table scan of +-- campaign_jobs on every sweep. As terminal job history (succeeded/partial/ +-- failed) accumulates that scan grows unbounded, even though the live set the +-- sweep actually touches (queued/running) stays tiny. +-- +-- A PARTIAL index on updated_at, restricted to exactly the two non-terminal +-- statuses the predicate matches, keeps the index small (it never grows with +-- terminal history) and lets the sweep read only the candidate rows ordered by +-- updated_at. It is transparent to behavior — purely a performance fix. +-- +-- Separate migration (not an edit to 000002): golang-migrate records applied +-- versions and never re-runs them, so amending 000002 would silently skip DBs +-- that already ran it. +CREATE INDEX IF NOT EXISTS idx_campaign_jobs_recovery + ON campaign_jobs (updated_at) + WHERE status IN ('queued', 'running'); diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index ccf2e1f7..a420e1f8 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -95,13 +95,23 @@ type Orchestrator struct { draining bool rootCtx context.Context rootCancel context.CancelFunc - // stopSweeper signals the background recovery sweeper (if started) to stop. - // Closed once, guarded by sweeperOnce, at the start of Shutdown so the sweeper - // exits promptly without waiting for the dispatch-drain deadline. The sweeper - // is a periodic maintenance loop, not in-flight work, so it can stop - // immediately — unlike dispatch runs, which drain first. - stopSweeper chan struct{} - sweeperOnce sync.Once + // sweeperCtx / sweeperCancel own the background recovery sweeper's lifetime, + // SEPARATELY from rootCtx (which owns dispatch runs). Cancelled once, guarded + // by sweeperOnce, at the very START of Shutdown — before the dispatch drain — + // so: + // 1. A sweep already blocked in the DB is interrupted PROMPTLY (its query + // derives from sweeperCtx, so cancelling it aborts the statement rather + // than waiting for it to return on its own). + // 2. The sweeper's own timeout/cancellation is spent up front and can never + // consume any of the dispatch-drain budget — the drain phase (bounded by + // drainTimeout) and the sweeper shutdown do not compete for a deadline, + // so a maintenance query can't starve healthy in-flight dispatches. + // The sweeper is still tracked by o.wg, so Shutdown waits for it to return + // before the caller closes the pool; but because it's cancelled first, that + // wait is effectively instantaneous and does not eat into the drain window. + sweeperCtx context.Context + sweeperCancel context.CancelFunc + sweeperOnce sync.Once // sem is a process-wide semaphore bounding concurrent provider dispatches // across ALL jobs (a per-job errgroup limit would let N concurrent jobs each // get maxParallelDispatch slots, leaving total provider calls unbounded). @@ -115,14 +125,16 @@ func NewOrchestrator(campaigns domain.CampaignRepository, jobs domain.JobReposit dispatchers = map[model.Provider]PlatformDispatcher{} } rootCtx, rootCancel := context.WithCancel(context.Background()) + sweeperCtx, sweeperCancel := context.WithCancel(context.Background()) return &Orchestrator{ - campaigns: campaigns, - jobs: jobs, - dispatchers: dispatchers, - rootCtx: rootCtx, - rootCancel: rootCancel, - stopSweeper: make(chan struct{}), - sem: make(chan struct{}, maxParallelDispatch), + campaigns: campaigns, + jobs: jobs, + dispatchers: dispatchers, + rootCtx: rootCtx, + rootCancel: rootCancel, + sweeperCtx: sweeperCtx, + sweeperCancel: sweeperCancel, + sem: make(chan struct{}, maxParallelDispatch), } } @@ -137,8 +149,13 @@ const recoverySweepInterval = 5 * time.Minute // StartRecoverySweeper launches a background goroutine that periodically fails // jobs stuck past staleJobCutoff, complementing the one-time startup scan so a // job orphaned by a crash younger than the cutoff is still eventually recovered. -// The goroutine is tracked by wg and stops when the root context is cancelled -// (i.e. on Shutdown), so it never runs against a closing pool. Call once after +// +// The goroutine is tracked by wg (so Shutdown waits for it before the pool +// closes) but its lifetime is owned by sweeperCtx, NOT rootCtx: Shutdown cancels +// sweeperCtx first, before draining dispatch runs. Because the in-flight sweep's +// query derives from sweeperCtx, cancelling it interrupts a sweep already +// blocked in the DB promptly, and it does so up front so the sweeper's own +// shutdown never competes with the dispatch-drain budget. Call once after // construction. func (o *Orchestrator) StartRecoverySweeper() { o.wg.Add(1) @@ -148,21 +165,24 @@ func (o *Orchestrator) StartRecoverySweeper() { defer ticker.Stop() for { select { - case <-o.stopSweeper: - return - case <-o.rootCtx.Done(): + case <-o.sweeperCtx.Done(): return case <-ticker.C: - // Bound each sweep so a slow DB can't wedge the goroutine. Detach from - // rootCtx so a sweep already in flight isn't cut mid-statement by the - // stop signal; the loop still exits on the next iteration. - sctx, cancel := context.WithTimeout(context.WithoutCancel(o.rootCtx), jobFinalizeTimeout) + // Bound each sweep so a slow DB can't wedge the goroutine, but derive it + // from sweeperCtx (do NOT detach) so cancelling sweeperCtx at Shutdown + // interrupts a sweep already blocked mid-statement rather than letting it + // run to its own timeout against a closing pool. + sctx, cancel := context.WithTimeout(o.sweeperCtx, jobFinalizeTimeout) n, err := o.jobs.FailStuckJobs(sctx, "job did not complete before a service restart") cancel() if err != nil { - slog.ErrorContext(o.rootCtx, "periodic stuck-job sweep failed", "error", err) + // A cancellation here is the expected outcome when Shutdown interrupts + // an in-flight sweep, not a real failure — don't log it as an error. + if o.sweeperCtx.Err() == nil { + slog.ErrorContext(o.sweeperCtx, "periodic stuck-job sweep failed", "error", err) + } } else if n > 0 { - slog.InfoContext(o.rootCtx, "periodic stuck-job sweep recovered jobs", "count", n) + slog.InfoContext(o.sweeperCtx, "periodic stuck-job sweep recovered jobs", "count", n) } } } @@ -191,10 +211,13 @@ func (o *Orchestrator) Shutdown(ctx context.Context, drainTimeout time.Duration) o.draining = true o.mu.Unlock() - // Stop the periodic recovery sweeper immediately (it's maintenance, not - // in-flight work) so wg.Wait below only blocks on real dispatch runs. Safe to - // call whether or not the sweeper was started. - o.sweeperOnce.Do(func() { close(o.stopSweeper) }) + // Cancel the periodic recovery sweeper FIRST, before the dispatch drain. It's + // maintenance, not in-flight work, so it stops immediately; cancelling its + // dedicated context also interrupts any sweep currently blocked in the DB + // (see StartRecoverySweeper). Doing this up front means the sweeper's own + // shutdown never draws down the dispatch-drain budget, and wg.Wait below then + // blocks only on real dispatch runs. Safe whether or not the sweeper started. + o.sweeperOnce.Do(o.sweeperCancel) done := make(chan struct{}) go func() { diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 71ace097..efd9d4b5 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -848,6 +848,83 @@ func TestOrchestrator_PreCreateErrorReleasesClaim(t *testing.T) { } } +// blockingSweepJobRepo blocks inside FailStuckJobs until its context is +// cancelled, letting a test prove that cancelling the sweeper's context +// interrupts an in-flight sweep promptly (rather than the sweep running to its +// own timeout against a closing pool). +type blockingSweepJobRepo struct { + fakeJobRepo + entered chan struct{} +} + +func (r *blockingSweepJobRepo) FailStuckJobs(ctx context.Context, _ string) (int64, error) { + select { + case r.entered <- struct{}{}: + default: + } + <-ctx.Done() // block until the sweeper's context is cancelled + return 0, ctx.Err() +} + +// TestOrchestrator_SweeperInterruptedOnShutdown verifies that a sweep already +// blocked in the DB is interrupted PROMPTLY when Shutdown cancels the sweeper's +// dedicated context, and that Shutdown still completes within budget. Uses a +// tiny sweep interval so a sweep starts quickly, and a repo whose FailStuckJobs +// blocks until its context is cancelled. +func TestOrchestrator_SweeperInterruptedOnShutdown(t *testing.T) { + jobs := &blockingSweepJobRepo{ + fakeJobRepo: fakeJobRepo{jobs: map[string]*model.CampaignJob{}}, + entered: make(chan struct{}, 1), + } + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, nil) + // Drive the sweeper on a very short interval so a sweep begins promptly. The + // sweeper reads sweeperCtx, so overriding the interval doesn't affect the + // cancellation path under test. + orch.sweeperCtx, orch.sweeperCancel = context.WithCancel(context.Background()) + orch.wg.Add(1) + go func() { + defer orch.wg.Done() + ticker := time.NewTicker(time.Millisecond) + defer ticker.Stop() + for { + select { + case <-orch.sweeperCtx.Done(): + return + case <-ticker.C: + sctx, cancel := context.WithTimeout(orch.sweeperCtx, jobFinalizeTimeout) + _, _ = jobs.FailStuckJobs(sctx, "x") + cancel() + } + } + }() + + // Wait until a sweep is actually blocked inside FailStuckJobs. + select { + case <-jobs.entered: + case <-time.After(time.Second): + t.Fatal("sweep never started") + } + + // Shutdown must cancel the sweeper's context (interrupting the blocked sweep) + // and return quickly — well under the jobFinalizeTimeout the sweep would + // otherwise wait for. + done := make(chan error, 1) + start := time.Now() + go func() { done <- orch.Shutdown(context.Background(), 5*time.Second) }() + select { + case err := <-done: + if err != nil { + t.Errorf("Shutdown err = %v, want nil", err) + } + case <-time.After(2 * time.Second): + t.Fatal("Shutdown did not return; blocked sweep was not interrupted") + } + if elapsed := time.Since(start); elapsed >= jobFinalizeTimeout { + t.Errorf("Shutdown took %v (>= jobFinalizeTimeout %v); sweep was not interrupted promptly", elapsed, jobFinalizeTimeout) + } +} + // TestBriefETagIsQuoted verifies the emitted ETag is a quoted entity-tag. func TestBriefETagIsQuoted(t *testing.T) { if got := briefETag(3); got != `"3"` { From 07ac3cdf5396da95205a2f571c2c0fbd2ddcabbe Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 13 Jul 2026 22:11:29 -0700 Subject: [PATCH 34/46] fix(review): atomic approve-to-dispatch; persist under grace ctx; safe shutdown order (PR #11) - Close the approve->dispatch TOCTOU race: CreateCampaigns now passes the brief version it read as approved into Orchestrator.Start, which creates the job via a new JobRepository.CreateJobForApprovedBrief. That method re-verifies the brief is still approved at that version atomically with the job insert (INSERT ... SELECT ... WHERE EXISTS on approved+version), so a concurrent replace/archive committing in the window bumps the version, inserts zero rows, and the request fails 409 instead of launching paid campaigns from a stale approved snapshot. Reported by copilot[bot]. - Persist a successful provider result on a context detached from the cancelled dispatch context (context.WithoutCancel + persistResultTimeout). Once the paid upstream campaign exists, recording its id must not be abandoned because phase-two shutdown cancelled the dispatch context; the bounded detached ctx completes within the grace window and cannot hang shutdown. Grew CancelGracePeriod to cover both detached writes (persist + finalize) and trimmed dispatchDrainTimeout so the total stays within the shutdown budget (asserted in container init). Reported by copilot[bot]. - Shutdown ordering: graceful srv.Shutdown is the primary path (waits for handlers up to the deadline), srv.Close is the last-resort force on deadline expiry, and the container/pool close runs only after that bounded HTTP drain. Documented that stdlib cannot await stragglers past Close; residual cross-request handler tracking noted under LFXV2-2665. Reported by copilot[bot]. Fully coordinating handler completion across replicas / cross-request tracking is out of scope and tracked under LFXV2-2665. Signed-off-by: Misha Rautela --- internal/container/container.go | 7 +- internal/domain/brief_port.go | 10 ++ internal/infrastructure/postgres/job_repo.go | 36 +++++ internal/service/brief.go | 7 +- internal/service/brief_test.go | 113 +++++++++++++++- internal/service/orchestrator.go | 56 ++++++-- internal/service/orchestrator_test.go | 130 ++++++++++++++++--- 7 files changed, 328 insertions(+), 31 deletions(-) diff --git a/internal/container/container.go b/internal/container/container.go index 5334adc8..1cd7fb76 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -32,7 +32,12 @@ const startupDBTimeout = 15 * time.Second // ContainerCloseTimeout, which is reserved out of the overall graceful-shutdown // budget (constants.DefaultShutdownTimeout) so the HTTP-drain phase and this // phase can't sum past it and get SIGKILLed. Validated by the init() below. -const dispatchDrainTimeout = 8 * time.Second +// +// Sized so dispatchDrainTimeout + CancelGracePeriod leaves a positive HTTP-drain +// budget: CancelGracePeriod grew to cover the post-provider persist AND the +// terminal finalize write (both detached, both must complete during grace), so +// the drain window is trimmed to keep the total within DefaultShutdownTimeout. +const dispatchDrainTimeout = 6 * time.Second // ContainerCloseTimeout is the wall-clock budget for Container.Close: the // orchestrator drain (dispatchDrainTimeout) plus its post-cancel grace diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index 96e09e2a..be125646 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -81,6 +81,16 @@ type CampaignRepository interface { type JobRepository interface { // CreateJob inserts a queued job for a brief. CreateJob(ctx context.Context, briefID string) (*model.CampaignJob, error) + // CreateJobForApprovedBrief inserts a queued job ONLY if the brief is still + // approved at expectedVersion, atomically re-verifying the approval in the same + // statement that creates the job. This closes the approve→dispatch TOCTOU race: + // a concurrent ReplaceBrief (which resets the brief to draft and bumps version) + // or ArchiveBrief committing between the caller's approval read and job creation + // bumps the brief's version, so the guarded insert affects zero rows and returns + // ErrConflict instead of launching paid campaigns from a stale "approved" + // snapshot. It never blocks on a row lock (consistent with the lock-free claim + // mechanism); the version guard alone arbitrates. + CreateJobForApprovedBrief(ctx context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) // GetJob returns a job by id, or ErrNotFound. GetJob(ctx context.Context, projectID, id string) (*model.CampaignJob, error) // UpdateJobStatus sets a job's status (any JobStatus, e.g. running or a diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index 637492b0..6b95ab3a 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -47,6 +47,42 @@ func (r *JobRepo) CreateJob(ctx context.Context, briefID string) (*model.Campaig return j, nil } +// CreateJobForApprovedBrief inserts a queued job only if the brief is still +// approved at expectedVersion, re-verifying the approval atomically in the same +// statement. This closes the approve→dispatch TOCTOU race described on the port: +// a concurrent ReplaceBrief (resets to 'draft', version+1) or ArchiveBrief +// ('archived', version+1) committing in the window bumps the brief's version, so +// the guarded INSERT ... SELECT ... WHERE EXISTS evaluates its EXISTS predicate +// against that committed change and inserts zero rows — surfaced as ErrConflict. +// +// The INSERT-from-SELECT-WHERE-EXISTS is a single statement, so the approval +// re-check and the job insert share one snapshot and cannot be split by a +// concurrent commit (no held lock, matching the lock-free single-flight claim). +// A replace/archive committed BEFORE this statement fails the EXISTS (→ 0 rows → +// conflict); one committed AFTER means the job was created while the brief was +// genuinely still approved at the read version, which is correct. +func (r *JobRepo) CreateJobForApprovedBrief(ctx context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) { + q := `INSERT INTO campaign_jobs (brief_id) + SELECT $1 + WHERE EXISTS ( + SELECT 1 FROM campaign_briefs + WHERE id = $1 AND status = 'approved' AND version = $2 + ) + RETURNING ` + jobCols + j, err := scanJob(r.db.QueryRow(ctx, q, briefID, expectedVersion)) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + // No row inserted: the brief is no longer approved at expectedVersion (a + // concurrent replace/archive committed in the window, or it was never + // approved). Treat as a conflict with the concurrent mutation so the + // request fails rather than dispatching from a stale snapshot. + return nil, domain.ErrConflict + } + return nil, fmt.Errorf("create job for approved brief: %w", err) + } + return j, nil +} + // GetJob returns a job by id. func (r *JobRepo) GetJob(ctx context.Context, projectID, id string) (*model.CampaignJob, error) { // Scope the lookup to the caller's project by joining through the owning diff --git a/internal/service/brief.go b/internal/service/brief.go index fff7fbb6..3e8a6959 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -182,7 +182,12 @@ func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCamp seen[prov] = struct{}{} platforms = append(platforms, prov) } - jobID, err := s.orch.Start(ctx, brief, platforms, marshalAny(p.Input.Config)) + // Pass the version we just observed as 'approved'. Start gates job creation on + // the brief still being approved at this exact version, so a concurrent replace + // (which resets it to draft, bumping version) or archive committing between this + // read and job creation makes Start fail (ErrConflict → 409) rather than + // launching paid campaigns from a stale "approved" snapshot. + jobID, err := s.orch.Start(ctx, brief, brief.Version, platforms, marshalAny(p.Input.Config)) if err != nil { return nil, mapBriefErr(err) } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 8a318190..f5eabbf4 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -15,6 +15,9 @@ import ( // fakeBriefRepo is a minimal in-memory BriefRepository for handler tests. type fakeBriefRepo struct { briefs map[string]*model.CampaignBrief // key: projectID|id + // onGet, when set, fires once after the next GetBrief read, modelling a + // concurrent brief mutation that commits in the approve→dispatch window. + onGet func() } func newFakeBriefRepo() *fakeBriefRepo { @@ -28,7 +31,18 @@ func (r *fakeBriefRepo) GetBrief(_ context.Context, projectID, id string) (*mode if !ok { return nil, domain.ErrNotFound } - return b, nil + // Return a snapshot copy so a caller holding the result observes the state as + // of the read, even if the stored brief is subsequently mutated (used to model + // a concurrent replace committing in the approve→dispatch window). + cp := *b + // onGet, if set, fires after the read to simulate a concurrent mutation + // committing between this read and a later guarded write. + if r.onGet != nil { + hook := r.onGet + r.onGet = nil // one-shot + hook() + } + return &cp, nil } func (r *fakeBriefRepo) CreateBrief(_ context.Context, b *model.CampaignBrief) (*model.CampaignBrief, error) { @@ -275,6 +289,103 @@ func TestParseBriefIfMatch_AcceptsQuotedETag(t *testing.T) { } } +// versionGuardedJobRepo models the atomic approve-re-check that +// CreateJobForApprovedBrief performs in SQL: it creates a job only if the brief +// in the shared store is still 'approved' at the expected version. It lets a test +// exercise the approve→dispatch TOCTOU guard without a real database. +type versionGuardedJobRepo struct { + fakeJobRepo + store *fakeBriefRepo +} + +func (r *versionGuardedJobRepo) CreateJobForApprovedBrief(_ context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) { + // Re-verify approval atomically with the create, mirroring the guarded + // INSERT ... WHERE EXISTS: any concurrent replace/archive that bumped the + // version or changed the status fails the guard. + var stillApproved bool + for _, b := range r.store.briefs { + if b.ID == briefID && b.Status == model.BriefApproved && b.Version == expectedVersion { + stillApproved = true + break + } + } + if !stillApproved { + return nil, domain.ErrConflict + } + r.mu.Lock() + defer r.mu.Unlock() + return r.createLocked(briefID) +} + +// TestBriefService_CreateCampaigns_TOCTOURaceFailsClosed verifies the +// approve→dispatch race is closed: if a concurrent replace resets the brief to +// draft (and bumps its version) AFTER CreateCampaigns reads it as approved but +// BEFORE the job is created, the request FAILS (409 conflict) rather than +// launching paid campaigns from the stale "approved" snapshot. +func TestBriefService_CreateCampaigns_TOCTOURaceFailsClosed(t *testing.T) { + repo := newFakeBriefRepo() + // The brief is approved at version 5 when CreateCampaigns reads it. + repo.briefs[briefKey("cncf", "b1")] = &model.CampaignBrief{ + ID: "b1", ProjectID: "cncf", Status: model.BriefApproved, Version: 5, + } + camps := &fakeCampaignRepo{} + jobs := &versionGuardedJobRepo{ + fakeJobRepo: fakeJobRepo{jobs: map[string]*model.CampaignJob{}}, + store: repo, + } + orch := NewOrchestrator(camps, jobs, nil) + s := NewBriefService(repo, camps, jobs, orch) + + // Model the concurrent replace committing in the window: it fires AFTER + // CreateCampaigns reads the brief as approved@v5 (GetBrief returns a snapshot) + // but BEFORE the guarded job create re-checks the store. It resets the brief to + // draft and bumps the version, exactly as ReplaceBrief does, so the guarded + // create must now fail (409) rather than dispatch from the stale snapshot. + repo.onGet = func() { + repo.briefs[briefKey("cncf", "b1")].Status = model.BriefDraft + repo.briefs[briefKey("cncf", "b1")].Version = 6 + } + + _, err := s.CreateCampaigns(context.Background(), &briefs.CreateCampaignsPayload{ + ProjectID: "cncf", BriefID: "b1", + Input: &briefs.CampaignCreateInput{Platforms: []string{"google-ads"}}, + }) + if _, ok := err.(*briefs.ConflictError); !ok { + t.Fatalf("expected *briefs.ConflictError (concurrent replace closed the TOCTOU race), got %T (%v)", err, err) + } + if len(jobs.jobs) != 0 { + t.Errorf("a job was created despite the brief no longer being approved: %d jobs", len(jobs.jobs)) + } +} + +// TestBriefService_CreateCampaigns_ApprovedAtVersionSucceeds verifies the guard +// does not over-reject: when the brief is still approved at the read version, the +// job is created normally. +func TestBriefService_CreateCampaigns_ApprovedAtVersionSucceeds(t *testing.T) { + repo := newFakeBriefRepo() + repo.briefs[briefKey("cncf", "b1")] = &model.CampaignBrief{ + ID: "b1", ProjectID: "cncf", Status: model.BriefApproved, Version: 5, + } + camps := &fakeCampaignRepo{} + jobs := &versionGuardedJobRepo{ + fakeJobRepo: fakeJobRepo{jobs: map[string]*model.CampaignJob{}}, + store: repo, + } + orch := NewOrchestrator(camps, jobs, nil) + s := NewBriefService(repo, camps, jobs, orch) + + resp, err := s.CreateCampaigns(context.Background(), &briefs.CreateCampaignsPayload{ + ProjectID: "cncf", BriefID: "b1", + Input: &briefs.CampaignCreateInput{Platforms: []string{"google-ads"}}, + }) + if err != nil { + t.Fatalf("CreateCampaigns: %v", err) + } + if resp.JobID == "" { + t.Error("expected a job id for a brief still approved at the read version") + } +} + // campaignEditRepo is a minimal CampaignRepository for UpdateCampaign tests. type campaignEditRepo struct { got *model.Campaign // the campaign passed to ReplaceCampaign diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index a420e1f8..268d18e4 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -21,12 +21,17 @@ import ( // maxParallelDispatch bounds concurrent per-platform campaign creation. const maxParallelDispatch = 5 -// cancelGracePeriod is how long Shutdown waits, after cancelling in-flight runs +// CancelGracePeriod is how long Shutdown waits, after cancelling in-flight runs // on a drain timeout, for them to unwind before it returns (and the pool closes). -// It must be >= jobFinalizeTimeout so a run cancelled at the drain deadline still -// has time to write its terminal status (on the detached finalize context) before -// the pool is closed. -const CancelGracePeriod = jobFinalizeTimeout + time.Second +// A run cancelled at the drain deadline may, in its worst case, still owe TWO +// detached writes that must complete before the pool closes: persisting a +// just-created upstream campaign (persistResultTimeout) and then writing the +// terminal job status (jobFinalizeTimeout). Sizing the grace to cover both (plus a +// second of slack) keeps the documented invariant honest — both detached writes +// fit inside the grace window rather than racing the pool close. (In practice both +// are single-row statements that finish in milliseconds; the ceilings only bound a +// pathological hang.) +const CancelGracePeriod = jobFinalizeTimeout + persistResultTimeout + time.Second // claimReleaseTimeout bounds the best-effort pending-claim cleanup, which runs on // a context detached from the (possibly-cancelled) dispatch context. @@ -54,6 +59,19 @@ const providerCallTimeout = 2 * time.Minute // terminal state instead of being stuck queued/running. const jobFinalizeTimeout = 10 * time.Second +// persistResultTimeout bounds the post-provider persistence upsert that records a +// successfully-created upstream campaign. Like the finalize write it runs on a +// context DETACHED from the dispatch context: once the provider has created the +// paid resource upstream, persisting its id must not be abandoned merely because +// Shutdown cancelled the dispatch context — that would lose the record of a +// campaign that WAS created (an unreconcilable orphan). It is kept well below +// CancelGracePeriod so it completes within the shutdown grace window and can never +// itself hang shutdown. Kept modest (and below jobFinalizeTimeout) so the sum of +// both detached writes fits within CancelGracePeriod without pushing +// ContainerCloseTimeout past the overall shutdown budget (asserted in container +// init()). +const persistResultTimeout = 5 * time.Second + // PlatformDispatcher creates a campaign on one ad platform. Implementations are // the per-provider adapters (added as those integrations land); the // orchestrator is agnostic to them. @@ -278,10 +296,18 @@ type platformResult struct { // Start creates a queued job for the brief and launches dispatch asynchronously, // returning the job id immediately. The caller polls GetJob for progress. // +// approvedVersion is the brief version the caller observed as 'approved'. Job +// creation is gated on the brief still being approved at that exact version +// (CreateJobForApprovedBrief), closing the approve→dispatch TOCTOU race: a +// concurrent ReplaceBrief (resets to draft) or ArchiveBrief committing between the +// caller's approval read and this insert bumps the brief's version, so the +// guarded insert affects zero rows and Start returns ErrConflict (409) rather +// than launching paid campaigns from a stale "approved" snapshot. +// // The dispatch goroutine runs under the orchestrator's root context (not the // request context), so it survives the request ending but can still be cancelled // by Shutdown when the drain deadline expires. -func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, platforms []model.Provider, config json.RawMessage) (string, error) { +func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, approvedVersion int64, platforms []model.Provider, config json.RawMessage) (string, error) { // Register the run with the drain WaitGroup under the lock so a concurrent // Shutdown can't start waiting between the draining check and wg.Add (which // would let an untracked goroutine outlive Shutdown). @@ -293,7 +319,11 @@ func (o *Orchestrator) Start(ctx context.Context, brief *model.CampaignBrief, pl o.wg.Add(1) o.mu.Unlock() - job, err := o.jobs.CreateJob(ctx, brief.ID) + // Create the job ONLY if the brief is still approved at the version the caller + // read. This re-verifies approval atomically with job creation, so a concurrent + // replace/archive that commits in the approve→dispatch window causes this + // request to FAIL (ErrConflict → 409) instead of dispatching from stale state. + job, err := o.jobs.CreateJobForApprovedBrief(ctx, brief.ID, approvedVersion) if err != nil { o.wg.Done() return "", err @@ -524,7 +554,17 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief campaign.BriefID = brief.ID campaign.ProjectID = brief.ProjectID campaign.Platform = p - if _, err := o.campaigns.UpsertCampaign(ctx, campaign); err != nil { + // Persist the successful result on a context DETACHED from the dispatch ctx. + // The upstream (paid) campaign now EXISTS; on the phase-two shutdown path + // rootCancel has already cancelled the dispatch ctx, and reusing it here would + // make pgx reject the upsert immediately — losing the record of a campaign that + // was actually created (an unreconcilable orphan) even though Shutdown is still + // inside its grace window. A bounded detached context (persistResultTimeout, + // sized to fit within CancelGracePeriod) lets the persist complete during grace + // while still bounding it so it can never hang shutdown. + persistCtx, cancelPersist := context.WithTimeout(context.WithoutCancel(ctx), persistResultTimeout) + defer cancelPersist() + if _, err := o.campaigns.UpsertCampaign(persistCtx, campaign); err != nil { // The upstream (paid) campaign was created but recording it failed. The // 'pending' claim row remains, so this is recoverable/reconcilable out of // band and a duplicate can't be created behind the claim. Log the raw error diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index efd9d4b5..bf1d4a5c 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -29,6 +29,11 @@ func newFakeJobRepo() *fakeJobRepo { return &fakeJobRepo{jobs: map[string]*model func (r *fakeJobRepo) CreateJob(_ context.Context, briefID string) (*model.CampaignJob, error) { r.mu.Lock() defer r.mu.Unlock() + return r.createLocked(briefID) +} + +// createLocked inserts a queued job. Caller must hold r.mu. +func (r *fakeJobRepo) createLocked(briefID string) (*model.CampaignJob, error) { r.counter++ id := "job-" + string(rune('a'+r.counter)) j := &model.CampaignJob{ID: id, BriefID: briefID, Status: model.JobQueued} @@ -36,6 +41,15 @@ func (r *fakeJobRepo) CreateJob(_ context.Context, briefID string) (*model.Campa return j, nil } +// CreateJobForApprovedBrief mirrors the unconditional create for the orchestrator +// tests (which don't wire a brief store, so the approval guard is exercised +// separately by the brief-service TOCTOU test with its own version-aware fake). +func (r *fakeJobRepo) CreateJobForApprovedBrief(_ context.Context, briefID string, _ int64) (*model.CampaignJob, error) { + r.mu.Lock() + defer r.mu.Unlock() + return r.createLocked(briefID) +} + func (r *fakeJobRepo) GetJob(_ context.Context, _, id string) (*model.CampaignJob, error) { r.mu.Lock() defer r.mu.Unlock() @@ -194,7 +208,7 @@ func TestOrchestrator_AllSucceed(t *testing.T) { model.ProviderLinkedInAds: okDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, err := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + id, err := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) if err != nil { t.Fatalf("Start: %v", err) } @@ -215,7 +229,7 @@ func TestOrchestrator_PartialFailure(t *testing.T) { model.ProviderLinkedInAds: failDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobPartial { t.Errorf("status = %s, want partial", j.Status) @@ -227,7 +241,7 @@ func TestOrchestrator_NoDispatcherFails(t *testing.T) { camps := &fakeCampaignRepo{} orch := NewOrchestrator(camps, jobs, nil) // no dispatchers brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobFailed { t.Errorf("status = %s, want failed", j.Status) @@ -241,7 +255,7 @@ func TestOrchestrator_NilCampaignFailsWithoutPanic(t *testing.T) { model.ProviderGoogleAds: nilDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobFailed { t.Errorf("status = %s, want failed", j.Status) @@ -278,7 +292,7 @@ func TestOrchestrator_SkipsAlreadyDispatchedPlatform(t *testing.T) { model.ProviderGoogleAds: disp, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, err := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, err := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) if err != nil { t.Fatalf("Start: %v", err) } @@ -316,7 +330,7 @@ func TestOrchestrator_ClaimErrorIsFailure(t *testing.T) { model.ProviderGoogleAds: disp, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobFailed { t.Errorf("status = %s, want failed", j.Status) @@ -343,7 +357,7 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { model.ProviderGoogleAds: disp, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) // A single in-progress platform aggregates to failed (not ok), and the // dispatcher must not have been called. @@ -394,7 +408,7 @@ func TestOrchestrator_EmptyUpstreamIDIsFailure(t *testing.T) { model.ProviderGoogleAds: emptyIDDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobFailed { t.Errorf("status = %s, want failed", j.Status) @@ -415,7 +429,7 @@ func TestOrchestrator_ReusesExistingWhenDispatcherGone(t *testing.T) { // No dispatchers registered at all. orch := NewOrchestrator(camps, jobs, nil) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobSucceeded { t.Errorf("status = %s, want succeeded (existing campaign reused despite no dispatcher)", j.Status) @@ -442,7 +456,7 @@ func TestOrchestrator_RecoversFromDispatcherPanic(t *testing.T) { model.ProviderGoogleAds: panicDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobFailed { t.Errorf("status = %s, want failed", j.Status) @@ -469,7 +483,7 @@ func TestOrchestrator_PersistErrorIsSanitized(t *testing.T) { model.ProviderGoogleAds: okDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) j := waitForTerminal(t, jobs, id) if j.Status != model.JobFailed { t.Errorf("status = %s, want failed", j.Status) @@ -511,7 +525,7 @@ func TestOrchestrator_DispatchGoesThroughClaim(t *testing.T) { model.ProviderLinkedInAds: okDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) waitForTerminal(t, jobs, id) camps.cmu.Lock() defer camps.cmu.Unlock() @@ -542,7 +556,7 @@ func TestOrchestrator_ShutdownDrainsInFlight(t *testing.T) { model.ProviderGoogleAds: disp, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + _, _ = orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) <-disp.started // dispatch is now in-flight shutdownReturned := make(chan error, 1) @@ -578,7 +592,7 @@ func TestOrchestrator_ShutdownGraceHonorsContextCancel(t *testing.T) { disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + _, _ = orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) <-disp.started <-ctxSeen @@ -644,7 +658,7 @@ func TestOrchestrator_StartRejectedAfterShutdown(t *testing.T) { t.Fatalf("Shutdown: %v", err) } brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - if _, err := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil); err == nil { + if _, err := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil); err == nil { t.Fatal("expected Start to be rejected after Shutdown") } } @@ -681,7 +695,7 @@ func TestOrchestrator_ShutdownCancelsOnTimeout(t *testing.T) { disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + _, _ = orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) <-disp.started dctx := <-ctxSeen @@ -711,7 +725,7 @@ func TestOrchestrator_ShutdownGraceBoundedByContext(t *testing.T) { disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + _, _ = orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) <-disp.started <-ctxSeen // drain the captured ctx so Dispatch can proceed to <-release @@ -747,7 +761,7 @@ func TestOrchestrator_ShutdownGivesGraceWhenBudgetRemains(t *testing.T) { disp := &ctxCapturingDispatcher{started: make(chan struct{}), release: make(chan struct{}), ctxSeen: ctxSeen} orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - _, _ = orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + _, _ = orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) <-disp.started dctx := <-ctxSeen // the dispatch's own context, cancelled by rootCancel @@ -805,7 +819,7 @@ func TestOrchestrator_NoDispatcherDoesNotLeavePendingClaim(t *testing.T) { camps := &fakeCampaignRepo{} orch := NewOrchestrator(camps, jobs, nil) // no dispatchers brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) waitForTerminal(t, jobs, id) camps.mu.Lock() defer camps.mu.Unlock() @@ -838,7 +852,7 @@ func TestOrchestrator_PreCreateErrorReleasesClaim(t *testing.T) { model.ProviderGoogleAds: preCreateErrDispatcher{}, }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} - id, _ := orch.Start(context.Background(), brief, []model.Provider{model.ProviderGoogleAds}, nil) + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) waitForTerminal(t, jobs, id) camps.mu.Lock() defer camps.mu.Unlock() @@ -925,6 +939,82 @@ func TestOrchestrator_SweeperInterruptedOnShutdown(t *testing.T) { } } +// ctxAssertingCampaignRepo asserts UpsertCampaign is invoked with a live (not +// cancelled) context — proving the post-provider persist runs on a context +// detached from the cancelled dispatch context. +type ctxAssertingCampaignRepo struct { + fakeCampaignRepo + upsertCtxErr error // context error observed inside UpsertCampaign + upsertCalled chan struct{} +} + +func (r *ctxAssertingCampaignRepo) UpsertCampaign(ctx context.Context, c *model.Campaign) (*model.Campaign, error) { + r.mu.Lock() + r.upsertCtxErr = ctx.Err() + r.mu.Unlock() + close(r.upsertCalled) + return r.fakeCampaignRepo.UpsertCampaign(ctx, c) +} + +// TestOrchestrator_PersistSurvivesDispatchCancel verifies that a provider result +// completing AFTER the dispatch context is cancelled (the phase-two shutdown +// grace) is still persisted: the upsert must run on a detached context, not the +// cancelled dispatch context, so the record of the created upstream campaign is +// not lost. +func TestOrchestrator_PersistSurvivesDispatchCancel(t *testing.T) { + jobs := newFakeJobRepo() + camps := &ctxAssertingCampaignRepo{upsertCalled: make(chan struct{})} + ctxSeen := make(chan context.Context, 1) + // The dispatcher returns its campaign only after observing cancellation, so the + // persist step necessarily runs while the dispatch ctx is already cancelled. + disp := &cancelThenReturnDispatcher{ctxSeen: ctxSeen} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{model.ProviderGoogleAds: disp}) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) + <-ctxSeen // dispatch is in-flight + + // Drain with an already-past deadline so Shutdown immediately cancels the run's + // context, but give a real outer budget so the grace phase lets it finish. + outerCtx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + go func() { _ = orch.Shutdown(outerCtx, time.Millisecond) }() + + // The upsert must be reached and must see a LIVE context (detached), then the + // job reaches a terminal state with the campaign persisted. + select { + case <-camps.upsertCalled: + case <-time.After(2 * time.Second): + t.Fatal("UpsertCampaign was never called; persist did not survive dispatch cancel") + } + camps.mu.Lock() + upsertErr := camps.upsertCtxErr + upsertCount := len(camps.upserted) + camps.mu.Unlock() + if upsertErr != nil { + t.Errorf("UpsertCampaign ran on a cancelled context (%v); persist must use a detached context", upsertErr) + } + if upsertCount != 1 { + t.Errorf("persisted %d campaigns, want 1 (created upstream campaign must be recorded)", upsertCount) + } + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobSucceeded { + t.Errorf("status = %s, want succeeded", j.Status) + } +} + +// cancelThenReturnDispatcher waits until its context is cancelled, then returns a +// successful campaign — forcing the orchestrator's persist step to run while the +// dispatch context is already cancelled. +type cancelThenReturnDispatcher struct { + ctxSeen chan context.Context +} + +func (d *cancelThenReturnDispatcher) Dispatch(ctx context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + d.ctxSeen <- ctx + <-ctx.Done() // return only after Shutdown cancels the dispatch context + return &model.Campaign{PlatformCampaignID: "pc-" + string(p), Status: "active", CampaignName: "n"}, nil +} + // TestBriefETagIsQuoted verifies the emitted ETag is a quoted entity-tag. func TestBriefETagIsQuoted(t *testing.T) { if got := briefETag(3); got != `"3"` { From f1c9ed230de00bdde3fee9519b94b3e1ff094ba4 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 13 Jul 2026 22:33:33 -0700 Subject: [PATCH 35/46] fix(review): job-result corruption, conflict msg, close error (PR #11) Address 4 Copilot review threads on PR #11: - GetJob: a persisted per-platform result that won't decode (JSON error, or a terminal succeeded/partial job with no results) is now surfaced as a 500 InternalServerError instead of a 200 poll response with empty results, so corruption is never masked as success (copilot). - CreateJobForApprovedBrief: the approve->dispatch guard now returns a distinct ErrStaleApproval sentinel, mapped to a 409 whose message tells the client to refresh and re-approve, rather than the misleading uniqueness "already exists" (copilot). Uniqueness ErrConflict keeps its own message. - Container.Close: capture the orchestrator Shutdown error and RETURN it (still always closing the pool) so a drain timeout with dispatches still running is observable to the caller's "container close error" branch, instead of always returning nil (copilot). - Shutdown path: add a lightweight in-flight-handler tracking middleware (WaitGroup per request) and wait on it, bounded by the remaining HTTP budget, between the forced srv.Close and cont.Close, so a straggler handler is actually awaited before the pool closes (copilot, re-flag). Residual window past the bounded wait tracked under LFXV2-2665. - Tests: malformed/empty-terminal/valid-result GetJob cases; stale-approval conflict-message assertion; Close error propagation; inflight tracker Wait. Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 53 ++++++++-- internal/container/container.go | 9 +- internal/container/container_test.go | 101 +++++++++++++++++++ internal/domain/brief_port.go | 2 +- internal/domain/errors.go | 8 ++ internal/infrastructure/postgres/job_repo.go | 7 +- internal/middleware/inflight.go | 71 +++++++++++++ internal/middleware/inflight_test.go | 81 +++++++++++++++ internal/service/brief.go | 48 ++++++--- internal/service/brief_test.go | 88 +++++++++++++++- 10 files changed, 442 insertions(+), 26 deletions(-) create mode 100644 internal/middleware/inflight.go create mode 100644 internal/middleware/inflight_test.go diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 00d51e01..7bb48cf1 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -13,6 +13,7 @@ import ( "log/slog" "net/http" "os" + "time" briefsvcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_briefs/server" connsvcsvr "github.com/linuxfoundation/lfx-v2-campaign-service/gen/http/lfx_v2_campaign_service_connections/server" @@ -125,7 +126,14 @@ func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.En return err } + // Track in-flight handlers so shutdown can wait (bounded) for stragglers to + // return before the DB pool closes. http.Server.Close does not wait for + // handler goroutines, so without this a straggler could touch the pool as it + // closes; the tracker is waited on between the forced Close and cont.Close. + inflight := middleware.NewInflightTracker() + var handler http.Handler = mux + handler = inflight.Middleware()(handler) handler = middleware.RequestIDMiddleware()(handler) if cfg.Debug { handler = debug.HTTP()(handler) @@ -147,7 +155,24 @@ func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.En IdleTimeout: constants.DefaultIdleTimeout, } - return runServerWithContext(ctx, srv, cont) + return runServerWithContext(ctx, srv, cont, inflight) +} + +// inflightWaiter is the subset of middleware.InflightTracker the shutdown path +// needs: wait (bounded) for in-flight handlers to return. +type inflightWaiter interface { + Wait(timeout time.Duration) bool +} + +// httpDeadline returns the HTTP-shutdown context's deadline, or now if it has +// none — so the caller's remaining-budget computation yields a non-positive +// duration (an immediate, non-blocking inflight check) rather than an +// unbounded wait when no deadline is set. +func httpDeadline(httpCtx context.Context) time.Time { + if d, ok := httpCtx.Deadline(); ok { + return d + } + return time.Now() } func errorHandler(logCtx context.Context) func(context.Context, http.ResponseWriter, error) { @@ -156,7 +181,7 @@ func errorHandler(logCtx context.Context) func(context.Context, http.ResponseWri } } -func runServerWithContext(ctx context.Context, srv *http.Server, cont *container.Container) error { +func runServerWithContext(ctx context.Context, srv *http.Server, cont *container.Container, inflight inflightWaiter) error { serverErr := make(chan error, 1) go func() { @@ -197,10 +222,16 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container // terminates all connections so no handler is still using the pool when it // closes. Force-close only after a timeout — on a clean Shutdown there are // no lingering connections and Close() is a harmless no-op. - // 3. THEN cont.Close(closeCtx) — drain in-flight dispatch, then close the pool. - // Fully coordinating handler completion (waiting out each straggler) needs - // cross-request tracking beyond this PR — tracked in LFXV2-2665; the srv.Close() - // hardening here removes the pool-use-after-close hazard in-scope. + // 3. wait (bounded) for any in-flight handler goroutine to actually RETURN. + // srv.Close() terminates connections but does NOT wait for the handler + // goroutines themselves, so a straggler could still be executing (and + // touching the pool) after Close returns. The inflight tracker lets us + // wait for those goroutines to finish before closing the pool; the wait + // is bounded by whatever remains of the HTTP-shutdown budget so a hung + // handler can never wedge shutdown past its window. + // 4. THEN cont.Close(closeCtx) — drain in-flight dispatch, then close the pool. + // A residual remains only if a handler outlasts the bounded wait; that window + // is tracked under LFXV2-2665. httpCtx, cancelHTTP := context.WithTimeout(context.Background(), container.HTTPShutdownTimeout) defer cancelHTTP() if err := srv.Shutdown(httpCtx); err != nil { @@ -211,6 +242,16 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container slog.ErrorContext(ctx, "HTTP server force-close error", log.ErrKey, cerr) } } + // Wait for in-flight handler goroutines to return before closing the pool. On a + // clean Shutdown they are already drained and this returns immediately; on the + // force-close path it bounds the wait by the HTTP budget still remaining so a + // straggler is awaited but can never push total shutdown past its window. + if inflight != nil { + remaining := time.Until(httpDeadline(httpCtx)) + if !inflight.Wait(remaining) { + slog.ErrorContext(ctx, "in-flight HTTP handlers did not return before pool close; a straggler may touch the pool (LFXV2-2665)") + } + } closeCtx, cancelClose := context.WithTimeout(context.Background(), container.ContainerCloseTimeout) defer cancelClose() if err := cont.Close(closeCtx); err != nil { diff --git a/internal/container/container.go b/internal/container/container.go index 1cd7fb76..df42e8a2 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -189,13 +189,20 @@ func NewContainer(cfg *config.Config) (*Container, error) { // would have zero budget and the pool could close while a just-cancelled // dispatch is still finalizing job/campaign state. func (c *Container) Close(ctx context.Context) error { + // Capture the orchestrator shutdown error but do NOT early-return on it: the + // pool must still be closed even if the drain timed out with dispatches still + // running. Returning the error (rather than swallowing it) makes a shutdown + // failure — dispatches still running when the pool was closed — observable to + // the caller's "container close error" branch and its logs. + var shutdownErr error if c.orch != nil { if err := c.orch.Shutdown(ctx, dispatchDrainTimeout); err != nil { slog.Warn("timed out draining in-flight dispatch on shutdown", "error", err) + shutdownErr = fmt.Errorf("drain in-flight dispatch: %w", err) } } if c.pool != nil { c.pool.Close() } - return nil + return shutdownErr } diff --git a/internal/container/container_test.go b/internal/container/container_test.go index 180b27c7..17179db2 100644 --- a/internal/container/container_test.go +++ b/internal/container/container_test.go @@ -5,8 +5,13 @@ package container import ( "context" + "encoding/json" + "sync" "testing" + "time" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain" + "github.com/linuxfoundation/lfx-v2-campaign-service/internal/domain/model" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/infrastructure/config" "github.com/linuxfoundation/lfx-v2-campaign-service/internal/service" "github.com/linuxfoundation/lfx-v2-campaign-service/pkg/constants" @@ -27,6 +32,102 @@ func TestShutdownBudgetComposes(t *testing.T) { assert.LessOrEqual(t, HTTPShutdownTimeout+ContainerCloseTimeout, constants.DefaultShutdownTimeout) } +// blockingDispatcher blocks until its context is cancelled, so Orchestrator.Shutdown +// hits the drain deadline and returns an error — letting the test prove Close +// propagates (rather than swallows) that error. +type blockingDispatcher struct{ started chan struct{} } + +func (d *blockingDispatcher) Dispatch(ctx context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + select { + case d.started <- struct{}{}: + default: + } + <-ctx.Done() + return &model.Campaign{PlatformCampaignID: "pc-" + string(p)}, nil +} + +// stubJobRepo is a minimal in-memory JobRepository for the Close test. +type stubJobRepo struct { + mu sync.Mutex + seq int + jobs map[string]*model.CampaignJob +} + +func newStubJobRepo() *stubJobRepo { return &stubJobRepo{jobs: map[string]*model.CampaignJob{}} } + +func (r *stubJobRepo) create() (*model.CampaignJob, error) { + r.mu.Lock() + defer r.mu.Unlock() + r.seq++ + j := &model.CampaignJob{ID: "job-" + string(rune('a'+r.seq)), Status: model.JobQueued} + r.jobs[j.ID] = j + return j, nil +} +func (r *stubJobRepo) CreateJob(context.Context, string) (*model.CampaignJob, error) { + return r.create() +} +func (r *stubJobRepo) CreateJobForApprovedBrief(context.Context, string, int64) (*model.CampaignJob, error) { + return r.create() +} +func (r *stubJobRepo) GetJob(context.Context, string, string) (*model.CampaignJob, error) { + return nil, domain.ErrNotFound +} +func (r *stubJobRepo) UpdateJobStatus(context.Context, string, model.JobStatus, []byte, string) error { + return nil +} +func (r *stubJobRepo) FailStuckJobs(context.Context, string) (int64, error) { return 0, nil } + +// stubCampaignRepo is a minimal in-memory CampaignRepository for the Close test. +type stubCampaignRepo struct{} + +func (stubCampaignRepo) GetCampaign(context.Context, string, string, string) (*model.Campaign, error) { + return nil, domain.ErrNotFound +} +func (stubCampaignRepo) GetCampaignByPlatform(context.Context, string, model.Provider) (*model.Campaign, error) { + return nil, domain.ErrNotFound +} +func (stubCampaignRepo) ClaimCampaignDispatch(context.Context, string, string, model.Provider, string) (bool, *model.Campaign, error) { + return true, &model.Campaign{Status: "pending"}, nil +} +func (stubCampaignRepo) DeleteDispatchClaim(context.Context, string, model.Provider) error { + return nil +} +func (stubCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) (*model.Campaign, error) { + return c, nil +} +func (stubCampaignRepo) ReplaceCampaign(context.Context, *model.Campaign, int64) (*model.Campaign, error) { + return nil, domain.ErrNotFound +} + +// TestClose_PropagatesShutdownError verifies Container.Close returns (does not +// swallow) the orchestrator shutdown error when a dispatch is still running at +// drain time, so the caller's "container close error" branch can observe that +// dispatches were still running when the pool was closed. The pool must still be +// closed regardless (here the pool is nil, exercising the error-propagation path +// without a real database). +func TestClose_PropagatesShutdownError(t *testing.T) { + disp := &blockingDispatcher{started: make(chan struct{}, 1)} + orch := service.NewOrchestrator(stubCampaignRepo{}, newStubJobRepo(), map[model.Provider]service.PlatformDispatcher{ + model.ProviderGoogleAds: disp, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + if _, err := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil); err != nil { + t.Fatalf("Start: %v", err) + } + <-disp.started // dispatch is in-flight and will block until its ctx is cancelled + + c := &Container{orch: orch} // nil pool: exercise the error path without a DB + + // A short outer budget forces the drain to time out and the grace to expire + // with the dispatch still blocked, so Shutdown returns a non-nil error. + ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + defer cancel() + err := c.Close(ctx) + if err == nil { + t.Fatal("Close returned nil; a shutdown timeout (dispatches still running) must be observable to the caller") + } +} + func TestNewContainer_NoDatabase(t *testing.T) { cfg := &config.Config{ Host: "*", diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index be125646..bb648722 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -87,7 +87,7 @@ type JobRepository interface { // a concurrent ReplaceBrief (which resets the brief to draft and bumps version) // or ArchiveBrief committing between the caller's approval read and job creation // bumps the brief's version, so the guarded insert affects zero rows and returns - // ErrConflict instead of launching paid campaigns from a stale "approved" + // ErrStaleApproval instead of launching paid campaigns from a stale "approved" // snapshot. It never blocks on a row lock (consistent with the lock-free claim // mechanism); the version guard alone arbitrates. CreateJobForApprovedBrief(ctx context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) diff --git a/internal/domain/errors.go b/internal/domain/errors.go index 4abab339..39f97e63 100644 --- a/internal/domain/errors.go +++ b/internal/domain/errors.go @@ -19,6 +19,14 @@ var ( // 409. ErrConflict = errors.New("resource already exists") + // ErrStaleApproval indicates the approve→dispatch guard fired: the brief was + // no longer approved at the expected version when the job was created (a + // concurrent replace/archive committed in the window, or it lost approval). + // It is distinct from ErrConflict (a uniqueness violation) because the client + // remedy differs — refresh and re-approve, then retry — even though both map + // to 409. Maps to 409. + ErrStaleApproval = errors.New("brief is no longer approved at the expected version") + // ErrPreconditionFailed indicates an optimistic-concurrency version // mismatch on a conditional update (stale If-Match). Maps to 412. ErrPreconditionFailed = errors.New("version precondition failed") diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index 6b95ab3a..f515f72f 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -74,9 +74,10 @@ func (r *JobRepo) CreateJobForApprovedBrief(ctx context.Context, briefID string, if errors.Is(err, pgx.ErrNoRows) { // No row inserted: the brief is no longer approved at expectedVersion (a // concurrent replace/archive committed in the window, or it was never - // approved). Treat as a conflict with the concurrent mutation so the - // request fails rather than dispatching from a stale snapshot. - return nil, domain.ErrConflict + // approved). Surface the state-conflict sentinel (not the generic + // uniqueness ErrConflict) so the service can tell the client to refresh + // and re-approve rather than reporting "already exists". + return nil, domain.ErrStaleApproval } return nil, fmt.Errorf("create job for approved brief: %w", err) } diff --git a/internal/middleware/inflight.go b/internal/middleware/inflight.go new file mode 100644 index 00000000..091f85b0 --- /dev/null +++ b/internal/middleware/inflight.go @@ -0,0 +1,71 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +package middleware + +import ( + "net/http" + "sync" + "sync/atomic" + "time" +) + +// InflightTracker counts in-flight HTTP handler goroutines so a graceful +// shutdown can WAIT for stragglers before the database pool is closed. +// +// http.Server.Shutdown drains most handlers, but http.Server.Close (the forced +// fallback after the drain deadline) returns WITHOUT waiting for handler +// goroutines to finish — a straggler can still be executing (and touching the +// pool) after Close returns. Wrapping each request so it increments a counter +// on entry and decrements on exit lets the shutdown path wait (bounded) for +// those goroutines to actually return before the pool closes, closing the +// pool-use-after-close window that Shutdown/Close alone leave open. +type InflightTracker struct { + wg sync.WaitGroup + cnt atomic.Int64 // current in-flight count, so an unbounded-free Wait can read it directly +} + +// NewInflightTracker returns a ready-to-use tracker. +func NewInflightTracker() *InflightTracker { return &InflightTracker{} } + +// Middleware wraps next so each in-flight request is tracked. +func (t *InflightTracker) Middleware() func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.wg.Add(1) + t.cnt.Add(1) + defer func() { + t.cnt.Add(-1) + t.wg.Done() + }() + next.ServeHTTP(w, r) + }) + } +} + +// Wait blocks until all in-flight handlers have returned or the timeout elapses, +// reporting whether every handler drained (true) or the wait timed out with +// stragglers still running (false). The bounded wait guarantees a hung handler +// can never wedge shutdown past its budget; on a clean shutdown (Shutdown already +// drained the handlers) it returns immediately. A non-positive timeout never +// blocks: it reports drained iff nothing is in flight at the moment of the call. +func (t *InflightTracker) Wait(timeout time.Duration) bool { + if timeout <= 0 { + // No budget to wait: report drained only if nothing is in flight right now. + // Read the atomic counter directly rather than racing a wg.Wait goroutine. + return t.cnt.Load() == 0 + } + done := make(chan struct{}) + go func() { + t.wg.Wait() + close(done) + }() + timer := time.NewTimer(timeout) + defer timer.Stop() + select { + case <-done: + return true + case <-timer.C: + return false + } +} diff --git a/internal/middleware/inflight_test.go b/internal/middleware/inflight_test.go new file mode 100644 index 00000000..b73f4ebd --- /dev/null +++ b/internal/middleware/inflight_test.go @@ -0,0 +1,81 @@ +// Copyright The Linux Foundation and each contributor to LFX. +// SPDX-License-Identifier: MIT + +package middleware + +import ( + "net/http" + "net/http/httptest" + "testing" + "time" +) + +// Wait must block until an in-flight handler returns (so shutdown awaits a +// straggler before the pool closes), and must return true once it does. +func TestInflightTracker_WaitsForInflightHandler(t *testing.T) { + tr := NewInflightTracker() + release := make(chan struct{}) + entered := make(chan struct{}) + h := tr.Middleware()(http.HandlerFunc(func(http.ResponseWriter, *http.Request) { + close(entered) + <-release // hold the handler in-flight + })) + + go func() { + rec := httptest.NewRecorder() + h.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/", nil)) + }() + <-entered // the handler is now in-flight + + // With the handler still running, a bounded Wait must time out (report false). + if tr.Wait(30 * time.Millisecond) { + t.Fatal("Wait returned true while a handler was still in-flight") + } + + close(release) // let the handler finish + if !tr.Wait(time.Second) { + t.Fatal("Wait did not observe the handler returning within the budget") + } +} + +// Wait returns immediately (true) when nothing is in flight — the clean-shutdown +// case where Shutdown already drained the handlers. +func TestInflightTracker_WaitImmediateWhenIdle(t *testing.T) { + tr := NewInflightTracker() + start := time.Now() + if !tr.Wait(time.Second) { + t.Fatal("Wait reported stragglers when idle") + } + if elapsed := time.Since(start); elapsed > 100*time.Millisecond { + t.Errorf("idle Wait took %v; should return immediately", elapsed) + } +} + +// A non-positive timeout must never block: it reports drained if idle, else +// false at once. +func TestInflightTracker_NonPositiveTimeoutDoesNotBlock(t *testing.T) { + tr := NewInflightTracker() + if !tr.Wait(0) { + t.Error("Wait(0) when idle should report drained") + } + + release := make(chan struct{}) + entered := make(chan struct{}) + h := tr.Middleware()(http.HandlerFunc(func(http.ResponseWriter, *http.Request) { + close(entered) + <-release + })) + go func() { + rec := httptest.NewRecorder() + h.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/", nil)) + }() + <-entered + start := time.Now() + if tr.Wait(0) { + t.Error("Wait(0) with a handler in-flight should report not-drained") + } + if elapsed := time.Since(start); elapsed > 100*time.Millisecond { + t.Errorf("Wait(0) blocked for %v; must return at once", elapsed) + } + close(release) +} diff --git a/internal/service/brief.go b/internal/service/brief.go index 3e8a6959..f01ba5e8 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -7,6 +7,7 @@ import ( "context" "encoding/json" "errors" + "log/slog" "strconv" "strings" @@ -257,21 +258,36 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br CampaignID string `json:"campaign_id"` Error string `json:"error"` } - if json.Unmarshal(j.Result, &stored) == nil { - resp.Result = make([]*briefs.PlatformResult, 0, len(stored)) - for _, r := range stored { - pr := &briefs.PlatformResult{Platform: r.Platform, OK: r.OK} - if r.CampaignID != "" { - id := r.CampaignID - pr.CampaignID = &id - } - if r.Error != "" { - e := r.Error - pr.Error = &e - } - resp.Result = append(resp.Result, pr) + if err := json.Unmarshal(j.Result, &stored); err != nil { + // A persisted result that won't decode is corruption, not a valid empty + // poll response. Silently dropping it would hand back a terminal + // succeeded/partial job with NO per-platform results — an inaccurate + // response that masks the corruption as success. Surface it as a 500. + slog.ErrorContext(ctx, "failed to decode persisted job result", "job_id", j.ID, "error", err) + return nil, &briefs.InternalServerError{Code: "500", Message: "an internal server error occurred"} + } + resp.Result = make([]*briefs.PlatformResult, 0, len(stored)) + for _, r := range stored { + pr := &briefs.PlatformResult{Platform: r.Platform, OK: r.OK} + if r.CampaignID != "" { + id := r.CampaignID + pr.CampaignID = &id + } + if r.Error != "" { + e := r.Error + pr.Error = &e } + resp.Result = append(resp.Result, pr) } + } else if j.Status == model.JobSucceeded || j.Status == model.JobPartial { + // A succeeded/partial job is an AGGREGATE over per-platform outcomes, so it + // must carry those results. An empty/absent result on such a terminal status + // means the stored row is corrupt (results lost); returning a 200 with no + // results would misrepresent corruption as a successful dispatch. A 'failed' + // job legitimately can carry only an error (e.g. a result-marshal failure), + // so it is not held to this invariant. + slog.ErrorContext(ctx, "terminal job has no per-platform results", "job_id", j.ID, "status", j.Status) + return nil, &briefs.InternalServerError{Code: "500", Message: "an internal server error occurred"} } if j.Error != "" { errMsg := j.Error // copy: don't hand out a pointer aliasing the source struct field @@ -356,6 +372,12 @@ func mapBriefErr(err error) error { return nil case errors.Is(err, domain.ErrNotFound): return &briefs.NotFoundError{Code: "404", Message: "the resource was not found"} + case errors.Is(err, domain.ErrStaleApproval): + // The approve→dispatch guard fired: the brief lost approval (or its version + // changed) between the approval read and the guarded job insert. This is a + // state conflict, not a uniqueness one — tell the client to refresh and + // re-approve, which "already exists" would misdescribe. + return &briefs.ConflictError{Code: "409", Message: "brief is no longer approved at the expected version; refresh and re-approve, then retry"} case errors.Is(err, domain.ErrConflict): return &briefs.ConflictError{Code: "409", Message: "the resource already exists"} case errors.Is(err, domain.ErrPreconditionFailed): diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index f5eabbf4..77710857 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -5,6 +5,7 @@ package service import ( "context" + "strings" "testing" briefs "github.com/linuxfoundation/lfx-v2-campaign-service/gen/lfx_v2_campaign_service_briefs" @@ -310,7 +311,9 @@ func (r *versionGuardedJobRepo) CreateJobForApprovedBrief(_ context.Context, bri } } if !stillApproved { - return nil, domain.ErrConflict + // Mirror the real repo: the approve→dispatch guard fires with the + // state-conflict sentinel (not the generic uniqueness ErrConflict). + return nil, domain.ErrStaleApproval } r.mu.Lock() defer r.mu.Unlock() @@ -350,9 +353,19 @@ func TestBriefService_CreateCampaigns_TOCTOURaceFailsClosed(t *testing.T) { ProjectID: "cncf", BriefID: "b1", Input: &briefs.CampaignCreateInput{Platforms: []string{"google-ads"}}, }) - if _, ok := err.(*briefs.ConflictError); !ok { + ce, ok := err.(*briefs.ConflictError) + if !ok { t.Fatalf("expected *briefs.ConflictError (concurrent replace closed the TOCTOU race), got %T (%v)", err, err) } + // The message must describe the version/approval conflict accurately (refresh + // and re-approve), NOT the misleading uniqueness "already exists" — a client + // needs to know to re-approve and retry. + if !strings.Contains(ce.Message, "no longer approved") || !strings.Contains(ce.Message, "re-approve") { + t.Errorf("conflict message = %q, want it to describe the stale-approval remedy (re-approve and retry)", ce.Message) + } + if strings.Contains(ce.Message, "already exists") { + t.Errorf("conflict message = %q, must not misdescribe a version conflict as a uniqueness one", ce.Message) + } if len(jobs.jobs) != 0 { t.Errorf("a job was created despite the brief no longer being approved: %d jobs", len(jobs.jobs)) } @@ -436,3 +449,74 @@ func TestBriefService_UpdateCampaign_PreservesConfigWhenOmitted(t *testing.T) { t.Errorf("name/status not applied: %q/%q", camps.got.CampaignName, camps.got.Status) } } + +// getJobTestService builds a BriefService whose job repo returns the given job +// verbatim from GetJob, for exercising the poll-response decoding path. +func getJobTestService(job *model.CampaignJob) *BriefService { + repo := newFakeBriefRepo() + camps := &fakeCampaignRepo{} + jobs := newFakeJobRepo() + jobs.jobs[job.ID] = job + orch := NewOrchestrator(camps, jobs, nil) + return NewBriefService(repo, camps, jobs, orch) +} + +// GetJob must NOT silently discard a persisted result that won't decode: a +// malformed result on a terminal succeeded/partial job would otherwise return a +// 200 poll response with NO per-platform results, masking corruption as success. +// It must surface a 500 InternalServerError instead. +func TestBriefService_GetJob_MalformedResultIsInternalError(t *testing.T) { + s := getJobTestService(&model.CampaignJob{ + ID: "j1", BriefID: "b1", Status: model.JobSucceeded, + Result: []byte(`{"not":"an array"}`), // valid JSON, wrong shape → unmarshal error + }) + _, err := s.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}) + if _, ok := err.(*briefs.InternalServerError); !ok { + t.Fatalf("expected *briefs.InternalServerError for a malformed job result, got %T (%v)", err, err) + } +} + +// A terminal succeeded/partial job is an aggregate over per-platform outcomes, so +// an empty/absent result on that status means the row is corrupt. GetJob must +// surface a 500 rather than a 200 with no results (which would misrepresent +// corruption as a successful dispatch). +func TestBriefService_GetJob_TerminalWithoutResultsIsInternalError(t *testing.T) { + for _, st := range []model.JobStatus{model.JobSucceeded, model.JobPartial} { + s := getJobTestService(&model.CampaignJob{ID: "j1", BriefID: "b1", Status: st, Result: nil}) + _, err := s.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}) + if _, ok := err.(*briefs.InternalServerError); !ok { + t.Fatalf("status %s: expected *briefs.InternalServerError for a terminal job with no results, got %T (%v)", st, err, err) + } + } +} + +// A valid persisted result decodes into typed per-platform results, and a failed +// job carrying only an error (no results — a legitimate finalize-marshal-failure +// outcome) is NOT treated as corruption: it returns 200 with the error surfaced. +func TestBriefService_GetJob_ValidResultsAndFailedErrorOnly(t *testing.T) { + // Valid result on a succeeded job round-trips into typed results. + s := getJobTestService(&model.CampaignJob{ + ID: "j1", BriefID: "b1", Status: model.JobSucceeded, + Result: []byte(`[{"platform":"google-ads","ok":true,"campaign_id":"pc-1"}]`), + }) + resp, err := s.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}) + if err != nil { + t.Fatalf("GetJob (valid result): %v", err) + } + if len(resp.Result) != 1 || resp.Result[0].Platform != "google-ads" || !resp.Result[0].OK { + t.Errorf("decoded result = %+v, want one ok google-ads result", resp.Result) + } + + // A failed job with only an error message (no results) is a legitimate outcome + // (e.g. the finalize marshal failed), not corruption → 200 with the error. + s2 := getJobTestService(&model.CampaignJob{ + ID: "j2", BriefID: "b1", Status: model.JobFailed, Result: nil, Error: "failed to serialize job result", + }) + resp2, err := s2.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j2"}) + if err != nil { + t.Fatalf("GetJob (failed, error-only): %v", err) + } + if resp2.Error == nil || *resp2.Error != "failed to serialize job result" { + t.Errorf("failed job error = %v, want the surfaced error message", resp2.Error) + } +} From 9b6653a252464ff1669f64726768cb352c5acb37 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 13 Jul 2026 22:49:22 -0700 Subject: [PATCH 36/46] fix(review): poll inflight counter in Wait to avoid goroutine leak (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot: InflightTracker.Wait spawned a goroutine blocked on wg.Wait(); if the timeout elapsed, Wait returned but that goroutine stayed parked until every handler finished — a leak across repeated calls / shutdown retries, and wg.Add racing wg.Wait is unsafe. - inflight.go: dropped the WaitGroup entirely and implemented Wait as a bounded POLL of the existing atomic in-flight counter (5ms ticker up to the timeout). No spawned goroutine, safe to call multiple times, same bounded-wait semantics (returns immediately when already drained, never blocks past the budget). Verified: gofmt, go build, go vet, golangci-lint (0 issues), go test -race ./... (all pass). Signed-off-by: Misha Rautela --- internal/middleware/inflight.go | 50 ++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/internal/middleware/inflight.go b/internal/middleware/inflight.go index 091f85b0..82cb0fbb 100644 --- a/internal/middleware/inflight.go +++ b/internal/middleware/inflight.go @@ -5,7 +5,6 @@ package middleware import ( "net/http" - "sync" "sync/atomic" "time" ) @@ -21,8 +20,7 @@ import ( // those goroutines to actually return before the pool closes, closing the // pool-use-after-close window that Shutdown/Close alone leave open. type InflightTracker struct { - wg sync.WaitGroup - cnt atomic.Int64 // current in-flight count, so an unbounded-free Wait can read it directly + cnt atomic.Int64 // current in-flight handler count } // NewInflightTracker returns a ready-to-use tracker. @@ -32,40 +30,46 @@ func NewInflightTracker() *InflightTracker { return &InflightTracker{} } func (t *InflightTracker) Middleware() func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - t.wg.Add(1) t.cnt.Add(1) - defer func() { - t.cnt.Add(-1) - t.wg.Done() - }() + defer t.cnt.Add(-1) next.ServeHTTP(w, r) }) } } +// inflightPollInterval is how often Wait re-checks the in-flight counter while +// bounded-waiting for stragglers to drain. +const inflightPollInterval = 5 * time.Millisecond + // Wait blocks until all in-flight handlers have returned or the timeout elapses, // reporting whether every handler drained (true) or the wait timed out with // stragglers still running (false). The bounded wait guarantees a hung handler // can never wedge shutdown past its budget; on a clean shutdown (Shutdown already // drained the handlers) it returns immediately. A non-positive timeout never // blocks: it reports drained iff nothing is in flight at the moment of the call. +// +// Implemented by POLLING the atomic counter rather than a WaitGroup + goroutine: +// a done-channel goroutine blocked on wg.Wait() would LEAK past a timeout (it +// stays parked until every handler finishes), and wg.Add racing wg.Wait across +// repeated calls is unsafe. Polling has no such goroutine and is safe to call +// multiple times. func (t *InflightTracker) Wait(timeout time.Duration) bool { - if timeout <= 0 { - // No budget to wait: report drained only if nothing is in flight right now. - // Read the atomic counter directly rather than racing a wg.Wait goroutine. - return t.cnt.Load() == 0 - } - done := make(chan struct{}) - go func() { - t.wg.Wait() - close(done) - }() - timer := time.NewTimer(timeout) - defer timer.Stop() - select { - case <-done: + if t.cnt.Load() == 0 { return true - case <-timer.C: + } + if timeout <= 0 { return false } + deadline := time.Now().Add(timeout) + ticker := time.NewTicker(inflightPollInterval) + defer ticker.Stop() + for { + <-ticker.C + if t.cnt.Load() == 0 { + return true + } + if !time.Now().Before(deadline) { + return t.cnt.Load() == 0 + } + } } From df237f36235fb29d17edbee6644165d2b8f6dafe Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 13 Jul 2026 22:56:31 -0700 Subject: [PATCH 37/46] fix(review): honor sub-tick timeouts in inflight Wait (PR #11) Address Copilot: Wait always blocked for the next 5ms ticker tick before checking the deadline, so a timeout shorter than inflightPollInterval could overshoot the shutdown budget. - inflight.go: Wait now selects on BOTH a deadline timer and the poll ticker, so the deadline fires precisely even for sub-tick timeouts. Verified: gofmt, go build, go vet, golangci-lint (0 issues), go test -race ./internal/middleware. Signed-off-by: Misha Rautela --- internal/middleware/inflight.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/internal/middleware/inflight.go b/internal/middleware/inflight.go index 82cb0fbb..56bd5d59 100644 --- a/internal/middleware/inflight.go +++ b/internal/middleware/inflight.go @@ -60,15 +60,20 @@ func (t *InflightTracker) Wait(timeout time.Duration) bool { if timeout <= 0 { return false } - deadline := time.Now().Add(timeout) + // Bound the total wait with a deadline timer and poll on a separate ticker, + // selecting on both — so a timeout SHORTER than inflightPollInterval fires on + // the deadline rather than overshooting by up to a full tick. + deadline := time.NewTimer(timeout) + defer deadline.Stop() ticker := time.NewTicker(inflightPollInterval) defer ticker.Stop() for { - <-ticker.C - if t.cnt.Load() == 0 { - return true - } - if !time.Now().Before(deadline) { + select { + case <-ticker.C: + if t.cnt.Load() == 0 { + return true + } + case <-deadline.C: return t.cnt.Load() == 0 } } From 961fca9470ef057eb6717f748bb721590197c686 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 13 Jul 2026 23:15:29 -0700 Subject: [PATCH 38/46] docs(review): correct comments to ErrStaleApproval, not ErrConflict (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot: three comments (orchestrator.Start, job_repo guarded INSERT, brief.go CreateCampaigns) said the approve→dispatch TOCTOU guard surfaces as ErrConflict, but the implementation returns domain.ErrStaleApproval (still mapped to 409). Updated the comments to name the sentinel actually returned so the observable error semantics match the docs. Verified: gofmt, go build, go vet, golangci-lint (0 issues). Signed-off-by: Misha Rautela --- internal/infrastructure/postgres/job_repo.go | 3 ++- internal/service/brief.go | 4 ++-- internal/service/orchestrator.go | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index f515f72f..e2f052ce 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -53,7 +53,8 @@ func (r *JobRepo) CreateJob(ctx context.Context, briefID string) (*model.Campaig // a concurrent ReplaceBrief (resets to 'draft', version+1) or ArchiveBrief // ('archived', version+1) committing in the window bumps the brief's version, so // the guarded INSERT ... SELECT ... WHERE EXISTS evaluates its EXISTS predicate -// against that committed change and inserts zero rows — surfaced as ErrConflict. +// against that committed change and inserts zero rows (pgx.ErrNoRows) — surfaced +// as domain.ErrStaleApproval (mapped to 409). // // The INSERT-from-SELECT-WHERE-EXISTS is a single statement, so the approval // re-check and the job insert share one snapshot and cannot be split by a diff --git a/internal/service/brief.go b/internal/service/brief.go index f01ba5e8..55858e4d 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -186,8 +186,8 @@ func (s *BriefService) CreateCampaigns(ctx context.Context, p *briefs.CreateCamp // Pass the version we just observed as 'approved'. Start gates job creation on // the brief still being approved at this exact version, so a concurrent replace // (which resets it to draft, bumping version) or archive committing between this - // read and job creation makes Start fail (ErrConflict → 409) rather than - // launching paid campaigns from a stale "approved" snapshot. + // read and job creation makes Start fail (domain.ErrStaleApproval → 409) rather + // than launching paid campaigns from a stale "approved" snapshot. jobID, err := s.orch.Start(ctx, brief, brief.Version, platforms, marshalAny(p.Input.Config)) if err != nil { return nil, mapBriefErr(err) diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 268d18e4..6c05641a 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -301,8 +301,9 @@ type platformResult struct { // (CreateJobForApprovedBrief), closing the approve→dispatch TOCTOU race: a // concurrent ReplaceBrief (resets to draft) or ArchiveBrief committing between the // caller's approval read and this insert bumps the brief's version, so the -// guarded insert affects zero rows and Start returns ErrConflict (409) rather -// than launching paid campaigns from a stale "approved" snapshot. +// guarded insert affects zero rows and Start returns domain.ErrStaleApproval +// (mapped to 409) rather than launching paid campaigns from a stale "approved" +// snapshot. // // The dispatch goroutine runs under the orchestrator's root context (not the // request context), so it survives the request ending but can still be cancelled From 8fc66518d48ee45803ef8878976a47cba6e9b07b Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Tue, 14 Jul 2026 07:16:18 -0700 Subject: [PATCH 39/46] fix(review): dedicated inflight-drain budget; correct dispatch fast-path doc (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot: - server.go + container.go: the post-force-close inflight-handler wait derived its budget from the HTTP-shutdown context's remaining time — but when srv.Shutdown TIMES OUT that context is already exhausted, so the wait returned immediately and the container/pool closed while stragglers ran (the exact race the tracker exists to prevent). Added a dedicated container.HandlerDrainTimeout (2s, carved from HTTPShutdownTimeout) used for the wait, and reserved it out of the graceful-Shutdown budget so the drain always has real time even on timeout. Removed the now-unused httpDeadline helper. - internal-service.md: corrected the stale claim that a transient existing- campaign fast-path lookup error is recorded as a failure — it now falls through to ClaimCampaignDispatch's atomic claim (claims/reuses safely, no duplicate), matching the implementation. Verified: gofmt, go build, go vet, golangci-lint (0 issues), go test -race ./cmd/... ./internal/container/..., okfvalidate (conformant). Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 25 +++++++++---------------- docs/knowledge/code/internal-service.md | 8 +++++--- internal/container/container.go | 9 +++++++++ 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 7bb48cf1..3574872a 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -164,17 +164,6 @@ type inflightWaiter interface { Wait(timeout time.Duration) bool } -// httpDeadline returns the HTTP-shutdown context's deadline, or now if it has -// none — so the caller's remaining-budget computation yields a non-positive -// duration (an immediate, non-blocking inflight check) rather than an -// unbounded wait when no deadline is set. -func httpDeadline(httpCtx context.Context) time.Time { - if d, ok := httpCtx.Deadline(); ok { - return d - } - return time.Now() -} - func errorHandler(logCtx context.Context) func(context.Context, http.ResponseWriter, error) { return func(ctx context.Context, _ http.ResponseWriter, err error) { slog.ErrorContext(ctx, "HTTP error occurred", log.ErrKey, err, "outer_context", logCtx) @@ -232,7 +221,11 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container // 4. THEN cont.Close(closeCtx) — drain in-flight dispatch, then close the pool. // A residual remains only if a handler outlasts the bounded wait; that window // is tracked under LFXV2-2665. - httpCtx, cancelHTTP := context.WithTimeout(context.Background(), container.HTTPShutdownTimeout) + // Reserve HandlerDrainTimeout for the post-force-close inflight wait (step 3), + // so the graceful Shutdown gets the rest of the HTTP budget. This guarantees + // the inflight wait has a real budget even when Shutdown times out (which would + // otherwise exhaust the whole HTTP context). + httpCtx, cancelHTTP := context.WithTimeout(context.Background(), container.HTTPShutdownTimeout-container.HandlerDrainTimeout) defer cancelHTTP() if err := srv.Shutdown(httpCtx); err != nil { slog.ErrorContext(ctx, "HTTP server shutdown error; force-closing lingering connections", log.ErrKey, err) @@ -244,11 +237,11 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container } // Wait for in-flight handler goroutines to return before closing the pool. On a // clean Shutdown they are already drained and this returns immediately; on the - // force-close path it bounds the wait by the HTTP budget still remaining so a - // straggler is awaited but can never push total shutdown past its window. + // force-close path it waits up to the DEDICATED HandlerDrainTimeout (NOT the + // HTTP context's remaining time — that is exhausted precisely when Shutdown + // timed out and a straggler is running, which would make the wait a no-op). if inflight != nil { - remaining := time.Until(httpDeadline(httpCtx)) - if !inflight.Wait(remaining) { + if !inflight.Wait(container.HandlerDrainTimeout) { slog.ErrorContext(ctx, "in-flight HTTP handlers did not return before pool close; a straggler may touch the pool (LFXV2-2665)") } } diff --git a/docs/knowledge/code/internal-service.md b/docs/knowledge/code/internal-service.md index 63e5af21..6556fbe9 100644 --- a/docs/knowledge/code/internal-service.md +++ b/docs/knowledge/code/internal-service.md @@ -21,9 +21,11 @@ platform sets (a duplicate would create two paid upstream campaigns), then hands off to the `Orchestrator`, which persists a job and dispatches per platform asynchronously (bounded concurrency). Dispatch is idempotent: a brief already carrying a campaign with an upstream id for a platform is reused rather than -re-created, and a transient existing-campaign lookup error is recorded as a -failure rather than risking a duplicate. Replacing a brief's content resets it to -`draft` (re-approval required). Optimistic concurrency is enforced via +re-created, and a transient existing-campaign fast-path lookup error does NOT +fail the dispatch — it falls through to `ClaimCampaignDispatch`, whose atomic +claim safely either claims-and-dispatches or reuses the conflicting row, so a +duplicate is avoided without failing on the transient error. Replacing a brief's +content resets it to `draft` (re-approval required). Optimistic concurrency is enforced via version/If-Match (`428` when missing, `412` on mismatch). Dispatch is durable (LFXV2-2665): single-flight per (brief, platform) is diff --git a/internal/container/container.go b/internal/container/container.go index df42e8a2..59320df0 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -54,6 +54,15 @@ const ContainerCloseTimeout = dispatchDrainTimeout + service.CancelGracePeriod // wall-clock, not bound by a shared context). const HTTPShutdownTimeout = constants.DefaultShutdownTimeout - ContainerCloseTimeout +// HandlerDrainTimeout is a SEPARATE, dedicated budget for waiting on in-flight +// handler goroutines to return AFTER a forced srv.Close(). It must not be derived +// from the HTTP-shutdown context's remaining time: when srv.Shutdown times out, +// that context is already exhausted, so a "remaining budget" would be zero and +// the wait would return immediately — defeating the tracker exactly when a +// straggler is running. Reserving a small fixed slice guarantees a bounded wait +// in that case. It is carved from HTTPShutdownTimeout so the total still fits. +const HandlerDrainTimeout = 2 * time.Second + func init() { if dispatchDrainTimeout+service.CancelGracePeriod > constants.DefaultShutdownTimeout { panic("dispatchDrainTimeout + service.CancelGracePeriod exceeds DefaultShutdownTimeout") From 6ea394be1324f4c6abf95fa6e9b9bdaa85fa3ea7 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Tue, 14 Jul 2026 07:39:46 -0700 Subject: [PATCH 40/46] fix(review): serialize approve-dispatch; skip not fail; project_id TEXT - job_repo: replace the lone guarded INSERT ... WHERE EXISTS with a SELECT ... FOR UPDATE row lock + status/version re-check inside one transaction before the job insert. The single-statement guard did not hold under READ COMMITTED (its snapshot could miss a replace/archive that committed just before the statement); the row lock serializes the check-then-insert against any concurrent brief mutation. Returns ErrStaleApproval on the locked-row check failure. (copilot[bot] thread 1) - orchestrator: a single-flight SKIP (another dispatch owns the pair) is no longer recorded as a terminal failure. platformResult gains a Skipped flag; aggregateStatus excludes skips from the failure tally and keeps a job with outstanding skips and no real failure non-terminal (running) so a re-poll after the owner finishes reflects the true outcome. Full cross-request adoption of the owner's result: LFXV2-2665. (copilot[bot] thread 3) - brief: note near CreateBrief that Query Service indexing (lists + revision history) is a deliberate follow-up (LFXV2-2665); this PR is the persistence source of truth. (copilot[bot] thread 2) - docs/architecture.md: campaign_briefs/campaigns project_id is TEXT (project UUID or slug), matching migration 000003 and the API contract; the ER diagram and prose said UUID. (copilot[bot] thread 4) - tests: cover skip-not-fail in aggregateStatus and the orchestrator; add waitForFinalized for jobs that finalize non-terminal. - PR #11. Signed-off-by: Misha Rautela Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/architecture.md | 6 +- internal/domain/brief_port.go | 16 ++-- internal/infrastructure/postgres/job_repo.go | 93 ++++++++++++++------ internal/service/brief.go | 6 ++ internal/service/brief_test.go | 7 +- internal/service/orchestrator.go | 73 +++++++++++---- internal/service/orchestrator_test.go | 64 +++++++++++++- 7 files changed, 204 insertions(+), 61 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index fd8bc7bf..a41bf113 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -356,7 +356,7 @@ erDiagram campaign_briefs { UUID id PK - UUID project_id + TEXT project_id "project UUID or slug (e.g. cncf)" VARCHAR program_type "events/education/membership" VARCHAR event_slug "UNIQUE with project_id" TEXT url @@ -375,7 +375,7 @@ erDiagram campaigns { UUID id PK - UUID project_id + TEXT project_id "project UUID or slug (e.g. cncf)" UUID brief_id FK "many campaigns share one brief" UUID job_id "soft ref to campaign_jobs; no FK (jobs are ephemeral, expire/purge)" VARCHAR platform "channel: google-ads/linkedin-ads/..." @@ -470,7 +470,7 @@ Beyond paid ad platforms, the campaign service will manage connections to organi Persistence uses **strongly-typed, one-table-per-provider** schemas rather than a single generic `channel_connections` table with an untyped `metadata` blob. Credentials and configuration differ materially between providers, so folding them into untyped JSON would weaken the contract and make the API harder to develop and validate against (especially for agents). Each supported provider gets its own table with provider-specific columns. -Every table that maps to an LFX platform resource type carries a `version BIGINT` iterator that powers the platform-idiomatic **ETag / `If-Match`** optimistic-concurrency controls on `PUT`s (pattern per [2026-05-CloudNativePG](https://github.com/linuxfoundation/lfx-architecture-scratch/tree/main/2026-05-CloudNativePG)). `project_id` is a plain indexed `UUID` (owned by the project-service; no cross-service FK). Credentials are encrypted at the application layer (AES-256-GCM) using a key from a Kubernetes secret — not pgcrypto. +Every table that maps to an LFX platform resource type carries a `version BIGINT` iterator that powers the platform-idiomatic **ETag / `If-Match`** optimistic-concurrency controls on `PUT`s (pattern per [2026-05-CloudNativePG](https://github.com/linuxfoundation/lfx-architecture-scratch/tree/main/2026-05-CloudNativePG)). `project_id` is a plain indexed column (owned by the project-service; no cross-service FK) typed `TEXT`, because a project is addressed by its UUID **or** its slug (e.g. `cncf`) and the API contract advertises the same — the `campaign_briefs`/`campaigns` tables use `TEXT project_id` accordingly (migration `000003`). Credentials are encrypted at the application layer (AES-256-GCM) using a key from a Kubernetes secret — not pgcrypto. The full table definitions — per-provider connection tables **plus** `campaign_briefs` and `campaigns` — live in [channel-connections-schema.md](channel-connections-schema.md) and are not duplicated here. For briefs and campaigns, attribution and revision history are served by the Query Service on each (re)index, so this service keeps no separate audit tables. Connection tables are not indexed (singleton per project; no listing consumer). diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index bb648722..8d0132f3 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -82,14 +82,18 @@ type JobRepository interface { // CreateJob inserts a queued job for a brief. CreateJob(ctx context.Context, briefID string) (*model.CampaignJob, error) // CreateJobForApprovedBrief inserts a queued job ONLY if the brief is still - // approved at expectedVersion, atomically re-verifying the approval in the same - // statement that creates the job. This closes the approve→dispatch TOCTOU race: + // approved at expectedVersion, re-verifying the approval atomically with the job + // insert inside one transaction. This closes the approve→dispatch TOCTOU race: // a concurrent ReplaceBrief (which resets the brief to draft and bumps version) // or ArchiveBrief committing between the caller's approval read and job creation - // bumps the brief's version, so the guarded insert affects zero rows and returns - // ErrStaleApproval instead of launching paid campaigns from a stale "approved" - // snapshot. It never blocks on a row lock (consistent with the lock-free claim - // mechanism); the version guard alone arbitrates. + // bumps the brief's version and must prevent the job from being created against + // that stale approval, returning ErrStaleApproval instead of launching paid + // campaigns from a stale "approved" snapshot. The guard takes a SELECT ... FOR + // UPDATE row lock on the brief before the insert so it serializes against any + // concurrent replace/archive of that row — a lone guarded INSERT ... WHERE + // EXISTS would NOT, because under READ COMMITTED its snapshot can miss a mutation + // that commits just before the statement runs (see the implementation for the + // full isolation reasoning). CreateJobForApprovedBrief(ctx context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) // GetJob returns a job by id, or ErrNotFound. GetJob(ctx context.Context, projectID, id string) (*model.CampaignJob, error) diff --git a/internal/infrastructure/postgres/job_repo.go b/internal/infrastructure/postgres/job_repo.go index e2f052ce..c3f4c221 100644 --- a/internal/infrastructure/postgres/job_repo.go +++ b/internal/infrastructure/postgres/job_repo.go @@ -48,39 +48,76 @@ func (r *JobRepo) CreateJob(ctx context.Context, briefID string) (*model.Campaig } // CreateJobForApprovedBrief inserts a queued job only if the brief is still -// approved at expectedVersion, re-verifying the approval atomically in the same -// statement. This closes the approve→dispatch TOCTOU race described on the port: -// a concurrent ReplaceBrief (resets to 'draft', version+1) or ArchiveBrief -// ('archived', version+1) committing in the window bumps the brief's version, so -// the guarded INSERT ... SELECT ... WHERE EXISTS evaluates its EXISTS predicate -// against that committed change and inserts zero rows (pgx.ErrNoRows) — surfaced -// as domain.ErrStaleApproval (mapped to 409). +// approved at expectedVersion, closing the approve→dispatch TOCTOU race described +// on the port: a concurrent ReplaceBrief (resets to 'draft', version+1) or +// ArchiveBrief ('archived', version+1) committing in the window must prevent the +// job from being created against the now-stale approval. // -// The INSERT-from-SELECT-WHERE-EXISTS is a single statement, so the approval -// re-check and the job insert share one snapshot and cannot be split by a -// concurrent commit (no held lock, matching the lock-free single-flight claim). -// A replace/archive committed BEFORE this statement fails the EXISTS (→ 0 rows → -// conflict); one committed AFTER means the job was created while the brief was -// genuinely still approved at the read version, which is correct. +// Isolation reasoning — why a single guarded INSERT ... WHERE EXISTS is NOT +// enough. Under PostgreSQL's default READ COMMITTED, each statement takes a fresh +// snapshot at command start. The EXISTS subquery of a lone INSERT reads that +// snapshot; a concurrent ReplaceBrief/ArchiveBrief that COMMITS between the +// snapshot and the insert's row-visibility check is not seen by the EXISTS (it +// still sees the old approved version), so the job would be created from a +// stale-approved brief. The single-statement atomicity only rules out a commit +// interleaving WITHIN the statement's snapshot — it does not serialize against a +// mutation that commits just before the statement runs but after the caller's +// approval read. +// +// Fix: take a row lock on the brief inside ONE transaction BEFORE the insert. +// SELECT ... FOR UPDATE acquires a row-level exclusive lock on the brief row and +// re-reads its CURRENT committed state (FOR UPDATE always sees the latest +// committed row version, waiting out any in-flight writer that holds it). Any +// concurrent ReplaceBrief/ArchiveBrief UPDATEs campaign_briefs by id (see +// brief_repo.go — all three bump version on the same row), so it must acquire the +// same row lock: it either committed before our FOR UPDATE (then our re-read sees +// the bumped version and the check fails → ErrStaleApproval) or it blocks on our +// lock until this transaction commits the job (then it proceeds afterward, but +// the job was created while the brief was genuinely still approved at the read +// version, which is correct). The check-then-insert is therefore atomic with +// respect to brief mutations. Returns domain.ErrStaleApproval when the locked row +// fails the status/version check (mapped to 409). func (r *JobRepo) CreateJobForApprovedBrief(ctx context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) { - q := `INSERT INTO campaign_jobs (brief_id) - SELECT $1 - WHERE EXISTS ( - SELECT 1 FROM campaign_briefs - WHERE id = $1 AND status = 'approved' AND version = $2 - ) - RETURNING ` + jobCols - j, err := scanJob(r.db.QueryRow(ctx, q, briefID, expectedVersion)) + tx, err := r.db.Begin(ctx) if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - // No row inserted: the brief is no longer approved at expectedVersion (a - // concurrent replace/archive committed in the window, or it was never - // approved). Surface the state-conflict sentinel (not the generic - // uniqueness ErrConflict) so the service can tell the client to refresh - // and re-approve rather than reporting "already exists". + return nil, fmt.Errorf("create job for approved brief: begin tx: %w", err) + } + // Roll back unless we explicitly commit. A no-op after a successful Commit + // (pgx returns ErrTxClosed, which we ignore) — this guards every error path. + defer func() { _ = tx.Rollback(ctx) }() + + // Lock the brief row and read its current committed status/version. FOR UPDATE + // serializes this against a concurrent replace/archive that touches the same + // row: whichever transaction acquires the lock first runs to completion before + // the other observes the row, so the check below cannot straddle a commit. + var ( + status string + version int64 + ) + lockQ := `SELECT status, version FROM campaign_briefs WHERE id = $1 FOR UPDATE` + if serr := tx.QueryRow(ctx, lockQ, briefID).Scan(&status, &version); serr != nil { + if errors.Is(serr, pgx.ErrNoRows) { + // The brief does not exist at all; treat it as a stale approval (there is + // nothing approved at expectedVersion to dispatch from). return nil, domain.ErrStaleApproval } - return nil, fmt.Errorf("create job for approved brief: %w", err) + return nil, fmt.Errorf("create job for approved brief: lock brief: %w", serr) + } + if status != "approved" || version != expectedVersion { + // A concurrent replace/archive committed before we took the lock (or the + // brief was never approved at this version). Surface the state-conflict + // sentinel (not the generic uniqueness ErrConflict) so the service can tell + // the client to refresh and re-approve rather than reporting "already exists". + return nil, domain.ErrStaleApproval + } + + insertQ := `INSERT INTO campaign_jobs (brief_id) VALUES ($1) RETURNING ` + jobCols + j, err := scanJob(tx.QueryRow(ctx, insertQ, briefID)) + if err != nil { + return nil, fmt.Errorf("create job for approved brief: insert job: %w", err) + } + if err := tx.Commit(ctx); err != nil { + return nil, fmt.Errorf("create job for approved brief: commit: %w", err) } return j, nil } diff --git a/internal/service/brief.go b/internal/service/brief.go index 55858e4d..32061a96 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -85,6 +85,12 @@ func (s *BriefService) CreateBrief(ctx context.Context, p *briefs.CreateBriefPay if err != nil { return nil, mapBriefErr(err) } + // NOTE: brief/campaign lists and revision history are owned by the Query Service + // (per the api-catalog). Wiring the Query Service indexer client — so create / + // replace / approve / archive and the orchestrator's campaign upserts emit index + // events — is a deliberate follow-up (LFXV2-2665), not part of this PR. This + // persistence layer is the source of truth the indexer will later consume; no + // indexing happens here yet. return briefResult(created), nil } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 77710857..f397b814 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -300,9 +300,10 @@ type versionGuardedJobRepo struct { } func (r *versionGuardedJobRepo) CreateJobForApprovedBrief(_ context.Context, briefID string, expectedVersion int64) (*model.CampaignJob, error) { - // Re-verify approval atomically with the create, mirroring the guarded - // INSERT ... WHERE EXISTS: any concurrent replace/archive that bumped the - // version or changed the status fails the guard. + // Re-verify approval atomically with the create, mirroring the real repo's + // SELECT ... FOR UPDATE re-check inside the job-insert transaction: any + // concurrent replace/archive that bumped the version or changed the status + // fails the guard. var stillApproved bool for _, b := range r.store.briefs { if b.ID == briefID && b.Status == model.BriefApproved && b.Version == expectedVersion { diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 6c05641a..7421440c 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -286,9 +286,22 @@ func (o *Orchestrator) Shutdown(ctx context.Context, drainTimeout time.Duration) } // platformResult is the per-platform outcome recorded in the job result. +// +// Skipped marks the single-flight SKIP case: another concurrent dispatch owns +// this (brief, platform) pair, so THIS request did not create the campaign and +// its outcome is owned by that other dispatch. A skip is neither a success nor a +// failure for this job — recording it as a failure would falsely make the +// aggregate job terminal-failed/partial even when the owning dispatch succeeds +// (and GetJob only decodes the stored result; it never re-checks the campaign +// row). aggregateStatus therefore excludes skipped platforms from the failure +// tally, and a job with only skipped platforms stays non-terminal (running) so a +// re-poll after the owner finishes reflects the true outcome. Full cross-request +// reconciliation (this job actively adopting the owner's result) is tracked under +// LFXV2-2665. type platformResult struct { Platform string `json:"platform"` OK bool `json:"ok"` + Skipped bool `json:"skipped,omitempty"` CampaignID string `json:"campaign_id,omitempty"` Error string `json:"error,omitempty"` } @@ -300,10 +313,10 @@ type platformResult struct { // creation is gated on the brief still being approved at that exact version // (CreateJobForApprovedBrief), closing the approve→dispatch TOCTOU race: a // concurrent ReplaceBrief (resets to draft) or ArchiveBrief committing between the -// caller's approval read and this insert bumps the brief's version, so the -// guarded insert affects zero rows and Start returns domain.ErrStaleApproval -// (mapped to 409) rather than launching paid campaigns from a stale "approved" -// snapshot. +// caller's approval read and job creation bumps the brief's version; the guard +// (a SELECT ... FOR UPDATE re-check inside the job-insert transaction) then fails +// and Start returns domain.ErrStaleApproval (mapped to 409) rather than launching +// paid campaigns from a stale "approved" snapshot. // // The dispatch goroutine runs under the orchestrator's root context (not the // request context), so it survives the request ending but can still be cancelled @@ -484,11 +497,16 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief return res } // Another worker holds the pending claim: don't dispatch again (the point of - // the claim). This job did not create the campaign, so it's recorded as not - // ok (OK stays false) — which aggregates to failed/partial for THIS job — - // with a message making clear it's owned by a concurrent run, not a real - // failure. The other run will complete it; a poll of that run (or a re-poll - // after it finishes) reflects the true outcome. + // the claim). This job did not create the campaign — its outcome belongs to + // the owning dispatch — so record it as SKIPPED, not failed. Recording a skip + // as a failure would falsely drive THIS job to terminal failed/partial even + // when the owner succeeds (GetJob only decodes the stored result and never + // re-checks the campaign row, so the false failure would be permanent). + // aggregateStatus excludes skipped platforms from the failure tally and keeps + // a wholly-skipped job non-terminal (running) so a re-poll after the owner + // finishes reflects the true outcome. Fully adopting the owner's async result + // into this job is tracked under LFXV2-2665. + res.Skipped = true res.Error = "skipped: another concurrent dispatch owns this platform" return res } @@ -581,22 +599,43 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief return res } -// aggregateStatus folds per-platform outcomes into the job's terminal status. +// aggregateStatus folds per-platform outcomes into the job's status. +// +// Skipped platforms (single-flight SKIP: another dispatch owns the pair) are NOT +// counted as failures — a skip is not this job's outcome. If any platform was +// skipped and none of THIS job's own dispatches failed, the job is not yet done: +// the owning dispatch is still deciding the skipped pair's fate, so the job stays +// non-terminal (running) and a re-poll after the owner finishes reflects the true +// outcome (rather than the old behavior, which recorded the skip as a terminal +// failure that GetJob could never correct). Full cross-request adoption of the +// owner's result is tracked under LFXV2-2665. func aggregateStatus(results []platformResult) model.JobStatus { - var ok, failed int + var ok, failed, skipped int for _, r := range results { - if r.OK { + switch { + case r.Skipped: + skipped++ + case r.OK: ok++ - } else { + default: failed++ } } switch { - case failed == 0: - return model.JobSucceeded - case ok == 0: + case failed > 0 && ok == 0 && skipped == 0: + // Every platform this job actually dispatched failed. return model.JobFailed - default: + case failed > 0: + // A real mix of success and failure (any skips remain pending but at least + // one platform definitively failed — surface that as partial rather than + // hiding it behind a still-running status). return model.JobPartial + case skipped > 0: + // No failures, but at least one pair is owned by a concurrent dispatch whose + // outcome isn't ours to know yet. Stay non-terminal so a re-poll after the + // owner completes reflects the real result instead of a spurious failure. + return model.JobRunning + default: + return model.JobSucceeded } } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index bf1d4a5c..b8b7039e 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -200,6 +200,24 @@ func waitForTerminal(t *testing.T, jobs *fakeJobRepo, id string) *model.Campaign return nil } +// waitForFinalized waits until the run's finalize write has landed (a non-empty +// result recorded), regardless of whether the resulting status is terminal. A +// job whose only outcomes are single-flight SKIPs finalizes to a non-terminal +// 'running' status (its skipped pairs are owned by another dispatch), so such a +// job never satisfies waitForTerminal — this helper observes its finalize instead. +func waitForFinalized(t *testing.T, jobs *fakeJobRepo, id string) *model.CampaignJob { + t.Helper() + for i := 0; i < 100; i++ { + j, _ := jobs.GetJob(context.Background(), "", id) + if len(j.Result) > 0 { + return j + } + time.Sleep(5 * time.Millisecond) + } + t.Fatal("job result was never finalized") + return nil +} + func TestOrchestrator_AllSucceed(t *testing.T) { jobs := newFakeJobRepo() camps := &fakeCampaignRepo{} @@ -344,7 +362,10 @@ func TestOrchestrator_ClaimErrorIsFailure(t *testing.T) { } // TestOrchestrator_AlreadyClaimedPendingSkips verifies that when another worker -// holds the pending claim (no upstream id yet), this worker does not dispatch. +// holds the pending claim (no upstream id yet), this worker does not dispatch and +// the skip is NOT recorded as a terminal failure: a single skipped platform must +// leave the job non-terminal (running) so a re-poll after the owner completes +// reflects the true outcome, rather than the old behavior of falsely failing it. func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { jobs := newFakeJobRepo() // Seed a pending claim (no upstream id) for the pair, so ClaimCampaignDispatch @@ -358,9 +379,11 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) - j := waitForTerminal(t, jobs, id) - // A single in-progress platform aggregates to failed (not ok), and the - // dispatcher must not have been called. + // The single skipped platform must NOT drive the job to a terminal status. + j := waitForFinalized(t, jobs, id) + if j.Status != model.JobRunning { + t.Errorf("status = %s, want running (a lone skipped platform must not falsely terminate the job)", j.Status) + } disp.mu.Lock() calls := disp.calls disp.mu.Unlock() @@ -370,6 +393,32 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { if !strings.Contains(string(j.Result), "another concurrent dispatch owns") { t.Errorf("result = %s, want a concurrent-owner skip message", j.Result) } + if !strings.Contains(string(j.Result), "\"skipped\":true") { + t.Errorf("result = %s, want the platform marked skipped:true", j.Result) + } +} + +// TestOrchestrator_SkipDoesNotFailAlongsideSuccess verifies that when one +// platform succeeds and another is skipped (owned by a concurrent dispatch), the +// job is not falsely reported failed/partial: with a real success and no real +// failure, an outstanding skip keeps the job non-terminal (running) pending the +// owner's outcome. +func TestOrchestrator_SkipDoesNotFailAlongsideSuccess(t *testing.T) { + jobs := newFakeJobRepo() + // LinkedIn is already held pending by another dispatch; Google Ads is free. + camps := &fakeCampaignRepo{existing: map[string]*model.Campaign{ + "b1|" + string(model.ProviderLinkedInAds): {ID: "c1", Status: "pending", PlatformCampaignID: ""}, + }} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: okDispatcher{}, + model.ProviderLinkedInAds: okDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) + j := waitForFinalized(t, jobs, id) + if j.Status != model.JobRunning { + t.Errorf("status = %s, want running (a skip alongside a success must not fail/partial the job)", j.Status) + } } func TestAggregateStatus(t *testing.T) { @@ -381,6 +430,13 @@ func TestAggregateStatus(t *testing.T) { {"all ok", []platformResult{{OK: true}, {OK: true}}, model.JobSucceeded}, {"all fail", []platformResult{{OK: false}, {OK: false}}, model.JobFailed}, {"mixed", []platformResult{{OK: true}, {OK: false}}, model.JobPartial}, + // A single-flight SKIP is not a failure: a lone skip stays non-terminal + // (running) pending the owning dispatch's outcome. + {"only skipped", []platformResult{{Skipped: true}}, model.JobRunning}, + {"skip + ok", []platformResult{{OK: true}, {Skipped: true}}, model.JobRunning}, + // A real failure still surfaces even when another platform was skipped. + {"skip + fail", []platformResult{{OK: false}, {Skipped: true}}, model.JobPartial}, + {"ok + fail + skip", []platformResult{{OK: true}, {OK: false}, {Skipped: true}}, model.JobPartial}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { From 69f9fa8d31675077ae162a11370ea30f3a8db0f9 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Tue, 14 Jul 2026 09:07:50 -0700 Subject: [PATCH 41/46] fix(review): terminalize skipped-platform jobs; align schema doc to TEXT (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot: - orchestrator.go: a job whose only non-success was a single-flight SKIP (another dispatch owns the (brief,platform) claim) previously stayed `running` forever — nothing revisits a running job (GetJob only reads it) and the recovery sweeper would eventually fail it after staleJobCutoff, turning a correct deferral into a spurious failure. A skip is a deferral to the owner, not this job's work to finish, so aggregateStatus now terminalizes it as SUCCEEDED (the per-platform result still carries Skipped=true). Full cross-request adoption of the owner's outcome stays tracked under LFXV2-2665. Updated the 3 affected tests. - docs/channel-connections-schema.md: campaign_briefs/campaigns project_id is now TEXT (project UUID or slug) matching migration 000003, and the (project_id, event_slug) uniqueness is the archived-aware PARTIAL unique index — the linked canonical schema no longer contradicts architecture.md / the migration. Verified: gofmt, go build, go vet, golangci-lint (0 issues), go test -race ./internal/service, okfvalidate (conformant). Signed-off-by: Misha Rautela --- docs/channel-connections-schema.md | 12 +++++++---- internal/service/orchestrator.go | 31 +++++++++++++++++---------- internal/service/orchestrator_test.go | 25 +++++++++++---------- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/docs/channel-connections-schema.md b/docs/channel-connections-schema.md index f46f74f0..6dcf72ed 100644 --- a/docs/channel-connections-schema.md +++ b/docs/channel-connections-schema.md @@ -163,7 +163,7 @@ Beyond connections, the service persists briefs and campaigns. Both carry the `v ```sql CREATE TABLE campaign_briefs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - project_id UUID NOT NULL, + project_id TEXT NOT NULL, -- project UUID or slug (migration 000003) program_type TEXT NOT NULL -- funnel context CHECK (program_type IN ('events','education','membership')), event_slug TEXT NOT NULL, -- UNIQUE with project_id @@ -179,9 +179,13 @@ CREATE TABLE campaign_briefs ( approved_by JSONB, -- {name,email,username} or null approved_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), - UNIQUE (project_id, event_slug) + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); +-- (project_id, event_slug) uniqueness is a PARTIAL unique index excluding +-- archived briefs (migration 000003), so archiving a brief frees the slot for a +-- new brief with the same slug: +CREATE UNIQUE INDEX uq_campaign_briefs_project_event + ON campaign_briefs (project_id, event_slug) WHERE status <> 'archived'; CREATE INDEX idx_campaign_briefs_project_id ON campaign_briefs (project_id); ``` @@ -190,7 +194,7 @@ CREATE INDEX idx_campaign_briefs_project_id ON campaign_briefs (project_id); ```sql CREATE TABLE campaigns ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - project_id UUID NOT NULL, + project_id TEXT NOT NULL, -- project UUID or slug (migration 000003) brief_id UUID NOT NULL REFERENCES campaign_briefs(id), -- many campaigns per brief job_id UUID, -- creation job that produced this row platform TEXT NOT NULL, -- channel: google-ads / linkedin-ads / ... diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 7421440c..d3885766 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -602,13 +602,14 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief // aggregateStatus folds per-platform outcomes into the job's status. // // Skipped platforms (single-flight SKIP: another dispatch owns the pair) are NOT -// counted as failures — a skip is not this job's outcome. If any platform was -// skipped and none of THIS job's own dispatches failed, the job is not yet done: -// the owning dispatch is still deciding the skipped pair's fate, so the job stays -// non-terminal (running) and a re-poll after the owner finishes reflects the true -// outcome (rather than the old behavior, which recorded the skip as a terminal -// failure that GetJob could never correct). Full cross-request adoption of the -// owner's result is tracked under LFXV2-2665. +// counted as failures — a skip is a deferral to that owner, not this job's outcome +// and not this job's work to finish. If a platform was skipped and none of THIS +// job's own dispatches failed, the job terminalizes as SUCCEEDED: it is neither a +// failure (spurious) nor left non-terminal (a stuck `running` job is never +// revisited — GetJob only reads it and the recovery sweeper would eventually fail +// it after staleJobCutoff). The per-platform result carries Skipped=true so a +// caller can see which platforms a concurrent request handled; full cross-request +// adoption of the owner's result is tracked under LFXV2-2665. func aggregateStatus(results []platformResult) model.JobStatus { var ok, failed, skipped int for _, r := range results { @@ -631,10 +632,18 @@ func aggregateStatus(results []platformResult) model.JobStatus { // hiding it behind a still-running status). return model.JobPartial case skipped > 0: - // No failures, but at least one pair is owned by a concurrent dispatch whose - // outcome isn't ours to know yet. Stay non-terminal so a re-poll after the - // owner completes reflects the real result instead of a spurious failure. - return model.JobRunning + // No failures, and every platform this job actually dispatched succeeded; the + // remaining pair(s) were SKIPPED because a concurrent dispatch already owns + // the (brief, platform) claim and is creating them. A skip is a deferral to + // that owner, NOT this job's failure and NOT this job's work to finish — the + // owner's own job records the real per-platform result. So this job is + // TERMINAL: return succeeded rather than staying `running` forever (nothing + // revisits a running job — GetJob only reads it and the recovery sweeper would + // eventually fail it after staleJobCutoff, turning a correct deferral into a + // spurious failure). The per-platform result already carries Skipped=true so a + // caller can see which platforms were handled by a concurrent request; full + // cross-request adoption of the owner's outcome is tracked under LFXV2-2665. + return model.JobSucceeded default: return model.JobSucceeded } diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index b8b7039e..8857d642 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -379,10 +379,12 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { }) brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) - // The single skipped platform must NOT drive the job to a terminal status. + // A skipped platform (owned by a concurrent dispatch) is a deferral, not a + // failure — the job terminalizes as SUCCEEDED (not stuck-running, which the + // recovery sweeper would later fail; not failed, which would be spurious). j := waitForFinalized(t, jobs, id) - if j.Status != model.JobRunning { - t.Errorf("status = %s, want running (a lone skipped platform must not falsely terminate the job)", j.Status) + if j.Status != model.JobSucceeded { + t.Errorf("status = %s, want succeeded (a lone skipped platform is a deferral, terminalizes succeeded)", j.Status) } disp.mu.Lock() calls := disp.calls @@ -401,8 +403,8 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { // TestOrchestrator_SkipDoesNotFailAlongsideSuccess verifies that when one // platform succeeds and another is skipped (owned by a concurrent dispatch), the // job is not falsely reported failed/partial: with a real success and no real -// failure, an outstanding skip keeps the job non-terminal (running) pending the -// owner's outcome. +// failure, an outstanding skip (a deferral to the owner) terminalizes the job as +// succeeded rather than a spurious failure/partial or a stuck running state. func TestOrchestrator_SkipDoesNotFailAlongsideSuccess(t *testing.T) { jobs := newFakeJobRepo() // LinkedIn is already held pending by another dispatch; Google Ads is free. @@ -416,8 +418,8 @@ func TestOrchestrator_SkipDoesNotFailAlongsideSuccess(t *testing.T) { brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds, model.ProviderLinkedInAds}, nil) j := waitForFinalized(t, jobs, id) - if j.Status != model.JobRunning { - t.Errorf("status = %s, want running (a skip alongside a success must not fail/partial the job)", j.Status) + if j.Status != model.JobSucceeded { + t.Errorf("status = %s, want succeeded (a skip alongside a success terminalizes succeeded, not failed/partial/stuck)", j.Status) } } @@ -430,10 +432,11 @@ func TestAggregateStatus(t *testing.T) { {"all ok", []platformResult{{OK: true}, {OK: true}}, model.JobSucceeded}, {"all fail", []platformResult{{OK: false}, {OK: false}}, model.JobFailed}, {"mixed", []platformResult{{OK: true}, {OK: false}}, model.JobPartial}, - // A single-flight SKIP is not a failure: a lone skip stays non-terminal - // (running) pending the owning dispatch's outcome. - {"only skipped", []platformResult{{Skipped: true}}, model.JobRunning}, - {"skip + ok", []platformResult{{OK: true}, {Skipped: true}}, model.JobRunning}, + // A single-flight SKIP is a deferral to the owning dispatch, not a failure + // and not this job's work to finish: it terminalizes as succeeded (not stuck + // running, which the sweeper would later fail). + {"only skipped", []platformResult{{Skipped: true}}, model.JobSucceeded}, + {"skip + ok", []platformResult{{OK: true}, {Skipped: true}}, model.JobSucceeded}, // A real failure still surfaces even when another platform was skipped. {"skip + fail", []platformResult{{OK: false}, {Skipped: true}}, model.JobPartial}, {"ok + fail + skip", []platformResult{{OK: true}, {OK: false}, {Skipped: true}}, model.JobPartial}, From 16e1d5a6a38ce16956610b1dbbc90ad4977c7b8a Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Tue, 14 Jul 2026 09:23:25 -0700 Subject: [PATCH 42/46] fix(review): count handlers outermost; surface skipped platform in poll (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot: - server.go: moved the inflight tracker to the OUTERMOST middleware (applied last) so a request is counted from the instant it enters the chain — before the request-ID/debug/OTel wrappers. Inner, a handler that started but hadn't reached the inner wrapper was invisible to Wait, so shutdown could observe zero, close the pool, and let that straggler touch a closing pool. - brief.go: the GetJob result-decode shape dropped the persisted `skipped` field, so a skip-only (succeeded) job returned a per-platform ok=false with no explanation — reading as a silent failure. Decode `skipped` and, for a skipped platform, surface an explicit non-failure "skipped: a concurrent request already owns this platform's creation" message via Error (a dedicated skipped field needs a Goa design change, tracked LFXV2-2665). - brief_test.go: TestBriefService_GetJob_SkippedSurfacesNonFailure. Verified: gofmt, go build, go vet, golangci-lint (0 issues), go test -race ./cmd/... ./internal/service. Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 7 ++++++- internal/service/brief.go | 13 ++++++++++++- internal/service/brief_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 3574872a..809868db 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -133,7 +133,6 @@ func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.En inflight := middleware.NewInflightTracker() var handler http.Handler = mux - handler = inflight.Middleware()(handler) handler = middleware.RequestIDMiddleware()(handler) if cfg.Debug { handler = debug.HTTP()(handler) @@ -146,6 +145,12 @@ func handleHTTPServer(ctx context.Context, cfg *config.Config, endpoints *svc.En return p != "/healthz" && p != "/livez" && p != "/readyz" }), ) + // Wrap the inflight tracker OUTERMOST (applied last), so a request is counted + // from the instant it enters the handler chain — before the request-ID / debug / + // OTel wrappers. If it were inner, a handler that has started but not yet reached + // the inner wrapper would be invisible to Wait, and shutdown could observe zero, + // close the pool, and let that straggler touch a closing pool. + handler = inflight.Middleware()(handler) srv := &http.Server{ Addr: cfg.ServerAddress(), diff --git a/internal/service/brief.go b/internal/service/brief.go index 32061a96..6fb96eb0 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -263,6 +263,7 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br OK bool `json:"ok"` CampaignID string `json:"campaign_id"` Error string `json:"error"` + Skipped bool `json:"skipped"` } if err := json.Unmarshal(j.Result, &stored); err != nil { // A persisted result that won't decode is corruption, not a valid empty @@ -279,9 +280,19 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br id := r.CampaignID pr.CampaignID = &id } - if r.Error != "" { + switch { + case r.Error != "": e := r.Error pr.Error = &e + case r.Skipped && !r.OK: + // A SKIPPED platform is OK=false but is NOT a failure — a concurrent + // dispatch already owns the (brief, platform) claim and is creating it. + // The generated PlatformResult has no dedicated "skipped" field (a Goa + // design change / regen, tracked in LFXV2-2665), so surface the deferral + // through Error with an explicit non-failure message rather than leaving + // an unexplained ok=false that reads as a silent failure. + msg := "skipped: a concurrent request already owns this platform's campaign creation (not a failure)" + pr.Error = &msg } resp.Result = append(resp.Result, pr) } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index f397b814..c158b357 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -521,3 +521,32 @@ func TestBriefService_GetJob_ValidResultsAndFailedErrorOnly(t *testing.T) { t.Errorf("failed job error = %v, want the surfaced error message", resp2.Error) } } + +// TestBriefService_GetJob_SkippedSurfacesNonFailure verifies a skipped platform +// (ok=false, skipped=true) on a succeeded job is surfaced with an explicit +// non-failure message rather than an unexplained ok=false that reads as a failure. +func TestBriefService_GetJob_SkippedSurfacesNonFailure(t *testing.T) { + s := getJobTestService(&model.CampaignJob{ + ID: "j1", BriefID: "b1", Status: model.JobSucceeded, + Result: []byte(`[{"platform":"google-ads","ok":true,"campaign_id":"pc-1"},{"platform":"linkedin-ads","ok":false,"skipped":true}]`), + }) + resp, err := s.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}) + if err != nil { + t.Fatalf("GetJob: %v", err) + } + var li *briefs.PlatformResult + for _, r := range resp.Result { + if r.Platform == "linkedin-ads" { + li = r + } + } + if li == nil { + t.Fatal("linkedin-ads result missing") + } + if li.OK { + t.Errorf("skipped platform OK = true, want false") + } + if li.Error == nil || !strings.Contains(*li.Error, "skipped") || !strings.Contains(*li.Error, "not a failure") { + t.Errorf("skipped platform must surface a non-failure 'skipped' message, got %v", li.Error) + } +} From 154b817a50d3e4eebab36f231b8bf9e0a550858e Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Tue, 14 Jul 2026 10:11:42 -0700 Subject: [PATCH 43/46] fix(review): reachable skipped message, empty-result guard, shutdown clamp Address Copilot review on PR #11: - brief.go: check Skipped before Error when decoding job results so a skipped platform surfaces the explicit "not a failure" message instead of the internal error string the orchestrator also persists - brief.go: reject an empty decoded result slice (null/[]) on a succeeded/partial job as corruption, closing the gap where those JSON values slipped past the raw-length guard - server.go: clamp the derived shutdown wait to a positive value so a misconfigured drain timeout cannot force-close immediately - orchestrator.go/orchestrator_test.go: update stale comments to describe the current skip-only -> succeeded terminalization Signed-off-by: Misha Rautela --- cmd/campaign-service/server.go | 9 ++++- internal/service/brief.go | 26 +++++++++++---- internal/service/brief_test.go | 48 +++++++++++++++++++++++++++ internal/service/orchestrator.go | 18 +++++----- internal/service/orchestrator_test.go | 7 ++-- 5 files changed, 89 insertions(+), 19 deletions(-) diff --git a/cmd/campaign-service/server.go b/cmd/campaign-service/server.go index 809868db..6c536cab 100644 --- a/cmd/campaign-service/server.go +++ b/cmd/campaign-service/server.go @@ -230,7 +230,14 @@ func runServerWithContext(ctx context.Context, srv *http.Server, cont *container // so the graceful Shutdown gets the rest of the HTTP budget. This guarantees // the inflight wait has a real budget even when Shutdown times out (which would // otherwise exhaust the whole HTTP context). - httpCtx, cancelHTTP := context.WithTimeout(context.Background(), container.HTTPShutdownTimeout-container.HandlerDrainTimeout) + shutdownWait := container.HTTPShutdownTimeout - container.HandlerDrainTimeout + if shutdownWait <= 0 { + // HandlerDrainTimeout must leave room within the overall shutdown budget; + // if misconfigured so it doesn't, fall back to the full budget rather than + // a zero/negative deadline that would force-close immediately. + shutdownWait = container.HTTPShutdownTimeout + } + httpCtx, cancelHTTP := context.WithTimeout(context.Background(), shutdownWait) defer cancelHTTP() if err := srv.Shutdown(httpCtx); err != nil { slog.ErrorContext(ctx, "HTTP server shutdown error; force-closing lingering connections", log.ErrKey, err) diff --git a/internal/service/brief.go b/internal/service/brief.go index 6fb96eb0..6697214e 100644 --- a/internal/service/brief.go +++ b/internal/service/brief.go @@ -273,6 +273,14 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br slog.ErrorContext(ctx, "failed to decode persisted job result", "job_id", j.ID, "error", err) return nil, &briefs.InternalServerError{Code: "500", Message: "an internal server error occurred"} } + if len(stored) == 0 && (j.Status == model.JobSucceeded || j.Status == model.JobPartial) { + // null/[] decode to an empty slice with len(j.Result) > 0, so they slip + // past the outer length guard. A succeeded/partial job is an aggregate + // over per-platform outcomes and MUST carry them; an empty decoded slice + // on such a terminal status means the stored row is corrupt. + slog.ErrorContext(ctx, "terminal job has empty per-platform results", "job_id", j.ID, "status", j.Status) + return nil, &briefs.InternalServerError{Code: "500", Message: "an internal server error occurred"} + } resp.Result = make([]*briefs.PlatformResult, 0, len(stored)) for _, r := range stored { pr := &briefs.PlatformResult{Platform: r.Platform, OK: r.OK} @@ -281,18 +289,22 @@ func (s *BriefService) GetJob(ctx context.Context, p *briefs.GetJobPayload) (*br pr.CampaignID = &id } switch { - case r.Error != "": - e := r.Error - pr.Error = &e case r.Skipped && !r.OK: // A SKIPPED platform is OK=false but is NOT a failure — a concurrent // dispatch already owns the (brief, platform) claim and is creating it. - // The generated PlatformResult has no dedicated "skipped" field (a Goa - // design change / regen, tracked in LFXV2-2665), so surface the deferral - // through Error with an explicit non-failure message rather than leaving - // an unexplained ok=false that reads as a silent failure. + // The orchestrator persists a skip with BOTH Skipped=true AND a raw + // internal Error string, so this case MUST be checked before the Error + // case or the friendly message below is unreachable and polling leaks + // the internal string. The generated PlatformResult has no dedicated + // "skipped" field (a Goa design change / regen, tracked in LFXV2-2665), + // so surface the deferral through Error with an explicit non-failure + // message rather than leaving an unexplained ok=false that reads as a + // silent failure. msg := "skipped: a concurrent request already owns this platform's campaign creation (not a failure)" pr.Error = &msg + case r.Error != "": + e := r.Error + pr.Error = &e } resp.Result = append(resp.Result, pr) } diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index c158b357..542a32fe 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -491,6 +491,54 @@ func TestBriefService_GetJob_TerminalWithoutResultsIsInternalError(t *testing.T) } } +// A succeeded/partial job whose stored Result is the raw JSON null or [] decodes +// to an EMPTY slice with len(j.Result) > 0, so it slips past the outer length +// guard. GetJob must still treat this as corruption on a terminal-aggregate status +// and surface a 500, not a 200 with zero per-platform results. +func TestBriefService_GetJob_EmptyDecodedResultIsInternalError(t *testing.T) { + for _, raw := range []string{`null`, `[]`} { + for _, st := range []model.JobStatus{model.JobSucceeded, model.JobPartial} { + s := getJobTestService(&model.CampaignJob{ + ID: "j1", BriefID: "b1", Status: st, Result: []byte(raw), + }) + _, err := s.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}) + if _, ok := err.(*briefs.InternalServerError); !ok { + t.Fatalf("raw %q status %s: expected *briefs.InternalServerError for an empty decoded result on a terminal job, got %T (%v)", raw, st, err, err) + } + } + } +} + +// The orchestrator persists a skipped platform with BOTH skipped=true AND a raw +// internal error string ("skipped: another concurrent dispatch owns..."). GetJob +// must check the skipped case before the error case so it surfaces the explicit +// "not a failure" message rather than leaking the internal string. +func TestBriefService_GetJob_SkippedWithInternalErrorSurfacesNonFailure(t *testing.T) { + s := getJobTestService(&model.CampaignJob{ + ID: "j1", BriefID: "b1", Status: model.JobSucceeded, + Result: []byte(`[{"platform":"google-ads","ok":true,"campaign_id":"pc-1"},{"platform":"linkedin-ads","ok":false,"skipped":true,"error":"skipped: another concurrent dispatch owns this platform"}]`), + }) + resp, err := s.GetJob(context.Background(), &briefs.GetJobPayload{ProjectID: "cncf", JobID: "j1"}) + if err != nil { + t.Fatalf("GetJob: %v", err) + } + var li *briefs.PlatformResult + for _, r := range resp.Result { + if r.Platform == "linkedin-ads" { + li = r + } + } + if li == nil { + t.Fatal("linkedin-ads result missing") + } + if li.Error == nil || !strings.Contains(*li.Error, "not a failure") { + t.Errorf("skipped platform must surface the friendly non-failure message, got %v", li.Error) + } + if li.Error != nil && strings.Contains(*li.Error, "another concurrent dispatch owns") { + t.Errorf("skipped platform leaked the internal error string: %v", *li.Error) + } +} + // A valid persisted result decodes into typed per-platform results, and a failed // job carrying only an error (no results — a legitimate finalize-marshal-failure // outcome) is NOT treated as corruption: it returns 200 with the error surfaced. diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index d3885766..3ce0ff2f 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -294,10 +294,11 @@ func (o *Orchestrator) Shutdown(ctx context.Context, drainTimeout time.Duration) // aggregate job terminal-failed/partial even when the owning dispatch succeeds // (and GetJob only decodes the stored result; it never re-checks the campaign // row). aggregateStatus therefore excludes skipped platforms from the failure -// tally, and a job with only skipped platforms stays non-terminal (running) so a -// re-poll after the owner finishes reflects the true outcome. Full cross-request -// reconciliation (this job actively adopting the owner's result) is tracked under -// LFXV2-2665. +// tally, and a job with only skipped platforms terminalizes as succeeded (nothing +// revisits a running job — GetJob only reads it — so leaving it running would +// strand it until the staleness sweeper failed it, turning a correct deferral into +// a spurious failure). Full cross-request reconciliation (this job actively +// adopting the owner's result) is tracked under LFXV2-2665. type platformResult struct { Platform string `json:"platform"` OK bool `json:"ok"` @@ -502,10 +503,11 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief // as a failure would falsely drive THIS job to terminal failed/partial even // when the owner succeeds (GetJob only decodes the stored result and never // re-checks the campaign row, so the false failure would be permanent). - // aggregateStatus excludes skipped platforms from the failure tally and keeps - // a wholly-skipped job non-terminal (running) so a re-poll after the owner - // finishes reflects the true outcome. Fully adopting the owner's async result - // into this job is tracked under LFXV2-2665. + // aggregateStatus excludes skipped platforms from the failure tally and + // returns succeeded for a wholly-skipped job (leaving it running would strand + // it until the staleness sweeper failed it, since nothing revisits a running + // job). Fully adopting the owner's async result into this job is tracked under + // LFXV2-2665. res.Skipped = true res.Error = "skipped: another concurrent dispatch owns this platform" return res diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 8857d642..edeb79d6 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -363,9 +363,10 @@ func TestOrchestrator_ClaimErrorIsFailure(t *testing.T) { // TestOrchestrator_AlreadyClaimedPendingSkips verifies that when another worker // holds the pending claim (no upstream id yet), this worker does not dispatch and -// the skip is NOT recorded as a terminal failure: a single skipped platform must -// leave the job non-terminal (running) so a re-poll after the owner completes -// reflects the true outcome, rather than the old behavior of falsely failing it. +// the skip is NOT recorded as a terminal failure: a single skipped platform is a +// deferral to the owning dispatch, so the job terminalizes as succeeded (not +// failed, which would be spurious; not left running, which the staleness sweeper +// would later fail), rather than the old behavior of falsely failing it. func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { jobs := newFakeJobRepo() // Seed a pending claim (no upstream id) for the pair, so ClaimCampaignDispatch From 915b923a953ccbd514a64baa07fd51212353d9ea Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Wed, 15 Jul 2026 09:48:35 -0700 Subject: [PATCH 44/46] fix(review): persist partial campaign ID on dispatch error for reconciliation Dispatch can return a non-nil campaign (carrying the created upstream ID) alongside an error, per the platform clients' partial-result contract. The error branch discarded that campaign, leaving an anonymous pending claim and an unreconcilable orphaned upstream campaign. Persist the upstream ID onto the retained pending row when a dispatch error carries a partial campaign, so the orphan is reconcilable. Signed-off-by: Misha Rautela --- internal/service/orchestrator.go | 31 ++++++++++++++- internal/service/orchestrator_test.go | 55 +++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 3ce0ff2f..1977348d 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -546,7 +546,36 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief slog.ErrorContext(ctx, "platform dispatch failed before upstream create (claim released)", "platform", p, "job_id", jobID, "error", derr) releaseClaim() } else { - slog.ErrorContext(ctx, "platform dispatch failed (claim retained; outcome unknown)", "platform", p, "job_id", jobID, "error", derr) + // The claim is RETAINED (outcome unknown, blind retry could double-create). + // The platform clients' partial-result contract lets Dispatch return a + // non-nil campaign carrying the created upstream id ALONGSIDE the error + // (the campaign POST succeeded but a later step failed). If it did, stamp + // that upstream id onto the retained pending row so the orphaned upstream + // campaign is RECONCILABLE later instead of leaving an anonymous claim. + // Persist on a context DETACHED from the dispatch ctx (mirroring the + // success path) so a shutdown-cancelled dispatch ctx can't drop the record + // of a paid campaign that actually exists. + if campaign != nil && campaign.PlatformCampaignID != "" { + campaign.JobID = &jobID + campaign.BriefID = brief.ID + campaign.ProjectID = brief.ProjectID + campaign.Platform = p + // Keep the row 'pending' so it stays a recoverable orphan (not a + // completed campaign): the dispatch did not succeed, only the upstream + // create partially happened. + campaign.Status = "pending" + persistCtx, cancelPersist := context.WithTimeout(context.WithoutCancel(ctx), persistResultTimeout) + if _, perr := o.campaigns.UpsertCampaign(persistCtx, campaign); perr != nil { + slog.ErrorContext(ctx, "failed to record partial upstream campaign id on retained pending claim", + "platform", p, "job_id", jobID, "platform_campaign_id", campaign.PlatformCampaignID, "error", perr) + } else { + slog.ErrorContext(ctx, "platform dispatch failed after upstream create; recorded orphaned upstream id on retained pending claim", + "platform", p, "job_id", jobID, "platform_campaign_id", campaign.PlatformCampaignID, "error", derr) + } + cancelPersist() + } else { + slog.ErrorContext(ctx, "platform dispatch failed (claim retained; outcome unknown)", "platform", p, "job_id", jobID, "error", derr) + } } res.Error = "platform campaign creation failed" return res diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index edeb79d6..6fc439a5 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -159,6 +159,13 @@ func (r *fakeCampaignRepo) UpsertCampaign(_ context.Context, c *model.Campaign) defer r.mu.Unlock() c.Version = 1 r.upserted = append(r.upserted, c) + // Mirror the real ON CONFLICT (brief_id, platform) DO UPDATE: the (brief, + // platform) row is updated in place, so a subsequent lookup sees the new + // platform_campaign_id/status. + if r.existing == nil { + r.existing = map[string]*model.Campaign{} + } + r.existing[c.BriefID+"|"+string(c.Platform)] = c return c, nil } func (r *fakeCampaignRepo) ReplaceCampaign(context.Context, *model.Campaign, int64) (*model.Campaign, error) { @@ -922,6 +929,54 @@ func TestOrchestrator_PreCreateErrorReleasesClaim(t *testing.T) { } } +// partialResultDispatcher exercises the platform clients' partial-result +// contract: it returns a non-nil campaign carrying the created upstream id +// ALONGSIDE a (non-pre-create) error, as reddit/twitter clients do when the +// campaign POST succeeded but a later step failed. +type partialResultDispatcher struct{} + +func (partialResultDispatcher) Dispatch(_ context.Context, _ *model.CampaignBrief, p model.Provider, _ json.RawMessage) (*model.Campaign, error) { + return &model.Campaign{PlatformCampaignID: "pc-orphan-" + string(p), Status: "active", CampaignName: "n"}, + errors.New("ad group creation failed after campaign was created") +} + +// TestOrchestrator_PartialDispatchErrorPersistsUpstreamID verifies that when +// Dispatch returns a partial campaign (a created upstream id) together with an +// error, the retained pending row is stamped with that upstream id so the +// orphaned upstream campaign is reconcilable — and the claim is NOT released. +func TestOrchestrator_PartialDispatchErrorPersistsUpstreamID(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: partialResultDispatcher{}, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + camps.mu.Lock() + defer camps.mu.Unlock() + // The claim must be RETAINED (not released) — the upstream campaign may exist. + row, ok := camps.existing["b1|"+string(model.ProviderGoogleAds)] + if !ok { + t.Fatal("pending claim should be retained after a partial dispatch error, not released") + } + // The retained row must now carry the orphaned upstream id (reconcilable) and + // remain 'pending' (a recoverable orphan, not a completed campaign). + if row.PlatformCampaignID != "pc-orphan-"+string(model.ProviderGoogleAds) { + t.Errorf("retained row PlatformCampaignID = %q, want the orphaned upstream id", row.PlatformCampaignID) + } + if row.Status != "pending" { + t.Errorf("retained row Status = %q, want pending (recoverable orphan)", row.Status) + } + // The partial campaign must have been persisted via UpsertCampaign. + if len(camps.upserted) != 1 { + t.Errorf("upserted %d campaigns, want 1 (partial upstream id persisted)", len(camps.upserted)) + } +} + // blockingSweepJobRepo blocks inside FailStuckJobs until its context is // cancelled, letting a test prove that cancelling the sweeper's context // interrupts an in-flight sweep promptly (rather than the sweep running to its From cee2b111acc8687a8a84414789ae7a94848c6237 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 20 Jul 2026 11:45:17 -0700 Subject: [PATCH 45/46] fix(review): address 4 minor findings on PR #11 (project scoping, orphan claim, concurrency test, goa DRY) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address @dealako's review: - internal/infrastructure/postgres/campaign_repo.go: GetCampaignByPlatform was the only campaign_repo method without project_id scoping. Added a projectID param + AND project_id=$3 (matching GetCampaign/ClaimCampaignDispatch) for tenant- isolation defense-in-depth. Updated the domain interface + orchestrator call. - internal/infrastructure/postgres/campaign_repo.go: the rare double-fault in ClaimCampaignDispatch (post-insert read AND rollback both fail) orphans a status='pending' row that permanently blocks the (brief,platform) pair. Now logs at ERROR with full context (project_id/brief_id/platform/job_id) for alerting. - internal/service/orchestrator_test.go: added TestClaimCampaignDispatch_ConcurrentSingleWinner — N goroutines racing the claim path, asserting exactly one wins and losers cleanly no-op (the prior claim tests only ran single-threaded). - design/brief.go: Brief now Reference()s BriefInput for the 8 shared attributes instead of duplicating them. This also fixed a latent drift the manual copy had caused — Brief's program_type was missing BriefInput's Enum, so the generated OpenAPI had no enum + gibberish examples on the Brief response. Regenerated gen/. - test fakes updated for the new GetCampaignByPlatform signature. Resolves 4 review threads. Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Misha Rautela --- design/brief.go | 26 +- docs/knowledge/log.md | 18 + gen/http/cli/lfx_v2_campaign_service/cli.go | 62 +- .../client/cli.go | 8 +- .../client/types.go | 40 +- .../server/types.go | 20 +- .../client/cli.go | 40 +- gen/http/openapi.json | 2 +- gen/http/openapi.yaml | 802 ++--- gen/http/openapi3.json | 2 +- gen/http/openapi3.yaml | 2654 +++++++++-------- gen/lfx_v2_campaign_service_briefs/service.go | 5 +- internal/container/container_test.go | 2 +- internal/domain/brief_port.go | 5 +- .../infrastructure/postgres/campaign_repo.go | 24 +- internal/service/brief_test.go | 2 +- internal/service/orchestrator.go | 2 +- internal/service/orchestrator_test.go | 59 +- 18 files changed, 1968 insertions(+), 1805 deletions(-) diff --git a/design/brief.go b/design/brief.go index 5bb26258..fff1b98e 100644 --- a/design/brief.go +++ b/design/brief.go @@ -32,18 +32,26 @@ var BriefInput = Type("brief-input", func() { Required("program_type", "event_slug") }) -// Brief is the brief response view. +// Brief is the brief response view. It Reference()s BriefInput so the eight +// shared attributes (program_type, event_slug, url, platforms, event_details, +// copy, keywords, targeting) inherit their type/validation/description from a +// single source of truth — a later change to BriefInput's program_type Enum or a +// validation rule flows here automatically, so the two can't silently drift. +// Brief then layers on its response-only fields. var Brief = Type("brief", func() { + Reference(BriefInput) Attribute("id", String, "Brief UUID") Attribute("project_id", String, "Owning project") - Attribute("program_type", String, "Funnel context") - Attribute("event_slug", String, "Event/course slug") - Attribute("url", String, "Event/course page URL") - Attribute("platforms", ArrayOf(String), "Suggested default platforms") - Attribute("event_details", Any, "Extracted event/course details") - Attribute("copy", Any, "Ad copy") - Attribute("keywords", Any, "Keyword list") - Attribute("targeting", Any, "Targeting recommendation") + // Inherited from BriefInput via Reference (name-only Attribute calls). + Attribute("program_type") + Attribute("event_slug") + Attribute("url") + Attribute("platforms") + Attribute("event_details") + Attribute("copy") + Attribute("keywords") + Attribute("targeting") + // Response-only fields. Attribute("status", String, "Lifecycle status", func() { Enum("draft", "approved", "archived") }) diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index 1bc39721..3878a788 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -1,5 +1,23 @@ # Log +## 2026-07-20 + +**Update** — Addressed dealako's 4 [minor] review items on PR #11 (LFXV2-2626). +(1) `GetCampaignByPlatform` was the one campaign_repo method not scoped by +project_id — added a `projectID` param + `AND project_id=$3` (matching +GetCampaign/ClaimCampaignDispatch) for tenant-isolation defense-in-depth; updated +the domain interface + the orchestrator call site. (2) The rare double-fault in +`ClaimCampaignDispatch` (post-insert read AND rollback both fail) orphans a +`status='pending'` row that permanently blocks the (brief,platform) pair — now +logs at ERROR with project_id/brief_id/platform/job_id for alerting/manual +reconcile. (3) Added `TestClaimCampaignDispatch_ConcurrentSingleWinner` — N +goroutines racing the claim path, asserting exactly one wins and losers cleanly +no-op (the prior claim tests were single-threaded). (4) `design/brief.go`: `Brief` +now `Reference()`s `BriefInput` for the 8 shared attributes instead of +duplicating them — this also fixed a latent drift the manual copy had already +caused (Brief's `program_type` was missing BriefInput's Enum, so the generated +OpenAPI had no enum + gibberish examples on the Brief response; regenerated). + ## 2026-07-13 **Creation** — Added OKF concept doc for internal/platform/meta (Meta Ads Graph diff --git a/gen/http/cli/lfx_v2_campaign_service/cli.go b/gen/http/cli/lfx_v2_campaign_service/cli.go index c9d2fdef..50e2f130 100644 --- a/gen/http/cli/lfx_v2_campaign_service/cli.go +++ b/gen/http/cli/lfx_v2_campaign_service/cli.go @@ -33,8 +33,8 @@ func UsageCommands() []string { // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + - os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + return os.Args[0] + " " + "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Autem veniam.\",\n \"event_details\": \"Vel autem voluptates.\",\n \"event_slug\": \"Et est laboriosam.\",\n \"keywords\": \"Enim unde omnis.\",\n \"platforms\": [\n \"Nam exercitationem consectetur sint.\",\n \"Necessitatibus ex ea ullam corrupti.\",\n \"Et omnis accusantium.\",\n \"Iure modi asperiores ut.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Quam sed rem quia consequuntur ut.\",\n \"url\": \"Facere sint totam sapiente vitae numquam ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + + os.Args[0] + " " + "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Architecto itaque doloribus voluptatem consequatur quis fugiat.\",\n \"client_secret\": \"Recusandae qui culpa.\",\n \"developer_token\": \"Accusamus et atque enim.\",\n \"refresh_token\": \"Dolorum minus voluptatem.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"" + "\n" + os.Args[0] + " " + "lfx-v2-campaign-service-svc readyz" + "\n" + "" } @@ -810,7 +810,7 @@ func lfxV2CampaignServiceBriefsCreateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-brief --body '{\n \"brief\": {\n \"copy\": \"Autem veniam.\",\n \"event_details\": \"Vel autem voluptates.\",\n \"event_slug\": \"Et est laboriosam.\",\n \"keywords\": \"Enim unde omnis.\",\n \"platforms\": [\n \"Nam exercitationem consectetur sint.\",\n \"Necessitatibus ex ea ullam corrupti.\",\n \"Et omnis accusantium.\",\n \"Iure modi asperiores ut.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Quam sed rem quia consequuntur ut.\",\n \"url\": \"Facere sint totam sapiente vitae numquam ut.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetBriefUsage() { @@ -832,7 +832,7 @@ func lfxV2CampaignServiceBriefsGetBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"feb32fc3-d9b4-40fc-8753-f31916725c92\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-brief --project-id \"cncf\" --brief-id \"b1b28eb8-9957-4b18-8f64-00e2fb848653\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateBriefUsage() { @@ -858,7 +858,7 @@ func lfxV2CampaignServiceBriefsUpdateBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }' --project-id \"cncf\" --brief-id \"3d8699f7-a485-463f-b50e-693e64cc8a6a\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-brief --body '{\n \"brief\": {\n \"copy\": \"Autem veniam.\",\n \"event_details\": \"Vel autem voluptates.\",\n \"event_slug\": \"Et est laboriosam.\",\n \"keywords\": \"Enim unde omnis.\",\n \"platforms\": [\n \"Nam exercitationem consectetur sint.\",\n \"Necessitatibus ex ea ullam corrupti.\",\n \"Et omnis accusantium.\",\n \"Iure modi asperiores ut.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Quam sed rem quia consequuntur ut.\",\n \"url\": \"Facere sint totam sapiente vitae numquam ut.\"\n }\n }' --project-id \"cncf\" --brief-id \"30229466-ae87-47ac-b7d5-b53993dbed1c\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsApproveBriefUsage() { @@ -882,7 +882,7 @@ func lfxV2CampaignServiceBriefsApproveBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"91872672-ab36-4453-a7d4-69973cfe0c1f\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs approve-brief --project-id \"cncf\" --brief-id \"2c2e19a1-5233-40e5-bbb4-66a813f98d6a\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsDeleteBriefUsage() { @@ -904,7 +904,7 @@ func lfxV2CampaignServiceBriefsDeleteBriefUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"3c8dfdd8-d7e4-4234-aa6b-bdf91739de5f\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs delete-brief --project-id \"cncf\" --brief-id \"4d1db8e4-22e4-44c5-87f5-a4ec939571cf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { @@ -928,7 +928,7 @@ func lfxV2CampaignServiceBriefsCreateCampaignsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Facere et exercitationem.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"2bc32a4b-33c5-4283-be41-764e76dbf43b\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs create-campaigns --body '{\n \"input\": {\n \"config\": \"Quia quos ut tempora consequuntur cumque repudiandae.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"microsoft-ads\",\n \"linkedin-ads\"\n ]\n }\n }' --project-id \"cncf\" --brief-id \"c19b94cb-dfbb-4eb2-a345-6868fe5cb0d9\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsGetCampaignUsage() { @@ -952,7 +952,7 @@ func lfxV2CampaignServiceBriefsGetCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"4d408f04-2b77-4cc6-89c3-d1de8c2aff2f\" --campaign-id \"0e00e9a1-b853-4a76-b35a-79c53fbf76d6\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-campaign --project-id \"cncf\" --brief-id \"fb037a6e-7167-4da7-81bf-1adf39805491\" --campaign-id \"89fe4562-ff49-4584-a8cd-10412d5b4ee5\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { @@ -980,7 +980,7 @@ func lfxV2CampaignServiceBriefsUpdateCampaignUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Ad voluptatem.\",\n \"config\": \"Et expedita itaque quos.\",\n \"status\": \"Tempore impedit.\"\n }\n }' --project-id \"cncf\" --brief-id \"5c18baaf-373e-4559-97ee-acbe7143a0b4\" --campaign-id \"1d09d573-4c48-4d65-8ccb-2c1c877e6d71\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs update-campaign --body '{\n \"campaign\": {\n \"campaign_name\": \"Eos doloribus autem corrupti sed voluptatum laborum.\",\n \"config\": \"Perferendis qui maiores aut reiciendis.\",\n \"status\": \"Suscipit quas sunt eos nulla.\"\n }\n }' --project-id \"cncf\" --brief-id \"8cd37251-f650-4b5c-98ba-af310dab9f72\" --campaign-id \"c8fd554b-b3a8-496c-b2a6-0b0e028ba181\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceBriefsGetJobUsage() { @@ -1002,7 +1002,7 @@ func lfxV2CampaignServiceBriefsGetJobUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"90396306-a163-40f9-96e0-21f5cb20365a\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-briefs get-job --project-id \"cncf\" --job-id \"9f3a62f8-d075-4c8e-8542-bc3b708ab09e\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceConnectionsUsage displays the usage of the @@ -1076,7 +1076,7 @@ func lfxV2CampaignServiceConnectionsCreateGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-google-ads --body '{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Architecto itaque doloribus voluptatem consequatur quis fugiat.\",\n \"client_secret\": \"Recusandae qui culpa.\",\n \"developer_token\": \"Accusamus et atque enim.\",\n \"refresh_token\": \"Dolorum minus voluptatem.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetGoogleAdsUsage() { @@ -1182,7 +1182,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-google-ads --body '{\n \"credentials\": {\n \"client_id\": \"Architecto itaque doloribus voluptatem consequatur quis fugiat.\",\n \"client_secret\": \"Recusandae qui culpa.\",\n \"developer_token\": \"Accusamus et atque enim.\",\n \"refresh_token\": \"Dolorum minus voluptatem.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { @@ -1204,7 +1204,7 @@ func lfxV2CampaignServiceConnectionsCreateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Temporibus et provident maiores neque.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Illo minima eaque earum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetLinkedinAdsUsage() { @@ -1248,7 +1248,7 @@ func lfxV2CampaignServiceConnectionsUpdateLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-linkedin-ads --body '{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Temporibus et provident maiores neque.\",\n \"org_id\": \"208777\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteLinkedinAdsUsage() { @@ -1310,7 +1310,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-linkedin-ads --body '{\n \"credentials\": {\n \"access_token\": \"Illo minima eaque earum.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { @@ -1332,7 +1332,7 @@ func lfxV2CampaignServiceConnectionsCreateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n },\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Qui rerum est sed sed.\",\n \"label\": \"Quis quam dolor occaecati earum iusto rerum.\",\n \"page_id\": \"Cupiditate nobis.\"\n },\n \"credentials\": {\n \"access_token\": \"Enim ea.\",\n \"app_secret\": \"Quidem molestiae deleniti omnis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMetaAdsUsage() { @@ -1376,7 +1376,7 @@ func lfxV2CampaignServiceConnectionsUpdateMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-meta-ads --body '{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Qui rerum est sed sed.\",\n \"label\": \"Quis quam dolor occaecati earum iusto rerum.\",\n \"page_id\": \"Cupiditate nobis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMetaAdsUsage() { @@ -1438,7 +1438,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMetaAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-meta-ads --body '{\n \"credentials\": {\n \"access_token\": \"Enim ea.\",\n \"app_secret\": \"Quidem molestiae deleniti omnis.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { @@ -1460,7 +1460,7 @@ func lfxV2CampaignServiceConnectionsCreateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n },\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Laboriosam qui id enim.\"\n },\n \"credentials\": {\n \"client_id\": \"Magni repudiandae.\",\n \"client_secret\": \"Nihil corrupti repellat eius.\",\n \"refresh_token\": \"Qui nobis et delectus quam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetRedditAdsUsage() { @@ -1504,7 +1504,7 @@ func lfxV2CampaignServiceConnectionsUpdateRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-reddit-ads --body '{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Laboriosam qui id enim.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteRedditAdsUsage() { @@ -1566,7 +1566,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialRedditAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-reddit-ads --body '{\n \"credentials\": {\n \"client_id\": \"Magni repudiandae.\",\n \"client_secret\": \"Nihil corrupti repellat eius.\",\n \"refresh_token\": \"Qui nobis et delectus quam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { @@ -1588,7 +1588,7 @@ func lfxV2CampaignServiceConnectionsCreateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n },\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Dolorem non laudantium sunt minima repudiandae illo.\",\n \"label\": \"Labore esse.\"\n },\n \"credentials\": {\n \"access_token\": \"Deleniti placeat fuga aut saepe.\",\n \"access_token_secret\": \"Reiciendis pariatur repellat.\",\n \"consumer_key\": \"Nulla dolorum deserunt ut sit dolor.\",\n \"consumer_secret\": \"Eos nihil ipsam ex odio totam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetTwitterAdsUsage() { @@ -1632,7 +1632,7 @@ func lfxV2CampaignServiceConnectionsUpdateTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-twitter-ads --body '{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Dolorem non laudantium sunt minima repudiandae illo.\",\n \"label\": \"Labore esse.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteTwitterAdsUsage() { @@ -1694,7 +1694,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-twitter-ads --body '{\n \"credentials\": {\n \"access_token\": \"Deleniti placeat fuga aut saepe.\",\n \"access_token_secret\": \"Reiciendis pariatur repellat.\",\n \"consumer_key\": \"Nulla dolorum deserunt ut sit dolor.\",\n \"consumer_secret\": \"Eos nihil ipsam ex odio totam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { @@ -1716,7 +1716,7 @@ func lfxV2CampaignServiceConnectionsCreateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Ut necessitatibus dolor nemo.\",\n \"customer_id\": \"Nisi numquam nihil id unde.\",\n \"label\": \"Voluptatem sed illo numquam praesentium tenetur quas.\"\n },\n \"credentials\": {\n \"client_id\": \"Officiis aut fugiat optio ut.\",\n \"client_secret\": \"Et voluptas tenetur nobis facere.\",\n \"developer_token\": \"Blanditiis mollitia dolores illo nostrum magnam.\",\n \"refresh_token\": \"Quo corporis recusandae dicta quibusdam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetMicrosoftAdsUsage() { @@ -1760,7 +1760,7 @@ func lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-microsoft-ads --body '{\n \"config\": {\n \"account_id\": \"Ut necessitatibus dolor nemo.\",\n \"customer_id\": \"Nisi numquam nihil id unde.\",\n \"label\": \"Voluptatem sed illo numquam praesentium tenetur quas.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteMicrosoftAdsUsage() { @@ -1822,7 +1822,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-microsoft-ads --body '{\n \"credentials\": {\n \"client_id\": \"Officiis aut fugiat optio ut.\",\n \"client_secret\": \"Et voluptas tenetur nobis facere.\",\n \"developer_token\": \"Blanditiis mollitia dolores illo nostrum magnam.\",\n \"refresh_token\": \"Quo corporis recusandae dicta quibusdam.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { @@ -1844,7 +1844,7 @@ func lfxV2CampaignServiceConnectionsCreateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections create-hubspot --body '{\n \"config\": {\n \"account_id\": \"Maxime dicta qui aut.\",\n \"brand_kit\": \"Corrupti voluptas.\",\n \"label\": \"Dolor porro inventore alias error.\",\n \"portal_id\": \"Suscipit eos nam ipsa.\",\n \"sender_email\": \"Velit et impedit facilis quaerat.\",\n \"sender_name\": \"Dolor ut velit quam omnis et dolor.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Vitae vel omnis autem accusamus mollitia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } func lfxV2CampaignServiceConnectionsGetHubspotUsage() { @@ -1888,7 +1888,7 @@ func lfxV2CampaignServiceConnectionsUpdateHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections update-hubspot --body '{\n \"config\": {\n \"account_id\": \"Maxime dicta qui aut.\",\n \"brand_kit\": \"Corrupti voluptas.\",\n \"label\": \"Dolor porro inventore alias error.\",\n \"portal_id\": \"Suscipit eos nam ipsa.\",\n \"sender_email\": \"Velit et impedit facilis quaerat.\",\n \"sender_name\": \"Dolor ut velit quam omnis et dolor.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\" --if-match \"3\"") } func lfxV2CampaignServiceConnectionsDeleteHubspotUsage() { @@ -1950,7 +1950,7 @@ func lfxV2CampaignServiceConnectionsSetCredentialHubspotUsage() { fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Example:") - fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") + fmt.Fprintf(os.Stderr, " %s %s\n", os.Args[0], "lfx-v2-campaign-service-connections set-credential-hubspot --body '{\n \"credentials\": {\n \"private_app_token\": \"Vitae vel omnis autem accusamus mollitia.\"\n }\n }' --project-id \"cncf\" --bearer-token \"eyJhbGci...\"") } // lfxV2CampaignServiceSvcUsage displays the usage of the diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go index cb993f4e..21340ea6 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/cli.go @@ -23,7 +23,7 @@ func BuildCreateBriefPayload(lfxV2CampaignServiceBriefsCreateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Autem veniam.\",\n \"event_details\": \"Vel autem voluptates.\",\n \"event_slug\": \"Et est laboriosam.\",\n \"keywords\": \"Enim unde omnis.\",\n \"platforms\": [\n \"Nam exercitationem consectetur sint.\",\n \"Necessitatibus ex ea ullam corrupti.\",\n \"Et omnis accusantium.\",\n \"Iure modi asperiores ut.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Quam sed rem quia consequuntur ut.\",\n \"url\": \"Facere sint totam sapiente vitae numquam ut.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -95,7 +95,7 @@ func BuildUpdateBriefPayload(lfxV2CampaignServiceBriefsUpdateBriefBody string, l { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateBriefBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Blanditiis quidem qui iusto sed.\",\n \"event_details\": \"Dolor molestias ipsa dolorum est.\",\n \"event_slug\": \"Accusantium ad.\",\n \"keywords\": \"Vel fuga recusandae.\",\n \"platforms\": [\n \"Iste autem veniam et enim unde.\",\n \"Facere quam.\",\n \"Rem quia consequuntur ut.\",\n \"Consequatur quos atque voluptates quo sit.\"\n ],\n \"program_type\": \"membership\",\n \"targeting\": \"Nulla ut laboriosam.\",\n \"url\": \"Modi asperiores ut libero vel.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"brief\": {\n \"copy\": \"Autem veniam.\",\n \"event_details\": \"Vel autem voluptates.\",\n \"event_slug\": \"Et est laboriosam.\",\n \"keywords\": \"Enim unde omnis.\",\n \"platforms\": [\n \"Nam exercitationem consectetur sint.\",\n \"Necessitatibus ex ea ullam corrupti.\",\n \"Et omnis accusantium.\",\n \"Iure modi asperiores ut.\"\n ],\n \"program_type\": \"education\",\n \"targeting\": \"Quam sed rem quia consequuntur ut.\",\n \"url\": \"Facere sint totam sapiente vitae numquam ut.\"\n }\n }'") } if body.Brief == nil { err = goa.MergeErrors(err, goa.MissingFieldError("brief", "body")) @@ -220,7 +220,7 @@ func BuildCreateCampaignsPayload(lfxV2CampaignServiceBriefsCreateCampaignsBody s { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsCreateCampaignsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Facere et exercitationem.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"twitter-ads\",\n \"google-ads\"\n ]\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"input\": {\n \"config\": \"Quia quos ut tempora consequuntur cumque repudiandae.\",\n \"platforms\": [\n \"microsoft-ads\",\n \"microsoft-ads\",\n \"linkedin-ads\"\n ]\n }\n }'") } if body.Input == nil { err = goa.MergeErrors(err, goa.MissingFieldError("input", "body")) @@ -310,7 +310,7 @@ func BuildUpdateCampaignPayload(lfxV2CampaignServiceBriefsUpdateCampaignBody str { err = json.Unmarshal([]byte(lfxV2CampaignServiceBriefsUpdateCampaignBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Ad voluptatem.\",\n \"config\": \"Et expedita itaque quos.\",\n \"status\": \"Tempore impedit.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"campaign\": {\n \"campaign_name\": \"Eos doloribus autem corrupti sed voluptatum laborum.\",\n \"config\": \"Perferendis qui maiores aut reiciendis.\",\n \"status\": \"Suscipit quas sunt eos nulla.\"\n }\n }'") } if body.Campaign == nil { err = goa.MergeErrors(err, goa.MissingFieldError("campaign", "body")) diff --git a/gen/http/lfx_v2_campaign_service_briefs/client/types.go b/gen/http/lfx_v2_campaign_service_briefs/client/types.go index dd9f3ce4..86607baa 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/client/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/client/types.go @@ -47,11 +47,12 @@ type CreateBriefResponseBody struct { ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` // Funnel context ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -76,11 +77,12 @@ type GetBriefResponseBody struct { ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` // Funnel context ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -105,11 +107,12 @@ type UpdateBriefResponseBody struct { ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` // Funnel context ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -134,11 +137,12 @@ type ApproveBriefResponseBody struct { ProjectID *string `form:"project_id,omitempty" json:"project_id,omitempty" xml:"project_id,omitempty"` // Funnel context ProgramType *string `form:"program_type,omitempty" json:"program_type,omitempty" xml:"program_type,omitempty"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug *string `form:"event_slug,omitempty" json:"event_slug,omitempty" xml:"event_slug,omitempty"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -1595,6 +1599,11 @@ func ValidateCreateBriefResponseBody(body *CreateBriefResponseBody) (err error) if body.Version == nil { err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) } + if body.ProgramType != nil { + if !(*body.ProgramType == "events" || *body.ProgramType == "education" || *body.ProgramType == "membership") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.program_type", *body.ProgramType, []any{"events", "education", "membership"})) + } + } if body.Status != nil { if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) @@ -1624,6 +1633,11 @@ func ValidateGetBriefResponseBody(body *GetBriefResponseBody) (err error) { if body.Version == nil { err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) } + if body.ProgramType != nil { + if !(*body.ProgramType == "events" || *body.ProgramType == "education" || *body.ProgramType == "membership") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.program_type", *body.ProgramType, []any{"events", "education", "membership"})) + } + } if body.Status != nil { if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) @@ -1653,6 +1667,11 @@ func ValidateUpdateBriefResponseBody(body *UpdateBriefResponseBody) (err error) if body.Version == nil { err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) } + if body.ProgramType != nil { + if !(*body.ProgramType == "events" || *body.ProgramType == "education" || *body.ProgramType == "membership") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.program_type", *body.ProgramType, []any{"events", "education", "membership"})) + } + } if body.Status != nil { if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) @@ -1682,6 +1701,11 @@ func ValidateApproveBriefResponseBody(body *ApproveBriefResponseBody) (err error if body.Version == nil { err = goa.MergeErrors(err, goa.MissingFieldError("version", "body")) } + if body.ProgramType != nil { + if !(*body.ProgramType == "events" || *body.ProgramType == "education" || *body.ProgramType == "membership") { + err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.program_type", *body.ProgramType, []any{"events", "education", "membership"})) + } + } if body.Status != nil { if !(*body.Status == "draft" || *body.Status == "approved" || *body.Status == "archived") { err = goa.MergeErrors(err, goa.InvalidEnumValueError("body.status", *body.Status, []any{"draft", "approved", "archived"})) diff --git a/gen/http/lfx_v2_campaign_service_briefs/server/types.go b/gen/http/lfx_v2_campaign_service_briefs/server/types.go index 93e9dadf..dc45edb9 100644 --- a/gen/http/lfx_v2_campaign_service_briefs/server/types.go +++ b/gen/http/lfx_v2_campaign_service_briefs/server/types.go @@ -47,11 +47,12 @@ type CreateBriefResponseBody struct { ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` // Funnel context ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -76,11 +77,12 @@ type GetBriefResponseBody struct { ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` // Funnel context ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -105,11 +107,12 @@ type UpdateBriefResponseBody struct { ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` // Funnel context ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` @@ -134,11 +137,12 @@ type ApproveBriefResponseBody struct { ProjectID string `form:"project_id" json:"project_id" xml:"project_id"` // Funnel context ProgramType string `form:"program_type" json:"program_type" xml:"program_type"` - // Event/course slug + // Event/course slug (unique within the project) EventSlug string `form:"event_slug" json:"event_slug" xml:"event_slug"` // Event/course page URL URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string `form:"platforms,omitempty" json:"platforms,omitempty" xml:"platforms,omitempty"` // Extracted event/course details EventDetails any `form:"event_details,omitempty" json:"event_details,omitempty" xml:"event_details,omitempty"` diff --git a/gen/http/lfx_v2_campaign_service_connections/client/cli.go b/gen/http/lfx_v2_campaign_service_connections/client/cli.go index c68bc75c..d81cde18 100644 --- a/gen/http/lfx_v2_campaign_service_connections/client/cli.go +++ b/gen/http/lfx_v2_campaign_service_connections/client/cli.go @@ -24,7 +24,7 @@ func BuildCreateGoogleAdsPayload(lfxV2CampaignServiceConnectionsCreateGoogleAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8666746580\",\n \"label\": \"TLF Main\",\n \"login_customer_id\": \"9746983954\"\n },\n \"credentials\": {\n \"client_id\": \"Architecto itaque doloribus voluptatem consequatur quis fugiat.\",\n \"client_secret\": \"Recusandae qui culpa.\",\n \"developer_token\": \"Accusamus et atque enim.\",\n \"refresh_token\": \"Dolorum minus voluptatem.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -174,7 +174,7 @@ func BuildSetCredentialGoogleAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialGoogleAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Natus provident est.\",\n \"client_secret\": \"Id dolore.\",\n \"developer_token\": \"Non error.\",\n \"refresh_token\": \"Accusamus aperiam eos et architecto voluptas rerum.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Architecto itaque doloribus voluptatem consequatur quis fugiat.\",\n \"client_secret\": \"Recusandae qui culpa.\",\n \"developer_token\": \"Accusamus et atque enim.\",\n \"refresh_token\": \"Dolorum minus voluptatem.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -212,7 +212,7 @@ func BuildCreateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsCreateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Temporibus et provident maiores neque.\",\n \"org_id\": \"208777\"\n },\n \"credentials\": {\n \"access_token\": \"Illo minima eaque earum.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -276,7 +276,7 @@ func BuildUpdateLinkedinAdsPayload(lfxV2CampaignServiceConnectionsUpdateLinkedin { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Dolorum consequatur in est.\",\n \"org_id\": \"208777\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"538170226\",\n \"label\": \"Temporibus et provident maiores neque.\",\n \"org_id\": \"208777\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -363,7 +363,7 @@ func BuildSetCredentialLinkedinAdsPayload(lfxV2CampaignServiceConnectionsSetCred { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Eum est molestiae necessitatibus magni.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Illo minima eaque earum.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -400,7 +400,7 @@ func BuildCreateMetaAdsPayload(lfxV2CampaignServiceConnectionsCreateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n },\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Qui rerum est sed sed.\",\n \"label\": \"Quis quam dolor occaecati earum iusto rerum.\",\n \"page_id\": \"Cupiditate nobis.\"\n },\n \"credentials\": {\n \"access_token\": \"Enim ea.\",\n \"app_secret\": \"Quidem molestiae deleniti omnis.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -463,7 +463,7 @@ func BuildUpdateMetaAdsPayload(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Distinctio sunt aliquid harum quis nam rerum.\",\n \"label\": \"Excepturi blanditiis officiis quia quisquam.\",\n \"page_id\": \"Distinctio voluptas eius error autem est.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"act_193556282970417\",\n \"app_id\": \"Qui rerum est sed sed.\",\n \"label\": \"Quis quam dolor occaecati earum iusto rerum.\",\n \"page_id\": \"Cupiditate nobis.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -548,7 +548,7 @@ func BuildSetCredentialMetaAdsPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMetaAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Eius est rerum illo mollitia.\",\n \"app_secret\": \"Et dolor et consectetur sint error.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Enim ea.\",\n \"app_secret\": \"Quidem molestiae deleniti omnis.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -586,7 +586,7 @@ func BuildCreateRedditAdsPayload(lfxV2CampaignServiceConnectionsCreateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n },\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Laboriosam qui id enim.\"\n },\n \"credentials\": {\n \"client_id\": \"Magni repudiandae.\",\n \"client_secret\": \"Nihil corrupti repellat eius.\",\n \"refresh_token\": \"Qui nobis et delectus quam.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -650,7 +650,7 @@ func BuildUpdateRedditAdsPayload(lfxV2CampaignServiceConnectionsUpdateRedditAdsB { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Sit tempore.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"t2_gv9wtbfa\",\n \"label\": \"Laboriosam qui id enim.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -736,7 +736,7 @@ func BuildSetCredentialRedditAdsPayload(lfxV2CampaignServiceConnectionsSetCreden { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialRedditAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Magnam ut similique ea minima magnam.\",\n \"client_secret\": \"Ut quo iure.\",\n \"refresh_token\": \"Sit est dolores est et.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Magni repudiandae.\",\n \"client_secret\": \"Nihil corrupti repellat eius.\",\n \"refresh_token\": \"Qui nobis et delectus quam.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -774,7 +774,7 @@ func BuildCreateTwitterAdsPayload(lfxV2CampaignServiceConnectionsCreateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n },\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Dolorem non laudantium sunt minima repudiandae illo.\",\n \"label\": \"Labore esse.\"\n },\n \"credentials\": {\n \"access_token\": \"Deleniti placeat fuga aut saepe.\",\n \"access_token_secret\": \"Reiciendis pariatur repellat.\",\n \"consumer_key\": \"Nulla dolorum deserunt ut sit dolor.\",\n \"consumer_secret\": \"Eos nihil ipsam ex odio totam.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -838,7 +838,7 @@ func BuildUpdateTwitterAdsPayload(lfxV2CampaignServiceConnectionsUpdateTwitterAd { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Deserunt in hic dolorum facere ipsa et.\",\n \"label\": \"Repellat veniam.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"8r7gb\",\n \"funding_instrument_id\": \"Dolorem non laudantium sunt minima repudiandae illo.\",\n \"label\": \"Labore esse.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -924,7 +924,7 @@ func BuildSetCredentialTwitterAdsPayload(lfxV2CampaignServiceConnectionsSetCrede { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialTwitterAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Possimus et.\",\n \"access_token_secret\": \"Deserunt consequuntur omnis.\",\n \"consumer_key\": \"Dignissimos voluptas magni consequatur dignissimos itaque.\",\n \"consumer_secret\": \"Ut aperiam.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"access_token\": \"Deleniti placeat fuga aut saepe.\",\n \"access_token_secret\": \"Reiciendis pariatur repellat.\",\n \"consumer_key\": \"Nulla dolorum deserunt ut sit dolor.\",\n \"consumer_secret\": \"Eos nihil ipsam ex odio totam.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -962,7 +962,7 @@ func BuildCreateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsCreateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n },\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Ut necessitatibus dolor nemo.\",\n \"customer_id\": \"Nisi numquam nihil id unde.\",\n \"label\": \"Voluptatem sed illo numquam praesentium tenetur quas.\"\n },\n \"credentials\": {\n \"client_id\": \"Officiis aut fugiat optio ut.\",\n \"client_secret\": \"Et voluptas tenetur nobis facere.\",\n \"developer_token\": \"Blanditiis mollitia dolores illo nostrum magnam.\",\n \"refresh_token\": \"Quo corporis recusandae dicta quibusdam.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1027,7 +1027,7 @@ func BuildUpdateMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsUpdateMicroso { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Enim non rem error voluptas deserunt.\",\n \"customer_id\": \"Officiis aperiam quos.\",\n \"label\": \"Nihil dolores perspiciatis porro veniam distinctio.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Ut necessitatibus dolor nemo.\",\n \"customer_id\": \"Nisi numquam nihil id unde.\",\n \"label\": \"Voluptatem sed illo numquam praesentium tenetur quas.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1114,7 +1114,7 @@ func BuildSetCredentialMicrosoftAdsPayload(lfxV2CampaignServiceConnectionsSetCre { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Nisi blanditiis eveniet quasi ea.\",\n \"client_secret\": \"Ut corporis dolorum consequatur eius perferendis nobis.\",\n \"developer_token\": \"Et et itaque sunt.\",\n \"refresh_token\": \"Vel voluptate necessitatibus.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"client_id\": \"Officiis aut fugiat optio ut.\",\n \"client_secret\": \"Et voluptas tenetur nobis facere.\",\n \"developer_token\": \"Blanditiis mollitia dolores illo nostrum magnam.\",\n \"refresh_token\": \"Quo corporis recusandae dicta quibusdam.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) @@ -1151,7 +1151,7 @@ func BuildCreateHubspotPayload(lfxV2CampaignServiceConnectionsCreateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsCreateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Maxime dicta qui aut.\",\n \"brand_kit\": \"Corrupti voluptas.\",\n \"label\": \"Dolor porro inventore alias error.\",\n \"portal_id\": \"Suscipit eos nam ipsa.\",\n \"sender_email\": \"Velit et impedit facilis quaerat.\",\n \"sender_name\": \"Dolor ut velit quam omnis et dolor.\"\n },\n \"credentials\": {\n \"private_app_token\": \"Vitae vel omnis autem accusamus mollitia.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1214,7 +1214,7 @@ func BuildUpdateHubspotPayload(lfxV2CampaignServiceConnectionsUpdateHubspotBody { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsUpdateHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Voluptas aperiam.\",\n \"brand_kit\": \"Itaque fugit rerum cumque.\",\n \"label\": \"Dolores enim.\",\n \"portal_id\": \"Assumenda harum eos eveniet ut et laboriosam.\",\n \"sender_email\": \"Quos expedita voluptas qui eaque.\",\n \"sender_name\": \"Laudantium nostrum ratione id eius laborum aspernatur.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"config\": {\n \"account_id\": \"Maxime dicta qui aut.\",\n \"brand_kit\": \"Corrupti voluptas.\",\n \"label\": \"Dolor porro inventore alias error.\",\n \"portal_id\": \"Suscipit eos nam ipsa.\",\n \"sender_email\": \"Velit et impedit facilis quaerat.\",\n \"sender_name\": \"Dolor ut velit quam omnis et dolor.\"\n }\n }'") } if body.Config == nil { err = goa.MergeErrors(err, goa.MissingFieldError("config", "body")) @@ -1299,7 +1299,7 @@ func BuildSetCredentialHubspotPayload(lfxV2CampaignServiceConnectionsSetCredenti { err = json.Unmarshal([]byte(lfxV2CampaignServiceConnectionsSetCredentialHubspotBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Molestiae suscipit non iusto.\"\n }\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"credentials\": {\n \"private_app_token\": \"Vitae vel omnis autem accusamus mollitia.\"\n }\n }'") } if body.Credentials == nil { err = goa.MergeErrors(err, goa.MissingFieldError("credentials", "body")) diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 44812a60..77a41b95 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ut mollitia nihil ducimus."},"event_details":{"description":"Extracted event/course details","example":"Sunt quae et nesciunt iure quis."},"event_slug":{"type":"string","description":"Event/course slug","example":"Possimus dolores dignissimos beatae velit laudantium."},"id":{"type":"string","description":"Brief UUID","example":"Officiis beatae sed aut."},"keywords":{"description":"Keyword list","example":"Non quo necessitatibus."},"platforms":{"type":"array","items":{"type":"string","example":"Id eum aut et itaque."},"description":"Suggested default platforms","example":["Et deleniti dolores libero facilis qui.","Natus facere qui omnis et enim.","Officia dolorem odio ut beatae quia qui.","Minima illo dolores natus a sint."]},"program_type":{"type":"string","description":"Funnel context","example":"Est fugiat aut dicta libero iure culpa."},"project_id":{"type":"string","description":"Owning project","example":"Nihil est quia qui fugiat est."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Molestiae est accusantium laudantium nostrum."},"url":{"type":"string","description":"Event/course page URL","example":"Eum et aut quia beatae harum similique."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":757787044039705195,"format":"int64"}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","id":"Eos exercitationem.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"Pariatur magni atque amet omnis doloremque.","project_id":"Nihil neque quod alias ipsum.","status":"approved","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur.","version":5414041088513005988},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Ipsam ut sed natus et unde."},"event_details":{"description":"Extracted event/course details","example":"Qui impedit temporibus eveniet eos omnis cumque."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Eos sit aut."},"keywords":{"description":"Keyword list","example":"Explicabo repudiandae aut reiciendis recusandae molestias."},"platforms":{"type":"array","items":{"type":"string","example":"Esse consectetur tenetur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Aut ut sit nisi architecto.","Rerum et recusandae possimus quis.","Praesentium voluptate."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Vel inventore aliquid aut non eligendi accusamus."},"url":{"type":"string","description":"Event/course page URL","example":"Est sed corrupti sit eos labore."}},"example":{"copy":"Quasi in aut nam rerum.","event_details":"Error perferendis quae qui inventore dolorem.","event_slug":"Impedit accusamus incidunt minus veritatis enim.","keywords":"Distinctio magnam.","platforms":["Id corrupti sed quo perferendis nemo.","Quisquam nisi repellendus quos magnam aut.","Id voluptatem nihil quaerat asperiores.","Repellat vel veritatis hic rerum accusamus."],"program_type":"membership","targeting":"Architecto deserunt vero ducimus distinctio.","url":"Hic est quia pariatur odit ullam."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Fugiat aliquid aspernatur voluptatem in cupiditate."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nostrum atque illum nesciunt adipisci odit corrupti."},"id":{"type":"string","description":"Campaign UUID","example":"Architecto quae error."},"platform":{"type":"string","description":"Channel","example":"Et dolorem quod."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Iusto fugit non asperiores quidem natus."},"project_id":{"type":"string","description":"Owning project","example":"Placeat et minus et."},"status":{"type":"string","description":"Campaign status","example":"Consequatur hic voluptatem."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4612952422408203887,"format":"int64"}},"example":{"brief_id":"Consectetur occaecati earum unde ut sint.","campaign_name":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","id":"Quidem dolor ipsum.","platform":"Eum expedita non voluptas sit.","platform_campaign_id":"Ad ab quasi tempora dolor quis.","project_id":"Sed occaecati id ea sunt dolorem necessitatibus.","status":"Totam cum veniam.","version":8632050897094076248},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Ut nobis."},"platforms":{"type":"array","items":{"type":"string","example":"google-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads"],"minItems":1}},"example":{"config":"Rem aliquam animi harum.","platforms":["hubspot"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Quos amet."},"config":{"description":"Campaign configuration snapshot","example":"Quidem omnis totam eos non molestias."},"status":{"type":"string","description":"Campaign status","example":"Quia doloremque commodi rerum."}},"example":{"campaign_name":"Quia iusto maxime.","config":"Error sit nihil iure officiis nemo.","status":"Illum accusamus debitis explicabo praesentium sint."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Est omnis iusto fugiat ad et ipsa."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Veritatis mollitia.","ok":true},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero ut et neque soluta distinctio voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rem asperiores eligendi vero."},"label":{"type":"string","description":"Optional friendly name","example":"Facere quas qui aut rerum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Fugit eum."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem fugiat et."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5717670313645740058,"format":"int64"}},"example":{"account_id":"Occaecati quaerat eum quia a excepturi.","has_credentials":true,"id":"Necessitatibus voluptatem incidunt et totam esse rerum.","label":"Voluptatem incidunt cum.","login_customer_id":"Eos culpa quaerat culpa inventore aut molestiae.","project_id":"Dolorem delectus.","status":"deleted","version":4898302691270586418},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Id vel iusto optio repellendus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ad dolorem et."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Rerum eveniet nam sunt."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Hic quos inventore."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Nisi est magni odio aut.","client_secret":"Vel omnis iure.","developer_token":"Voluptatem doloremque ullam consequatur ut.","refresh_token":"Inventore impedit unde voluptatem quia ab recusandae."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Incidunt voluptas non necessitatibus."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Provident porro."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui nemo nihil dolorum consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Est ea sed sit."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Deserunt nostrum consectetur et sed praesentium libero."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui eum hic vel aspernatur at."},"sender_email":{"type":"string","description":"Default sender address","example":"Qui minima in nulla sunt autem eos."},"sender_name":{"type":"string","description":"Default sender name","example":"Provident dicta tenetur voluptatem voluptate dolor."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5710646536103854438,"format":"int64"}},"example":{"account_id":"Est quis impedit.","brand_kit":"Dolor quam dolor consectetur eos iste.","has_credentials":true,"id":"Odio sunt esse mollitia incidunt.","label":"Veritatis itaque.","portal_id":"Consequatur eligendi eum necessitatibus alias.","project_id":"Dolores laborum sed.","sender_email":"Ut aperiam voluptate voluptates.","sender_name":"Sapiente molestiae dolorum repellat expedita ut.","status":"inactive","version":6098388766312520476},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Veniam iusto consequatur quia sed officia eligendi."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Veniam delectus repellendus omnis."},"label":{"type":"string","description":"Optional friendly name","example":"Praesentium et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Qui impedit."},"sender_email":{"type":"string","description":"Default sender address","example":"Ea alias."},"sender_name":{"type":"string","description":"Default sender name","example":"Reprehenderit dignissimos aut velit quis at sint."}},"example":{"account_id":"Quo necessitatibus necessitatibus.","brand_kit":"Repudiandae tenetur aperiam saepe vel.","label":"Amet cum.","portal_id":"Sint dicta.","sender_email":"Omnis voluptatem rerum praesentium.","sender_name":"Blanditiis non totam temporibus."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Animi sit esse ratione aliquid."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Laborum est quasi dignissimos."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Quia magni aut nisi est."},"platforms":{"type":"array","items":{"type":"string","example":"Est sed."},"description":"Platforms this job will create on","example":["Dolorem necessitatibus illum.","Ex ipsa nihil esse voluptate in consectetur.","Culpa quaerat.","Sed voluptatum et impedit quod rem."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Omnis corrupti facere eum aliquid est repellat.","platforms":["Id incidunt mollitia non sed.","Minima est distinctio accusamus.","Perferendis culpa voluptatem nostrum eaque deleniti."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Ut voluptatem."},"job_id":{"type":"string","description":"Job UUID","example":"Molestias ducimus id."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Aperiam facere voluptas quis nihil.","job_id":"Vel iste aut cum voluptatem.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"partial"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Esse et labore earum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Velit ea eum perferendis qui qui."},"label":{"type":"string","description":"Optional friendly name","example":"Tempore rem quo fuga accusantium voluptas ratione."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Velit quod cumque perspiciatis."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae quae aut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7189689836865162887,"format":"int64"}},"example":{"account_id":"Tenetur veniam repellat.","has_credentials":false,"id":"Iste possimus ipsam perspiciatis enim id expedita.","label":"Doloribus at vel necessitatibus vel.","org_id":"Cumque optio impedit.","project_id":"Quia voluptatem impedit.","status":"error","version":5803043317553025654},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Aut repudiandae voluptatibus odit autem."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dicta qui.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Et earum id."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Voluptate dolorum id ut molestias id."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem aliquam voluptatibus assumenda mollitia molestias eos."},"app_id":{"type":"string","description":"Meta app ID","example":"Fugit eum et sint possimus omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsa aut."},"label":{"type":"string","description":"Optional friendly name","example":"Impedit vitae molestiae."},"page_id":{"type":"string","description":"Facebook page ID","example":"Et consequatur vel quisquam."},"project_id":{"type":"string","description":"Owning project","example":"Non assumenda molestiae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1948493999542129316,"format":"int64"}},"example":{"account_id":"Vel temporibus sunt nulla esse sed.","app_id":"Sed ea qui pariatur adipisci doloremque.","has_credentials":false,"id":"Neque hic voluptatem ad similique sunt.","label":"Ratione impedit recusandae dolor consequatur.","page_id":"Veritatis perferendis veritatis libero.","project_id":"Doloremque dicta.","status":"deleted","version":8079523500580416969},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Recusandae est perferendis eos et cumque."},"label":{"type":"string","description":"Optional friendly name","example":"Esse dolores aut."},"page_id":{"type":"string","description":"Facebook page ID","example":"Exercitationem voluptate quia esse nihil."}},"example":{"account_id":"act_193556282970417","app_id":"Laborum omnis.","label":"Esse neque maiores quo aliquam.","page_id":"Rem eveniet in autem neque."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Voluptatem possimus veniam dignissimos consequatur."},"app_secret":{"type":"string","description":"Meta app secret","example":"Delectus enim quas id porro."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Est porro eos ipsa quia.","app_secret":"Quo repudiandae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Modi esse voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quo veritatis id accusamus hic."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Veniam molestias."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur cumque rerum."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus quia velit commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2983004504871549622,"format":"int64"}},"example":{"account_id":"Inventore quisquam praesentium nihil atque et nihil.","customer_id":"Ad ex.","has_credentials":true,"id":"Officia et optio sed omnis aut voluptatem.","label":"Maxime et ea et.","project_id":"Nisi eum omnis est.","status":"inactive","version":3453857184328446715},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Atque reprehenderit."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Eligendi incidunt accusamus excepturi."},"label":{"type":"string","description":"Optional friendly name","example":"Dolore delectus ut beatae eaque."}},"example":{"account_id":"Molestiae id aut debitis iure.","customer_id":"Dolore est dolorem quod enim pariatur.","label":"Qui est ut voluptas quod minima dolor."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Occaecati veritatis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Aut architecto aliquam mollitia labore sapiente."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Quia mollitia."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Tenetur non accusamus qui ex."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ex et amet sunt.","client_secret":"Ad quae nisi.","developer_token":"Cum et ab ipsum.","refresh_token":"Reiciendis enim."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Ex et alias ea asperiores quas."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Corporis dolorem laborum maiores est ea ducimus."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Aut quo."}},"example":{"campaign_id":"Ullam ad iusto quos et est.","error":"Explicabo aliquid.","ok":false,"platform":"Dolorem dignissimos."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aut omnis itaque ut vero voluptatibus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non eos."},"label":{"type":"string","description":"Optional friendly name","example":"Enim voluptatem inventore quasi."},"project_id":{"type":"string","description":"Owning project","example":"Vel aut aliquam rerum et quidem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6330819027913820088,"format":"int64"}},"example":{"account_id":"Quibusdam repellendus qui numquam.","has_credentials":true,"id":"Voluptatibus voluptatem vero dolorem qui.","label":"Vero vel.","project_id":"Sequi non et.","status":"inactive","version":4305260724068280609},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"A voluptatem ipsa et voluptatem."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est voluptatibus placeat sint pariatur."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Explicabo expedita et velit accusamus."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Deleniti placeat rerum."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Nulla eos."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Recusandae totam soluta.","client_secret":"Praesentium libero.","refresh_token":"Qui et assumenda quas."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui sed voluptatibus quam quia."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sapiente laudantium molestiae omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quisquam animi."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae facilis blanditiis libero nam."},"project_id":{"type":"string","description":"Owning project","example":"Delectus blanditiis magnam sed iure amet."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9048631027735279786,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","funding_instrument_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Esse voluptate optio quis quae quam."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Pariatur nostrum.","label":"Odio quia omnis commodi."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Voluptas ut vero autem consequuntur optio omnis."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur omnis ut velit dolorem dolor."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Illo porro velit perferendis."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Ipsum aut voluptas molestias unde."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Mollitia nulla.","access_token_secret":"Minus voluptatem ab delectus porro.","consumer_key":"Omnis in qui.","consumer_secret":"Nihil ut."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateBriefRequestBody","required":["brief"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-BriefRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateBriefRequestBody","required":["brief"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Brief","required":["id","project_id","program_type","event_slug","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-CampaignsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","required":["input"]}}],"responses":{"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/JobCreateResponse","required":["job_id","status","platforms"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"type":"string","format":"uuid"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-CampaignRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","required":["campaign"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Campaign","required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/GoogleAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Google-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/HubspotConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-HubspotRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/LinkedinAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Linkedin-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MetaAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Meta-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/MicrosoftAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Microsoft-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/RedditAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Reddit-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads":{"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","required":false,"type":"string"},{"name":"Update-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","required":["config"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"412":{"description":"Precondition Failed response.","schema":{"$ref":"#/definitions/PreconditionFailedError","required":["code","message"]}},"428":{"description":"Precondition Required response.","schema":{"$ref":"#/definitions/PreconditionRequiredError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Create-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","required":["config","credentials"]}}],"responses":{"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TwitterAdsConnection","required":["id","project_id","account_id","has_credentials","status","version"]},"headers":{"ETag":{"description":"ETag header value (mirrors version)","type":"string"}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]},"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"},{"name":"Set-Credential-Twitter-AdsRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","required":["credentials"]}}],"responses":{"204":{"description":"No Content response."},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ConnectionTestResult","required":["ok"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"type":"string"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"type":"string","format":"uuid"},{"name":"Authorization","in":"header","description":"JWT token issued by Heimdall","required":false,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/JobPollResponse","required":["job_id","status"]}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/BadRequestError","required":["code","message"]}},"404":{"description":"Not Found response.","schema":{"$ref":"#/definitions/NotFoundError","required":["code","message"]}},"409":{"description":"Conflict response.","schema":{"$ref":"#/definitions/ConflictError","required":["code","message"]}},"500":{"description":"Internal Server Error response.","schema":{"$ref":"#/definitions/InternalServerError","required":["code","message"]}},"503":{"description":"Service Unavailable response.","schema":{"$ref":"#/definitions/ConnServiceUnavailableError","required":["code","message"]}}},"schemes":["http"],"security":[{"jwt_header_Authorization":null}]}}},"definitions":{"BadRequestError":{"title":"BadRequestError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"description":"Bad request","example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"title":"Brief","type":"object","properties":{"copy":{"description":"Ad copy","example":"Reprehenderit provident repudiandae sit."},"event_details":{"description":"Extracted event/course details","example":"Consequatur dolore dolor corporis consequatur voluptatem voluptates."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Et aspernatur."},"id":{"type":"string","description":"Brief UUID","example":"Ut modi voluptatum."},"keywords":{"description":"Keyword list","example":"Aut aut eos magnam quisquam et."},"platforms":{"type":"array","items":{"type":"string","example":"Sint voluptatibus quam dicta voluptate consequuntur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Qui temporibus quis iste eaque.","Debitis nam.","Delectus ex aut quia."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quibusdam consequuntur."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Ut sunt aliquam."},"url":{"type":"string","description":"Event/course page URL","example":"Nobis soluta odit odio praesentium perferendis."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":516504771697389432,"format":"int64"}},"example":{"copy":"Facilis qui libero.","event_details":"Et itaque rem eos et deleniti dolores.","event_slug":"Fugiat aut dicta libero.","id":"Quos est minus officiis beatae sed aut.","keywords":"Facere qui omnis.","platforms":["Laudantium error eum et aut.","Beatae harum similique corporis id eum."],"program_type":"membership","project_id":"Nihil est quia qui fugiat est.","status":"archived","targeting":"Enim vitae officia dolorem odio.","url":"Culpa est possimus dolores dignissimos.","version":667273962263484824},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"title":"BriefInput","type":"object","properties":{"copy":{"description":"Ad copy","example":"Exercitationem accusantium nihil."},"event_details":{"description":"Extracted event/course details","example":"Dolores sit."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Excepturi minima illo dolores."},"keywords":{"description":"Keyword list","example":"Quod alias ipsum voluptates pariatur magni."},"platforms":{"type":"array","items":{"type":"string","example":"Iure quis."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Mollitia nihil ducimus.","Non quo necessitatibus.","Molestiae est accusantium laudantium nostrum."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Amet omnis."},"url":{"type":"string","description":"Event/course page URL","example":"A sint quod sunt quae et."}},"example":{"copy":"Earum minus autem omnis qui debitis eum.","event_details":"Cupiditate mollitia hic vel ut.","event_slug":"Fugit dolor et natus sit cupiditate non.","keywords":"Sed veniam dolores quidem necessitatibus voluptatem.","platforms":["Esse officia explicabo dolor deserunt aspernatur.","Aspernatur illo accusamus."],"program_type":"education","targeting":"Sit reiciendis et vel beatae molestiae.","url":"Modi possimus consequatur."},"required":["program_type","event_slug"]},"Campaign":{"title":"Campaign","type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Unde hic est quia pariatur odit ullam."},"campaign_name":{"type":"string","description":"Campaign name","example":"In id voluptatem nihil quaerat."},"id":{"type":"string","description":"Campaign UUID","example":"Accusamus in quod."},"platform":{"type":"string","description":"Channel","example":"Ex id corrupti sed quo perferendis."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Ut quisquam nisi repellendus quos magnam."},"project_id":{"type":"string","description":"Owning project","example":"Accusamus incidunt minus veritatis."},"status":{"type":"string","description":"Campaign status","example":"Pariatur repellat vel."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6425243200048993167,"format":"int64"}},"example":{"brief_id":"Distinctio magnam.","campaign_name":"Sint est sed.","id":"Rerum accusamus velit error perferendis quae qui.","platform":"Architecto deserunt vero ducimus distinctio.","platform_campaign_id":"Quia magni aut nisi est.","project_id":"Dolorem deserunt quasi in aut nam rerum.","status":"Voluptas dolorem necessitatibus illum.","version":2836554557236834455},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"title":"CampaignCreateInput","type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Repudiandae aut reiciendis recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"reddit-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["reddit-ads"],"minItems":1}},"example":{"config":"Aut non.","platforms":["reddit-ads","linkedin-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"title":"CampaignUpdateInput","type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Ipsa nihil esse."},"config":{"description":"Campaign configuration snapshot","example":"Et impedit quod."},"status":{"type":"string","description":"Campaign status","example":"In consectetur et culpa quaerat vel sed."}},"example":{"campaign_name":"Magni omnis.","config":"Sit id incidunt.","status":"Facere eum aliquid est repellat assumenda."},"required":["campaign_name","status"]},"ConflictError":{"title":"ConflictError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"description":"Conflict","example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"title":"ConnServiceUnavailableError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"description":"Service unavailable","example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"title":"ConnectionTestResult","type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Dolorem laborum."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Ea ducimus ipsum dolorem dignissimos.","ok":false},"required":["ok"]},"GoogleAdsConnection":{"title":"GoogleAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Id ea."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Illum nesciunt."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas omnis quidem dolor ipsum voluptas sed."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consectetur occaecati earum unde ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Odit corrupti laudantium consequatur hic."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2949193160538820166,"format":"int64"}},"example":{"account_id":"Totam cum veniam.","has_credentials":true,"id":"Eum expedita non voluptas sit.","label":"Hic quibusdam eveniet nostrum doloribus voluptas mollitia.","login_customer_id":"Optio quia doloremque commodi rerum esse.","project_id":"Ad ab quasi tempora dolor quis.","status":"active","version":3605710116333746042},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"title":"GoogleAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"title":"GoogleAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Laudantium quia."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Maxime recusandae."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Accusamus debitis explicabo praesentium."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Omnis totam eos non."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Molestias ducimus id.","client_secret":"Eius aut quo et.","developer_token":"Ex et alias ea asperiores quas.","refresh_token":"Laudantium error sit nihil iure officiis nemo."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"title":"HubspotConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Hic magni."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Et nihil facilis sunt praesentium."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tenetur cumque rerum."},"label":{"type":"string","description":"Optional friendly name","example":"Fugit dolorum nulla quo veritatis id."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Omnis aut voluptatem voluptas nisi eum."},"project_id":{"type":"string","description":"Owning project","example":"Modi esse voluptatibus."},"sender_email":{"type":"string","description":"Default sender address","example":"Est blanditiis maxime et ea."},"sender_name":{"type":"string","description":"Default sender name","example":"Eum inventore quisquam praesentium nihil."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4901984733277471780,"format":"int64"}},"example":{"account_id":"Eligendi incidunt accusamus excepturi.","brand_kit":"Veritatis voluptatem aut architecto aliquam.","has_credentials":false,"id":"Ad ex.","label":"Atque reprehenderit.","portal_id":"Voluptas quod minima.","project_id":"Dolore delectus ut beatae eaque.","sender_email":"Qui molestiae id aut debitis iure enim.","sender_name":"Est dolorem quod enim pariatur et.","status":"inactive","version":3687898389557176015},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"title":"HubspotConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Ex doloribus quia mollitia."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Cum et ab ipsum."},"label":{"type":"string","description":"Optional friendly name","example":"Labore sapiente dolores tenetur non accusamus."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Ex et amet sunt."},"sender_email":{"type":"string","description":"Default sender address","example":"Ad quae nisi."},"sender_name":{"type":"string","description":"Default sender name","example":"Reiciendis enim."}},"example":{"account_id":"Tempora qui eum hic vel aspernatur at.","brand_kit":"Et sed praesentium libero.","label":"Qui nemo nihil dolorum consequatur.","portal_id":"Est ea sed sit.","sender_email":"Incidunt voluptas non necessitatibus.","sender_name":"Ad quis aperiam deserunt nostrum."},"required":["account_id"]},"HubspotCredentials":{"title":"HubspotCredentials","type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Qui minima in nulla sunt autem eos."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Provident dicta tenetur voluptatem voluptate dolor."},"required":["private_app_token"]},"InternalServerError":{"title":"InternalServerError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"description":"Internal server error","example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"title":"JobCreateResponse","type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Natus vitae consequatur eos sit aut ut."},"platforms":{"type":"array","items":{"type":"string","example":"Corrupti sit eos labore."},"description":"Platforms this job will create on","example":["Consectetur tenetur eum.","Aut ut sit nisi architecto.","Rerum et recusandae possimus quis."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Praesentium voluptate.","platforms":["Temporibus eveniet eos omnis cumque nemo ipsam.","Sed natus."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"title":"JobPollResponse","type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Aliquid aspernatur."},"job_id":{"type":"string","description":"Job UUID","example":"Non sed hic minima est distinctio."},"result":{"type":"array","items":{"$ref":"#/definitions/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Non asperiores quidem natus est nostrum.","job_id":"In cupiditate consequatur et dolorem quod.","result":[{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."}],"status":"queued"},"required":["job_id","status"]},"LfxV2CampaignServiceBriefsCreateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Autem veniam.","event_details":"Vel autem voluptates.","event_slug":"Et est laboriosam.","keywords":"Enim unde omnis.","platforms":["Nam exercitationem consectetur sint.","Necessitatibus ex ea ullam corrupti.","Et omnis accusantium.","Iure modi asperiores ut."],"program_type":"education","targeting":"Quam sed rem quia consequuntur ut.","url":"Facere sint totam sapiente vitae numquam ut."}},"required":["brief"]},"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody":{"title":"LfxV2CampaignServiceBriefsCreateCampaignsRequestBody","type":"object","properties":{"input":{"$ref":"#/definitions/CampaignCreateInput"}},"example":{"input":{"config":"Quia quos ut tempora consequuntur cumque repudiandae.","platforms":["microsoft-ads","microsoft-ads","linkedin-ads"]}},"required":["input"]},"LfxV2CampaignServiceBriefsUpdateBriefRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateBriefRequestBody","type":"object","properties":{"brief":{"$ref":"#/definitions/BriefInput"}},"example":{"brief":{"copy":"Autem veniam.","event_details":"Vel autem voluptates.","event_slug":"Et est laboriosam.","keywords":"Enim unde omnis.","platforms":["Nam exercitationem consectetur sint.","Necessitatibus ex ea ullam corrupti.","Et omnis accusantium.","Iure modi asperiores ut."],"program_type":"education","targeting":"Quam sed rem quia consequuntur ut.","url":"Facere sint totam sapiente vitae numquam ut."}},"required":["brief"]},"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody":{"title":"LfxV2CampaignServiceBriefsUpdateCampaignRequestBody","type":"object","properties":{"campaign":{"$ref":"#/definitions/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Eos doloribus autem corrupti sed voluptatum laborum.","config":"Perferendis qui maiores aut reiciendis.","status":"Suscipit quas sunt eos nulla."}},"required":["campaign"]},"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Architecto itaque doloribus voluptatem consequatur quis fugiat.","client_secret":"Recusandae qui culpa.","developer_token":"Accusamus et atque enim.","refresh_token":"Dolorum minus voluptatem."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"},"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"config":{"account_id":"Maxime dicta qui aut.","brand_kit":"Corrupti voluptas.","label":"Dolor porro inventore alias error.","portal_id":"Suscipit eos nam ipsa.","sender_email":"Velit et impedit facilis quaerat.","sender_name":"Dolor ut velit quam omnis et dolor."},"credentials":{"private_app_token":"Vitae vel omnis autem accusamus mollitia."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Temporibus et provident maiores neque.","org_id":"208777"},"credentials":{"access_token":"Illo minima eaque earum."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Qui rerum est sed sed.","label":"Quis quam dolor occaecati earum iusto rerum.","page_id":"Cupiditate nobis."},"credentials":{"access_token":"Enim ea.","app_secret":"Quidem molestiae deleniti omnis."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Ut necessitatibus dolor nemo.","customer_id":"Nisi numquam nihil id unde.","label":"Voluptatem sed illo numquam praesentium tenetur quas."},"credentials":{"client_id":"Officiis aut fugiat optio ut.","client_secret":"Et voluptas tenetur nobis facere.","developer_token":"Blanditiis mollitia dolores illo nostrum magnam.","refresh_token":"Quo corporis recusandae dicta quibusdam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Laboriosam qui id enim."},"credentials":{"client_id":"Magni repudiandae.","client_secret":"Nihil corrupti repellat eius.","refresh_token":"Qui nobis et delectus quam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsCreateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Dolorem non laudantium sunt minima repudiandae illo.","label":"Labore esse."},"credentials":{"access_token":"Deleniti placeat fuga aut saepe.","access_token_secret":"Reiciendis pariatur repellat.","consumer_key":"Nulla dolorum deserunt ut sit dolor.","consumer_secret":"Eos nihil ipsam ex odio totam."}},"required":["config","credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialGoogleAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Architecto itaque doloribus voluptatem consequatur quis fugiat.","client_secret":"Recusandae qui culpa.","developer_token":"Accusamus et atque enim.","refresh_token":"Dolorum minus voluptatem."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Vitae vel omnis autem accusamus mollitia."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Illo minima eaque earum."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Enim ea.","app_secret":"Quidem molestiae deleniti omnis."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/MicrosoftAdsCredentials"}},"example":{"credentials":{"client_id":"Officiis aut fugiat optio ut.","client_secret":"Et voluptas tenetur nobis facere.","developer_token":"Blanditiis mollitia dolores illo nostrum magnam.","refresh_token":"Quo corporis recusandae dicta quibusdam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magni repudiandae.","client_secret":"Nihil corrupti repellat eius.","refresh_token":"Qui nobis et delectus quam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody","type":"object","properties":{"credentials":{"$ref":"#/definitions/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Deleniti placeat fuga aut saepe.","access_token_secret":"Reiciendis pariatur repellat.","consumer_key":"Nulla dolorum deserunt ut sit dolor.","consumer_secret":"Eos nihil ipsam ex odio totam."}},"required":["credentials"]},"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateHubspotRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Maxime dicta qui aut.","brand_kit":"Corrupti voluptas.","label":"Dolor porro inventore alias error.","portal_id":"Suscipit eos nam ipsa.","sender_email":"Velit et impedit facilis quaerat.","sender_name":"Dolor ut velit quam omnis et dolor."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Temporibus et provident maiores neque.","org_id":"208777"}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMetaAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Qui rerum est sed sed.","label":"Quis quam dolor occaecati earum iusto rerum.","page_id":"Cupiditate nobis."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Ut necessitatibus dolor nemo.","customer_id":"Nisi numquam nihil id unde.","label":"Voluptatem sed illo numquam praesentium tenetur quas."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Laboriosam qui id enim."}},"required":["config"]},"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody":{"title":"LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody","type":"object","properties":{"config":{"$ref":"#/definitions/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Dolorem non laudantium sunt minima repudiandae illo.","label":"Labore esse."}},"required":["config"]},"LinkedinAdsConnection":{"title":"LinkedinAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quo vel iste aut cum voluptatem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quo ullam ad iusto quos."},"label":{"type":"string","description":"Optional friendly name","example":"Tenetur ut."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Facere voluptas quis nihil."},"project_id":{"type":"string","description":"Owning project","example":"Est placeat explicabo aliquid."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1833221466395792722,"format":"int64"}},"example":{"account_id":"Vero ut et neque soluta distinctio voluptas.","has_credentials":false,"id":"Rem asperiores eligendi vero.","label":"Facere quas qui aut rerum.","org_id":"Fugit eum.","project_id":"Voluptatem fugiat et.","status":"active","version":5717670313645740058},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"title":"LinkedinAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Necessitatibus voluptatem incidunt et totam esse rerum."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Dolorem delectus.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"title":"LinkedinAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptatem incidunt cum."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Occaecati quaerat eum quia a excepturi."},"required":["access_token"]},"MetaAdsConnection":{"title":"MetaAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ad dolorem et."},"app_id":{"type":"string","description":"Meta app ID","example":"Impedit unde voluptatem quia ab recusandae praesentium."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ut possimus quidem eos culpa quaerat."},"label":{"type":"string","description":"Optional friendly name","example":"Inventore ratione id vel iusto optio repellendus."},"page_id":{"type":"string","description":"Facebook page ID","example":"Sunt aut."},"project_id":{"type":"string","description":"Owning project","example":"Inventore aut molestiae voluptas hic."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6328500858220715511,"format":"int64"}},"example":{"account_id":"Iusto fugiat ad et.","app_id":"Ea eum.","has_credentials":true,"id":"Est magni odio aut omnis vel.","label":"Ullam consequatur ut eveniet tempore est.","page_id":"Mollitia vel.","project_id":"Iure ducimus voluptatem.","status":"error","version":6284855428062318470},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"title":"MetaAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Tempore rem quo fuga accusantium voluptas ratione."},"label":{"type":"string","description":"Optional friendly name","example":"Qui qui."},"page_id":{"type":"string","description":"Facebook page ID","example":"Repudiandae quae aut."}},"example":{"account_id":"act_193556282970417","app_id":"Perspiciatis quam iste possimus ipsam.","label":"Esse et labore earum.","page_id":"Numquam optio possimus velit quod."},"required":["account_id"]},"MetaAdsCredentials":{"title":"MetaAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Enim id."},"app_secret":{"type":"string","description":"Meta app secret","example":"Eveniet quia voluptatem impedit cumque doloribus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Vel necessitatibus vel voluptates tenetur veniam repellat.","app_secret":"Minima vitae illo cumque optio impedit."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"title":"MicrosoftAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae facilis blanditiis libero nam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quam quia possimus deserunt et quidem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et assumenda quas."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus blanditiis magnam sed iure amet."},"project_id":{"type":"string","description":"Owning project","example":"Quisquam animi."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5244135457294865936,"format":"int64"}},"example":{"account_id":"Officiis aliquid explicabo eaque ab.","customer_id":"Ea iusto eveniet velit sint odit sed.","has_credentials":true,"id":"Laudantium molestiae omnis doloremque consequuntur perspiciatis modi.","label":"Vero et atque in impedit velit omnis.","project_id":"Quae sed.","status":"inactive","version":187687687190489160},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"title":"MicrosoftAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Esse voluptate optio quis quae quam."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Odio quia omnis commodi."},"label":{"type":"string","description":"Optional friendly name","example":"Eos nemo cupiditate."}},"example":{"account_id":"Illo porro velit perferendis.","customer_id":"Ipsum aut voluptas molestias unde.","label":"Pariatur nostrum."},"required":["account_id"]},"MicrosoftAdsCredentials":{"title":"MicrosoftAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Voluptas ut vero autem consequuntur optio omnis."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Pariatur omnis ut velit dolorem dolor."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Nihil ut."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Omnis in qui."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Mollitia nulla.","client_secret":"Minus voluptatem ab delectus porro.","developer_token":"Accusamus quia velit commodi.","refresh_token":"Veniam molestias."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"title":"NotFoundError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"description":"Resource not found","example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"title":"PlatformResult","type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Nostrum quia laboriosam ut nobis."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Velit quis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Perferendis culpa voluptatem nostrum eaque deleniti."}},"example":{"campaign_id":"Architecto quae error.","error":"Placeat et minus et.","ok":true,"platform":"Aliquam animi."},"required":["platform","ok"]},"PreconditionFailedError":{"title":"PreconditionFailedError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"description":"ETag mismatch","example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"title":"PreconditionRequiredError","type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"description":"If-Match header required","example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"title":"RedditAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptate dolorum id ut molestias id."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aut repudiandae voluptatibus odit autem."},"label":{"type":"string","description":"Optional friendly name","example":"Et earum id."},"project_id":{"type":"string","description":"Owning project","example":"Dicta qui."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7470923779752943348,"format":"int64"}},"example":{"account_id":"Vitae nemo sint et consequatur vel quisquam.","has_credentials":true,"id":"Non assumenda molestiae.","label":"Autem aliquam voluptatibus assumenda mollitia molestias eos.","project_id":"Impedit vitae molestiae.","status":"error","version":3850958169697422368},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"title":"RedditAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Sint possimus."}},"example":{"account_id":"t2_gv9wtbfa","label":"Dolorem neque hic voluptatem ad similique sunt."},"required":["account_id"]},"RedditAdsCredentials":{"title":"RedditAdsCredentials","type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Doloremque dicta."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Ratione impedit recusandae dolor consequatur."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Vel temporibus sunt nulla esse sed."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Voluptatem beatae repellat veritatis perferendis veritatis.","client_secret":"Facere sed ea qui pariatur adipisci.","refresh_token":"Enim esse dolores."},"required":["client_id","client_secret","refresh_token"]},"TwitterAdsConnection":{"title":"TwitterAdsConnection","type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"In autem neque nihil laborum omnis."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dignissimos consequatur reiciendis delectus enim quas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iste exercitationem voluptate quia esse nihil sed."},"label":{"type":"string","description":"Optional friendly name","example":"Neque maiores quo aliquam in rem."},"project_id":{"type":"string","description":"Owning project","example":"Est perferendis eos et cumque nulla."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3490326709734661888,"format":"int64"}},"example":{"account_id":"Rerum et.","funding_instrument_id":"Inventore quasi officiis aut omnis itaque.","has_credentials":true,"id":"Porro eius est porro eos.","label":"Eveniet vel aut.","project_id":"Quia nihil quo repudiandae laboriosam non.","status":"inactive","version":1231088733548867560},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"title":"TwitterAdsConnectionConfig","type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Provident velit voluptatibus voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Vero voluptatibus quis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Dolores vero.","label":"Dolorem qui mollitia sequi non."},"required":["account_id"]},"TwitterAdsCredentials":{"title":"TwitterAdsCredentials","type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Et voluptatem aut est voluptatibus placeat."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Pariatur perferendis explicabo expedita et velit accusamus."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Aut quibusdam repellendus qui numquam explicabo."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quaerat minima a voluptatem."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Recusandae totam soluta.","access_token_secret":"Praesentium libero.","consumer_key":"Deleniti placeat rerum.","consumer_secret":"Nulla eos."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]}},"securityDefinitions":{"jwt_header_Authorization":{"type":"apiKey","description":"JWT issued by Heimdall; audience is this service.","name":"Authorization","in":"header"}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 816318a4..289de59c 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -3458,40 +3458,43 @@ definitions: properties: copy: description: Ad copy - example: Ut mollitia nihil ducimus. + example: Reprehenderit provident repudiandae sit. event_details: description: Extracted event/course details - example: Sunt quae et nesciunt iure quis. + example: Consequatur dolore dolor corporis consequatur voluptatem voluptates. event_slug: type: string - description: Event/course slug - example: Possimus dolores dignissimos beatae velit laudantium. + description: Event/course slug (unique within the project) + example: Et aspernatur. id: type: string description: Brief UUID - example: Officiis beatae sed aut. + example: Ut modi voluptatum. keywords: description: Keyword list - example: Non quo necessitatibus. + example: Aut aut eos magnam quisquam et. platforms: type: array items: type: string - example: Id eum aut et itaque. - description: Suggested default platforms + example: Sint voluptatibus quam dicta voluptate consequuntur. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Et deleniti dolores libero facilis qui. - - Natus facere qui omnis et enim. - - Officia dolorem odio ut beatae quia qui. - - Minima illo dolores natus a sint. + - Qui temporibus quis iste eaque. + - Debitis nam. + - Delectus ex aut quia. program_type: type: string description: Funnel context - example: Est fugiat aut dicta libero iure culpa. + example: events + enum: + - events + - education + - membership project_id: type: string description: Owning project - example: Nihil est quia qui fugiat est. + example: Molestiae quibusdam consequuntur. status: type: string description: Lifecycle status @@ -3502,31 +3505,31 @@ definitions: - archived targeting: description: Targeting recommendation - example: Molestiae est accusantium laudantium nostrum. + example: Ut sunt aliquam. url: type: string description: Event/course page URL - example: Eum et aut quia beatae harum similique. + example: Nobis soluta odit odio praesentium perferendis. version: type: integer description: Optimistic-concurrency version - example: 757787044039705195 + example: 516504771697389432 format: int64 example: - copy: Earum minus autem omnis qui debitis eum. - event_details: Cupiditate mollitia hic vel ut. - event_slug: Fugit dolor et natus sit cupiditate non. - id: Eos exercitationem. - keywords: Sed veniam dolores quidem necessitatibus voluptatem. + copy: Facilis qui libero. + event_details: Et itaque rem eos et deleniti dolores. + event_slug: Fugiat aut dicta libero. + id: Quos est minus officiis beatae sed aut. + keywords: Facere qui omnis. platforms: - - Esse officia explicabo dolor deserunt aspernatur. - - Aspernatur illo accusamus. - program_type: Pariatur magni atque amet omnis doloremque. - project_id: Nihil neque quod alias ipsum. - status: approved - targeting: Sit reiciendis et vel beatae molestiae. - url: Modi possimus consequatur. - version: 5414041088513005988 + - Laudantium error eum et aut. + - Beatae harum similique corporis id eum. + program_type: membership + project_id: Nihil est quia qui fugiat est. + status: archived + targeting: Enim vitae officia dolorem odio. + url: Culpa est possimus dolores dignissimos. + version: 667273962263484824 required: - id - project_id @@ -3540,55 +3543,53 @@ definitions: properties: copy: description: Ad copy - example: Ipsam ut sed natus et unde. + example: Exercitationem accusantium nihil. event_details: description: Extracted event/course details - example: Qui impedit temporibus eveniet eos omnis cumque. + example: Dolores sit. event_slug: type: string description: Event/course slug (unique within the project) - example: Eos sit aut. + example: Excepturi minima illo dolores. keywords: description: Keyword list - example: Explicabo repudiandae aut reiciendis recusandae molestias. + example: Quod alias ipsum voluptates pariatur magni. platforms: type: array items: type: string - example: Esse consectetur tenetur. + example: Iure quis. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Aut ut sit nisi architecto. - - Rerum et recusandae possimus quis. - - Praesentium voluptate. + - Mollitia nihil ducimus. + - Non quo necessitatibus. + - Molestiae est accusantium laudantium nostrum. program_type: type: string description: Funnel context - example: membership + example: education enum: - events - education - membership targeting: description: Targeting recommendation - example: Vel inventore aliquid aut non eligendi accusamus. + example: Amet omnis. url: type: string description: Event/course page URL - example: Est sed corrupti sit eos labore. + example: A sint quod sunt quae et. example: - copy: Quasi in aut nam rerum. - event_details: Error perferendis quae qui inventore dolorem. - event_slug: Impedit accusamus incidunt minus veritatis enim. - keywords: Distinctio magnam. + copy: Earum minus autem omnis qui debitis eum. + event_details: Cupiditate mollitia hic vel ut. + event_slug: Fugit dolor et natus sit cupiditate non. + keywords: Sed veniam dolores quidem necessitatibus voluptatem. platforms: - - Id corrupti sed quo perferendis nemo. - - Quisquam nisi repellendus quos magnam aut. - - Id voluptatem nihil quaerat asperiores. - - Repellat vel veritatis hic rerum accusamus. - program_type: membership - targeting: Architecto deserunt vero ducimus distinctio. - url: Hic est quia pariatur odit ullam. + - Esse officia explicabo dolor deserunt aspernatur. + - Aspernatur illo accusamus. + program_type: education + targeting: Sit reiciendis et vel beatae molestiae. + url: Modi possimus consequatur. required: - program_type - event_slug @@ -3599,45 +3600,45 @@ definitions: brief_id: type: string description: Parent brief - example: Fugiat aliquid aspernatur voluptatem in cupiditate. + example: Unde hic est quia pariatur odit ullam. campaign_name: type: string description: Campaign name - example: Nostrum atque illum nesciunt adipisci odit corrupti. + example: In id voluptatem nihil quaerat. id: type: string description: Campaign UUID - example: Architecto quae error. + example: Accusamus in quod. platform: type: string description: Channel - example: Et dolorem quod. + example: Ex id corrupti sed quo perferendis. platform_campaign_id: type: string description: ID returned by the ad platform - example: Iusto fugit non asperiores quidem natus. + example: Ut quisquam nisi repellendus quos magnam. project_id: type: string description: Owning project - example: Placeat et minus et. + example: Accusamus incidunt minus veritatis. status: type: string description: Campaign status - example: Consequatur hic voluptatem. + example: Pariatur repellat vel. version: type: integer description: Optimistic-concurrency version - example: 4612952422408203887 + example: 6425243200048993167 format: int64 example: - brief_id: Consectetur occaecati earum unde ut sint. - campaign_name: Hic quibusdam eveniet nostrum doloribus voluptas mollitia. - id: Quidem dolor ipsum. - platform: Eum expedita non voluptas sit. - platform_campaign_id: Ad ab quasi tempora dolor quis. - project_id: Sed occaecati id ea sunt dolorem necessitatibus. - status: Totam cum veniam. - version: 8632050897094076248 + brief_id: Distinctio magnam. + campaign_name: Sint est sed. + id: Rerum accusamus velit error perferendis quae qui. + platform: Architecto deserunt vero ducimus distinctio. + platform_campaign_id: Quia magni aut nisi est. + project_id: Dolorem deserunt quasi in aut nam rerum. + status: Voluptas dolorem necessitatibus illum. + version: 2836554557236834455 required: - id - project_id @@ -3652,12 +3653,12 @@ definitions: properties: config: description: Per-platform campaign configuration - example: Ut nobis. + example: Repudiandae aut reiciendis recusandae. platforms: type: array items: type: string - example: google-ads + example: reddit-ads enum: - google-ads - linkedin-ads @@ -3668,13 +3669,14 @@ definitions: - hubspot description: Platforms to create campaigns on (binding selection) example: - - meta-ads - - google-ads + - reddit-ads minItems: 1 example: - config: Rem aliquam animi harum. + config: Aut non. platforms: - - hubspot + - reddit-ads + - linkedin-ads + - google-ads required: - platforms CampaignUpdateInput: @@ -3684,18 +3686,18 @@ definitions: campaign_name: type: string description: Campaign name - example: Quos amet. + example: Ipsa nihil esse. config: description: Campaign configuration snapshot - example: Quidem omnis totam eos non molestias. + example: Et impedit quod. status: type: string description: Campaign status - example: Quia doloremque commodi rerum. + example: In consectetur et culpa quaerat vel sed. example: - campaign_name: Quia iusto maxime. - config: Error sit nihil iure officiis nemo. - status: Illum accusamus debitis explicabo praesentium sint. + campaign_name: Magni omnis. + config: Sit id incidunt. + status: Facere eum aliquid est repellat assumenda. required: - campaign_name - status @@ -3744,14 +3746,14 @@ definitions: message: type: string description: Human-readable detail - example: Est omnis iusto fugiat ad et ipsa. + example: Dolorem laborum. ok: type: boolean description: Whether the credential authenticated against the provider example: false example: - message: Veritatis mollitia. - ok: true + message: Ea ducimus ipsum dolorem dignissimos. + ok: false required: - ok GoogleAdsConnection: @@ -3761,7 +3763,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Vero ut et neque soluta distinctio voluptas. + example: Id ea. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3769,23 +3771,23 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Rem asperiores eligendi vero. + example: Illum nesciunt. label: type: string description: Optional friendly name - example: Facere quas qui aut rerum. + example: Voluptas omnis quidem dolor ipsum voluptas sed. login_customer_id: type: string description: Manager account used for API access - example: Fugit eum. + example: Consectetur occaecati earum unde ut sint. project_id: type: string description: Owning project - example: Voluptatem fugiat et. + example: Odit corrupti laudantium consequatur hic. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -3794,17 +3796,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 5717670313645740058 + example: 2949193160538820166 format: int64 example: - account_id: Occaecati quaerat eum quia a excepturi. + account_id: Totam cum veniam. has_credentials: true - id: Necessitatibus voluptatem incidunt et totam esse rerum. - label: Voluptatem incidunt cum. - login_customer_id: Eos culpa quaerat culpa inventore aut molestiae. - project_id: Dolorem delectus. - status: deleted - version: 4898302691270586418 + id: Eum expedita non voluptas sit. + label: Hic quibusdam eveniet nostrum doloribus voluptas mollitia. + login_customer_id: Optio quia doloremque commodi rerum esse. + project_id: Ad ab quasi tempora dolor quis. + status: active + version: 3605710116333746042 required: - id - project_id @@ -3841,25 +3843,25 @@ definitions: client_id: type: string description: OAuth client id - example: Id vel iusto optio repellendus. + example: Laudantium quia. client_secret: type: string description: OAuth client secret - example: Ad dolorem et. + example: Maxime recusandae. developer_token: type: string description: Google Ads developer token - example: Rerum eveniet nam sunt. + example: Accusamus debitis explicabo praesentium. refresh_token: type: string description: OAuth refresh token - example: Hic quos inventore. + example: Omnis totam eos non. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Nisi est magni odio aut. - client_secret: Vel omnis iure. - developer_token: Voluptatem doloremque ullam consequatur ut. - refresh_token: Inventore impedit unde voluptatem quia ab recusandae. + client_id: Molestias ducimus id. + client_secret: Eius aut quo et. + developer_token: Ex et alias ea asperiores quas. + refresh_token: Laudantium error sit nihil iure officiis nemo. required: - refresh_token - client_id @@ -3872,11 +3874,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Incidunt voluptas non necessitatibus. + example: Hic magni. brand_kit: type: string description: Per-project brand kit selector - example: Provident porro. + example: Et nihil facilis sunt praesentium. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -3884,31 +3886,31 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Qui nemo nihil dolorum consequatur. + example: Tenetur cumque rerum. label: type: string description: Optional friendly name - example: Est ea sed sit. + example: Fugit dolorum nulla quo veritatis id. portal_id: type: string description: HubSpot portal/account ID - example: Deserunt nostrum consectetur et sed praesentium libero. + example: Omnis aut voluptatem voluptas nisi eum. project_id: type: string description: Owning project - example: Tempora qui eum hic vel aspernatur at. + example: Modi esse voluptatibus. sender_email: type: string description: Default sender address - example: Qui minima in nulla sunt autem eos. + example: Est blanditiis maxime et ea. sender_name: type: string description: Default sender name - example: Provident dicta tenetur voluptatem voluptate dolor. + example: Eum inventore quisquam praesentium nihil. status: type: string description: Connection status - example: inactive + example: error enum: - active - inactive @@ -3917,20 +3919,20 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 5710646536103854438 + example: 4901984733277471780 format: int64 example: - account_id: Est quis impedit. - brand_kit: Dolor quam dolor consectetur eos iste. - has_credentials: true - id: Odio sunt esse mollitia incidunt. - label: Veritatis itaque. - portal_id: Consequatur eligendi eum necessitatibus alias. - project_id: Dolores laborum sed. - sender_email: Ut aperiam voluptate voluptates. - sender_name: Sapiente molestiae dolorum repellat expedita ut. + account_id: Eligendi incidunt accusamus excepturi. + brand_kit: Veritatis voluptatem aut architecto aliquam. + has_credentials: false + id: Ad ex. + label: Atque reprehenderit. + portal_id: Voluptas quod minima. + project_id: Dolore delectus ut beatae eaque. + sender_email: Qui molestiae id aut debitis iure enim. + sender_name: Est dolorem quod enim pariatur et. status: inactive - version: 6098388766312520476 + version: 3687898389557176015 required: - id - project_id @@ -3945,34 +3947,34 @@ definitions: account_id: type: string description: HubSpot list/audience ID - example: Veniam iusto consequatur quia sed officia eligendi. + example: Ex doloribus quia mollitia. brand_kit: type: string description: Per-project brand kit selector - example: Veniam delectus repellendus omnis. + example: Cum et ab ipsum. label: type: string description: Optional friendly name - example: Praesentium et. + example: Labore sapiente dolores tenetur non accusamus. portal_id: type: string description: HubSpot portal/account ID - example: Qui impedit. + example: Ex et amet sunt. sender_email: type: string description: Default sender address - example: Ea alias. + example: Ad quae nisi. sender_name: type: string description: Default sender name - example: Reprehenderit dignissimos aut velit quis at sint. + example: Reiciendis enim. example: - account_id: Quo necessitatibus necessitatibus. - brand_kit: Repudiandae tenetur aperiam saepe vel. - label: Amet cum. - portal_id: Sint dicta. - sender_email: Omnis voluptatem rerum praesentium. - sender_name: Blanditiis non totam temporibus. + account_id: Tempora qui eum hic vel aspernatur at. + brand_kit: Et sed praesentium libero. + label: Qui nemo nihil dolorum consequatur. + portal_id: Est ea sed sit. + sender_email: Incidunt voluptas non necessitatibus. + sender_name: Ad quis aperiam deserunt nostrum. required: - account_id HubspotCredentials: @@ -3982,10 +3984,10 @@ definitions: private_app_token: type: string description: HubSpot private app token - example: Animi sit esse ratione aliquid. + example: Qui minima in nulla sunt autem eos. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Laborum est quasi dignissimos. + private_app_token: Provident dicta tenetur voluptatem voluptate dolor. required: - private_app_token InternalServerError: @@ -4014,18 +4016,17 @@ definitions: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Quia magni aut nisi est. + example: Natus vitae consequatur eos sit aut ut. platforms: type: array items: type: string - example: Est sed. + example: Corrupti sit eos labore. description: Platforms this job will create on example: - - Dolorem necessitatibus illum. - - Ex ipsa nihil esse voluptate in consectetur. - - Culpa quaerat. - - Sed voluptatum et impedit quod rem. + - Consectetur tenetur eum. + - Aut ut sit nisi architecto. + - Rerum et recusandae possimus quis. status: type: string description: Initial status (always 'queued' on create) @@ -4033,11 +4034,10 @@ definitions: enum: - queued example: - job_id: Omnis corrupti facere eum aliquid est repellat. + job_id: Praesentium voluptate. platforms: - - Id incidunt mollitia non sed. - - Minima est distinctio accusamus. - - Perferendis culpa voluptatem nostrum eaque deleniti. + - Temporibus eveniet eos omnis cumque nemo ipsam. + - Sed natus. status: queued required: - job_id @@ -4050,33 +4050,29 @@ definitions: error: type: string description: Terminal error, if any - example: Ut voluptatem. + example: Aliquid aspernatur. job_id: type: string description: Job UUID - example: Molestias ducimus id. + example: Non sed hic minima est distinctio. result: type: array items: $ref: '#/definitions/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. status: type: string description: Job status - example: queued + example: running enum: - queued - running @@ -4084,22 +4080,26 @@ definitions: - partial - failed example: - error: Aperiam facere voluptas quis nihil. - job_id: Vel iste aut cum voluptatem. + error: Non asperiores quidem natus est nostrum. + job_id: In cupiditate consequatur et dolorem quod. result: - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - status: partial + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + status: queued required: - job_id - status @@ -4111,18 +4111,18 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Blanditiis quidem qui iusto sed. - event_details: Dolor molestias ipsa dolorum est. - event_slug: Accusantium ad. - keywords: Vel fuga recusandae. + copy: Autem veniam. + event_details: Vel autem voluptates. + event_slug: Et est laboriosam. + keywords: Enim unde omnis. platforms: - - Iste autem veniam et enim unde. - - Facere quam. - - Rem quia consequuntur ut. - - Consequatur quos atque voluptates quo sit. - program_type: membership - targeting: Nulla ut laboriosam. - url: Modi asperiores ut libero vel. + - Nam exercitationem consectetur sint. + - Necessitatibus ex ea ullam corrupti. + - Et omnis accusantium. + - Iure modi asperiores ut. + program_type: education + targeting: Quam sed rem quia consequuntur ut. + url: Facere sint totam sapiente vitae numquam ut. required: - brief LfxV2CampaignServiceBriefsCreateCampaignsRequestBody: @@ -4133,11 +4133,11 @@ definitions: $ref: '#/definitions/CampaignCreateInput' example: input: - config: Facere et exercitationem. + config: Quia quos ut tempora consequuntur cumque repudiandae. platforms: - microsoft-ads - - twitter-ads - - google-ads + - microsoft-ads + - linkedin-ads required: - input LfxV2CampaignServiceBriefsUpdateBriefRequestBody: @@ -4148,18 +4148,18 @@ definitions: $ref: '#/definitions/BriefInput' example: brief: - copy: Blanditiis quidem qui iusto sed. - event_details: Dolor molestias ipsa dolorum est. - event_slug: Accusantium ad. - keywords: Vel fuga recusandae. + copy: Autem veniam. + event_details: Vel autem voluptates. + event_slug: Et est laboriosam. + keywords: Enim unde omnis. platforms: - - Iste autem veniam et enim unde. - - Facere quam. - - Rem quia consequuntur ut. - - Consequatur quos atque voluptates quo sit. - program_type: membership - targeting: Nulla ut laboriosam. - url: Modi asperiores ut libero vel. + - Nam exercitationem consectetur sint. + - Necessitatibus ex ea ullam corrupti. + - Et omnis accusantium. + - Iure modi asperiores ut. + program_type: education + targeting: Quam sed rem quia consequuntur ut. + url: Facere sint totam sapiente vitae numquam ut. required: - brief LfxV2CampaignServiceBriefsUpdateCampaignRequestBody: @@ -4170,9 +4170,9 @@ definitions: $ref: '#/definitions/CampaignUpdateInput' example: campaign: - campaign_name: Ad voluptatem. - config: Et expedita itaque quos. - status: Tempore impedit. + campaign_name: Eos doloribus autem corrupti sed voluptatum laborum. + config: Perferendis qui maiores aut reiciendis. + status: Suscipit quas sunt eos nulla. required: - campaign LfxV2CampaignServiceConnectionsCreateGoogleAdsRequestBody: @@ -4189,10 +4189,10 @@ definitions: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Natus provident est. - client_secret: Id dolore. - developer_token: Non error. - refresh_token: Accusamus aperiam eos et architecto voluptas rerum. + client_id: Architecto itaque doloribus voluptatem consequatur quis fugiat. + client_secret: Recusandae qui culpa. + developer_token: Accusamus et atque enim. + refresh_token: Dolorum minus voluptatem. required: - config - credentials @@ -4206,14 +4206,14 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: config: - account_id: Voluptas aperiam. - brand_kit: Itaque fugit rerum cumque. - label: Dolores enim. - portal_id: Assumenda harum eos eveniet ut et laboriosam. - sender_email: Quos expedita voluptas qui eaque. - sender_name: Laudantium nostrum ratione id eius laborum aspernatur. + account_id: Maxime dicta qui aut. + brand_kit: Corrupti voluptas. + label: Dolor porro inventore alias error. + portal_id: Suscipit eos nam ipsa. + sender_email: Velit et impedit facilis quaerat. + sender_name: Dolor ut velit quam omnis et dolor. credentials: - private_app_token: Molestiae suscipit non iusto. + private_app_token: Vitae vel omnis autem accusamus mollitia. required: - config - credentials @@ -4228,10 +4228,10 @@ definitions: example: config: account_id: "538170226" - label: Dolorum consequatur in est. + label: Temporibus et provident maiores neque. org_id: "208777" credentials: - access_token: Eum est molestiae necessitatibus magni. + access_token: Illo minima eaque earum. required: - config - credentials @@ -4246,12 +4246,12 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Distinctio sunt aliquid harum quis nam rerum. - label: Excepturi blanditiis officiis quia quisquam. - page_id: Distinctio voluptas eius error autem est. + app_id: Qui rerum est sed sed. + label: Quis quam dolor occaecati earum iusto rerum. + page_id: Cupiditate nobis. credentials: - access_token: Eius est rerum illo mollitia. - app_secret: Et dolor et consectetur sint error. + access_token: Enim ea. + app_secret: Quidem molestiae deleniti omnis. required: - config - credentials @@ -4265,14 +4265,14 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: config: - account_id: Enim non rem error voluptas deserunt. - customer_id: Officiis aperiam quos. - label: Nihil dolores perspiciatis porro veniam distinctio. + account_id: Ut necessitatibus dolor nemo. + customer_id: Nisi numquam nihil id unde. + label: Voluptatem sed illo numquam praesentium tenetur quas. credentials: - client_id: Nisi blanditiis eveniet quasi ea. - client_secret: Ut corporis dolorum consequatur eius perferendis nobis. - developer_token: Et et itaque sunt. - refresh_token: Vel voluptate necessitatibus. + client_id: Officiis aut fugiat optio ut. + client_secret: Et voluptas tenetur nobis facere. + developer_token: Blanditiis mollitia dolores illo nostrum magnam. + refresh_token: Quo corporis recusandae dicta quibusdam. required: - config - credentials @@ -4287,11 +4287,11 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Sit tempore. + label: Laboriosam qui id enim. credentials: - client_id: Magnam ut similique ea minima magnam. - client_secret: Ut quo iure. - refresh_token: Sit est dolores est et. + client_id: Magni repudiandae. + client_secret: Nihil corrupti repellat eius. + refresh_token: Qui nobis et delectus quam. required: - config - credentials @@ -4306,13 +4306,13 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Deserunt in hic dolorum facere ipsa et. - label: Repellat veniam. + funding_instrument_id: Dolorem non laudantium sunt minima repudiandae illo. + label: Labore esse. credentials: - access_token: Possimus et. - access_token_secret: Deserunt consequuntur omnis. - consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. - consumer_secret: Ut aperiam. + access_token: Deleniti placeat fuga aut saepe. + access_token_secret: Reiciendis pariatur repellat. + consumer_key: Nulla dolorum deserunt ut sit dolor. + consumer_secret: Eos nihil ipsam ex odio totam. required: - config - credentials @@ -4324,10 +4324,10 @@ definitions: $ref: '#/definitions/GoogleAdsCredentials' example: credentials: - client_id: Natus provident est. - client_secret: Id dolore. - developer_token: Non error. - refresh_token: Accusamus aperiam eos et architecto voluptas rerum. + client_id: Architecto itaque doloribus voluptatem consequatur quis fugiat. + client_secret: Recusandae qui culpa. + developer_token: Accusamus et atque enim. + refresh_token: Dolorum minus voluptatem. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialHubspotRequestBody: @@ -4338,7 +4338,7 @@ definitions: $ref: '#/definitions/HubspotCredentials' example: credentials: - private_app_token: Molestiae suscipit non iusto. + private_app_token: Vitae vel omnis autem accusamus mollitia. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialLinkedinAdsRequestBody: @@ -4349,7 +4349,7 @@ definitions: $ref: '#/definitions/LinkedinAdsCredentials' example: credentials: - access_token: Eum est molestiae necessitatibus magni. + access_token: Illo minima eaque earum. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMetaAdsRequestBody: @@ -4360,8 +4360,8 @@ definitions: $ref: '#/definitions/MetaAdsCredentials' example: credentials: - access_token: Eius est rerum illo mollitia. - app_secret: Et dolor et consectetur sint error. + access_token: Enim ea. + app_secret: Quidem molestiae deleniti omnis. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialMicrosoftAdsRequestBody: @@ -4372,10 +4372,10 @@ definitions: $ref: '#/definitions/MicrosoftAdsCredentials' example: credentials: - client_id: Nisi blanditiis eveniet quasi ea. - client_secret: Ut corporis dolorum consequatur eius perferendis nobis. - developer_token: Et et itaque sunt. - refresh_token: Vel voluptate necessitatibus. + client_id: Officiis aut fugiat optio ut. + client_secret: Et voluptas tenetur nobis facere. + developer_token: Blanditiis mollitia dolores illo nostrum magnam. + refresh_token: Quo corporis recusandae dicta quibusdam. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialRedditAdsRequestBody: @@ -4386,9 +4386,9 @@ definitions: $ref: '#/definitions/RedditAdsCredentials' example: credentials: - client_id: Magnam ut similique ea minima magnam. - client_secret: Ut quo iure. - refresh_token: Sit est dolores est et. + client_id: Magni repudiandae. + client_secret: Nihil corrupti repellat eius. + refresh_token: Qui nobis et delectus quam. required: - credentials LfxV2CampaignServiceConnectionsSetCredentialTwitterAdsRequestBody: @@ -4399,10 +4399,10 @@ definitions: $ref: '#/definitions/TwitterAdsCredentials' example: credentials: - access_token: Possimus et. - access_token_secret: Deserunt consequuntur omnis. - consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. - consumer_secret: Ut aperiam. + access_token: Deleniti placeat fuga aut saepe. + access_token_secret: Reiciendis pariatur repellat. + consumer_key: Nulla dolorum deserunt ut sit dolor. + consumer_secret: Eos nihil ipsam ex odio totam. required: - credentials LfxV2CampaignServiceConnectionsUpdateGoogleAdsRequestBody: @@ -4426,12 +4426,12 @@ definitions: $ref: '#/definitions/HubspotConnectionConfig' example: config: - account_id: Voluptas aperiam. - brand_kit: Itaque fugit rerum cumque. - label: Dolores enim. - portal_id: Assumenda harum eos eveniet ut et laboriosam. - sender_email: Quos expedita voluptas qui eaque. - sender_name: Laudantium nostrum ratione id eius laborum aspernatur. + account_id: Maxime dicta qui aut. + brand_kit: Corrupti voluptas. + label: Dolor porro inventore alias error. + portal_id: Suscipit eos nam ipsa. + sender_email: Velit et impedit facilis quaerat. + sender_name: Dolor ut velit quam omnis et dolor. required: - config LfxV2CampaignServiceConnectionsUpdateLinkedinAdsRequestBody: @@ -4443,7 +4443,7 @@ definitions: example: config: account_id: "538170226" - label: Dolorum consequatur in est. + label: Temporibus et provident maiores neque. org_id: "208777" required: - config @@ -4456,9 +4456,9 @@ definitions: example: config: account_id: act_193556282970417 - app_id: Distinctio sunt aliquid harum quis nam rerum. - label: Excepturi blanditiis officiis quia quisquam. - page_id: Distinctio voluptas eius error autem est. + app_id: Qui rerum est sed sed. + label: Quis quam dolor occaecati earum iusto rerum. + page_id: Cupiditate nobis. required: - config LfxV2CampaignServiceConnectionsUpdateMicrosoftAdsRequestBody: @@ -4469,9 +4469,9 @@ definitions: $ref: '#/definitions/MicrosoftAdsConnectionConfig' example: config: - account_id: Enim non rem error voluptas deserunt. - customer_id: Officiis aperiam quos. - label: Nihil dolores perspiciatis porro veniam distinctio. + account_id: Ut necessitatibus dolor nemo. + customer_id: Nisi numquam nihil id unde. + label: Voluptatem sed illo numquam praesentium tenetur quas. required: - config LfxV2CampaignServiceConnectionsUpdateRedditAdsRequestBody: @@ -4483,7 +4483,7 @@ definitions: example: config: account_id: t2_gv9wtbfa - label: Sit tempore. + label: Laboriosam qui id enim. required: - config LfxV2CampaignServiceConnectionsUpdateTwitterAdsRequestBody: @@ -4495,8 +4495,8 @@ definitions: example: config: account_id: 8r7gb - funding_instrument_id: Deserunt in hic dolorum facere ipsa et. - label: Repellat veniam. + funding_instrument_id: Dolorem non laudantium sunt minima repudiandae illo. + label: Labore esse. required: - config LinkedinAdsConnection: @@ -4506,7 +4506,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Esse et labore earum. + example: Quo vel iste aut cum voluptatem. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4514,19 +4514,19 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Velit ea eum perferendis qui qui. + example: Quo ullam ad iusto quos. label: type: string description: Optional friendly name - example: Tempore rem quo fuga accusantium voluptas ratione. + example: Tenetur ut. org_id: type: string description: LinkedIn organization URN id - example: Velit quod cumque perspiciatis. + example: Facere voluptas quis nihil. project_id: type: string description: Owning project - example: Repudiandae quae aut. + example: Est placeat explicabo aliquid. status: type: string description: Connection status @@ -4539,17 +4539,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 7189689836865162887 + example: 1833221466395792722 format: int64 example: - account_id: Tenetur veniam repellat. + account_id: Vero ut et neque soluta distinctio voluptas. has_credentials: false - id: Iste possimus ipsam perspiciatis enim id expedita. - label: Doloribus at vel necessitatibus vel. - org_id: Cumque optio impedit. - project_id: Quia voluptatem impedit. - status: error - version: 5803043317553025654 + id: Rem asperiores eligendi vero. + label: Facere quas qui aut rerum. + org_id: Fugit eum. + project_id: Voluptatem fugiat et. + status: active + version: 5717670313645740058 required: - id - project_id @@ -4568,14 +4568,14 @@ definitions: label: type: string description: Optional friendly name - example: Aut repudiandae voluptatibus odit autem. + example: Necessitatibus voluptatem incidunt et totam esse rerum. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Dicta qui. + label: Dolorem delectus. org_id: "208777" required: - account_id @@ -4587,10 +4587,10 @@ definitions: access_token: type: string description: OAuth access token - example: Et earum id. + example: Voluptatem incidunt cum. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Voluptate dolorum id ut molestias id. + access_token: Occaecati quaerat eum quia a excepturi. required: - access_token MetaAdsConnection: @@ -4600,35 +4600,35 @@ definitions: account_id: type: string description: Provider account identifier - example: Autem aliquam voluptatibus assumenda mollitia molestias eos. + example: Ad dolorem et. app_id: type: string description: Meta app ID - example: Fugit eum et sint possimus omnis. + example: Impedit unde voluptatem quia ab recusandae praesentium. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Ipsa aut. + example: Ut possimus quidem eos culpa quaerat. label: type: string description: Optional friendly name - example: Impedit vitae molestiae. + example: Inventore ratione id vel iusto optio repellendus. page_id: type: string description: Facebook page ID - example: Et consequatur vel quisquam. + example: Sunt aut. project_id: type: string description: Owning project - example: Non assumenda molestiae. + example: Inventore aut molestiae voluptas hic. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -4637,18 +4637,18 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 1948493999542129316 + example: 6328500858220715511 format: int64 example: - account_id: Vel temporibus sunt nulla esse sed. - app_id: Sed ea qui pariatur adipisci doloremque. - has_credentials: false - id: Neque hic voluptatem ad similique sunt. - label: Ratione impedit recusandae dolor consequatur. - page_id: Veritatis perferendis veritatis libero. - project_id: Doloremque dicta. - status: deleted - version: 8079523500580416969 + account_id: Iusto fugiat ad et. + app_id: Ea eum. + has_credentials: true + id: Est magni odio aut omnis vel. + label: Ullam consequatur ut eveniet tempore est. + page_id: Mollitia vel. + project_id: Iure ducimus voluptatem. + status: error + version: 6284855428062318470 required: - id - project_id @@ -4667,20 +4667,20 @@ definitions: app_id: type: string description: Meta app ID - example: Recusandae est perferendis eos et cumque. + example: Tempore rem quo fuga accusantium voluptas ratione. label: type: string description: Optional friendly name - example: Esse dolores aut. + example: Qui qui. page_id: type: string description: Facebook page ID - example: Exercitationem voluptate quia esse nihil. + example: Repudiandae quae aut. example: account_id: act_193556282970417 - app_id: Laborum omnis. - label: Esse neque maiores quo aliquam. - page_id: Rem eveniet in autem neque. + app_id: Perspiciatis quam iste possimus ipsam. + label: Esse et labore earum. + page_id: Numquam optio possimus velit quod. required: - account_id MetaAdsCredentials: @@ -4690,15 +4690,15 @@ definitions: access_token: type: string description: Meta access token - example: Voluptatem possimus veniam dignissimos consequatur. + example: Enim id. app_secret: type: string description: Meta app secret - example: Delectus enim quas id porro. + example: Eveniet quia voluptatem impedit cumque doloribus. description: Meta Ads credential. Write-only; never returned. example: - access_token: Est porro eos ipsa quia. - app_secret: Quo repudiandae. + access_token: Vel necessitatibus vel voluptates tenetur veniam repellat. + app_secret: Minima vitae illo cumque optio impedit. required: - access_token - app_secret @@ -4709,11 +4709,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Modi esse voluptatibus. + example: Repudiandae facilis blanditiis libero nam. customer_id: type: string description: Microsoft Advertising customer ID - example: Quo veritatis id accusamus hic. + example: Quam quia possimus deserunt et quidem. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4721,19 +4721,19 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Veniam molestias. + example: Qui et assumenda quas. label: type: string description: Optional friendly name - example: Tenetur cumque rerum. + example: Delectus blanditiis magnam sed iure amet. project_id: type: string description: Owning project - example: Accusamus quia velit commodi. + example: Quisquam animi. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -4742,17 +4742,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 2983004504871549622 + example: 5244135457294865936 format: int64 example: - account_id: Inventore quisquam praesentium nihil atque et nihil. - customer_id: Ad ex. + account_id: Officiis aliquid explicabo eaque ab. + customer_id: Ea iusto eveniet velit sint odit sed. has_credentials: true - id: Officia et optio sed omnis aut voluptatem. - label: Maxime et ea et. - project_id: Nisi eum omnis est. + id: Laudantium molestiae omnis doloremque consequuntur perspiciatis modi. + label: Vero et atque in impedit velit omnis. + project_id: Quae sed. status: inactive - version: 3453857184328446715 + version: 187687687190489160 required: - id - project_id @@ -4767,19 +4767,19 @@ definitions: account_id: type: string description: Microsoft Advertising account ID - example: Atque reprehenderit. + example: Esse voluptate optio quis quae quam. customer_id: type: string description: Microsoft Advertising customer ID - example: Eligendi incidunt accusamus excepturi. + example: Odio quia omnis commodi. label: type: string description: Optional friendly name - example: Dolore delectus ut beatae eaque. + example: Eos nemo cupiditate. example: - account_id: Molestiae id aut debitis iure. - customer_id: Dolore est dolorem quod enim pariatur. - label: Qui est ut voluptas quod minima dolor. + account_id: Illo porro velit perferendis. + customer_id: Ipsum aut voluptas molestias unde. + label: Pariatur nostrum. required: - account_id MicrosoftAdsCredentials: @@ -4789,25 +4789,25 @@ definitions: client_id: type: string description: OAuth client id - example: Occaecati veritatis. + example: Voluptas ut vero autem consequuntur optio omnis. client_secret: type: string description: OAuth client secret - example: Aut architecto aliquam mollitia labore sapiente. + example: Pariatur omnis ut velit dolorem dolor. developer_token: type: string description: Microsoft Advertising developer token - example: Quia mollitia. + example: Nihil ut. refresh_token: type: string description: OAuth refresh token - example: Tenetur non accusamus qui ex. + example: Omnis in qui. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Ex et amet sunt. - client_secret: Ad quae nisi. - developer_token: Cum et ab ipsum. - refresh_token: Reiciendis enim. + client_id: Mollitia nulla. + client_secret: Minus voluptatem ab delectus porro. + developer_token: Accusamus quia velit commodi. + refresh_token: Veniam molestias. required: - client_id - client_secret @@ -4839,11 +4839,11 @@ definitions: campaign_id: type: string description: Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost. - example: Ex et alias ea asperiores quas. + example: Nostrum quia laboriosam ut nobis. error: type: string description: Failure reason (present when not ok) - example: Corporis dolorem laborum maiores est ea ducimus. + example: Velit quis. ok: type: boolean description: Whether the campaign was created (or reused) successfully @@ -4851,12 +4851,12 @@ definitions: platform: type: string description: Platform this result is for - example: Aut quo. + example: Perferendis culpa voluptatem nostrum eaque deleniti. example: - campaign_id: Ullam ad iusto quos et est. - error: Explicabo aliquid. - ok: false - platform: Dolorem dignissimos. + campaign_id: Architecto quae error. + error: Placeat et minus et. + ok: true + platform: Aliquam animi. required: - platform - ok @@ -4905,7 +4905,7 @@ definitions: account_id: type: string description: Provider account identifier - example: Aut omnis itaque ut vero voluptatibus. + example: Voluptate dolorum id ut molestias id. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -4913,19 +4913,19 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Non eos. + example: Aut repudiandae voluptatibus odit autem. label: type: string description: Optional friendly name - example: Enim voluptatem inventore quasi. + example: Et earum id. project_id: type: string description: Owning project - example: Vel aut aliquam rerum et quidem. + example: Dicta qui. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -4934,16 +4934,16 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 6330819027913820088 + example: 7470923779752943348 format: int64 example: - account_id: Quibusdam repellendus qui numquam. + account_id: Vitae nemo sint et consequatur vel quisquam. has_credentials: true - id: Voluptatibus voluptatem vero dolorem qui. - label: Vero vel. - project_id: Sequi non et. - status: inactive - version: 4305260724068280609 + id: Non assumenda molestiae. + label: Autem aliquam voluptatibus assumenda mollitia molestias eos. + project_id: Impedit vitae molestiae. + status: error + version: 3850958169697422368 required: - id - project_id @@ -4962,10 +4962,10 @@ definitions: label: type: string description: Optional friendly name - example: A voluptatem ipsa et voluptatem. + example: Sint possimus. example: account_id: t2_gv9wtbfa - label: Est voluptatibus placeat sint pariatur. + label: Dolorem neque hic voluptatem ad similique sunt. required: - account_id RedditAdsCredentials: @@ -4975,20 +4975,20 @@ definitions: client_id: type: string description: OAuth client id - example: Explicabo expedita et velit accusamus. + example: Doloremque dicta. client_secret: type: string description: OAuth client secret - example: Deleniti placeat rerum. + example: Ratione impedit recusandae dolor consequatur. refresh_token: type: string description: OAuth refresh token - example: Nulla eos. + example: Vel temporibus sunt nulla esse sed. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Recusandae totam soluta. - client_secret: Praesentium libero. - refresh_token: Qui et assumenda quas. + client_id: Voluptatem beatae repellat veritatis perferendis veritatis. + client_secret: Facere sed ea qui pariatur adipisci. + refresh_token: Enim esse dolores. required: - client_id - client_secret @@ -5000,11 +5000,11 @@ definitions: account_id: type: string description: Provider account identifier - example: Qui sed voluptatibus quam quia. + example: In autem neque nihil laborum omnis. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Sapiente laudantium molestiae omnis. + example: Dignissimos consequatur reiciendis delectus enim quas. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5012,19 +5012,19 @@ definitions: id: type: string description: Service-generated connection UUID (not used in paths) - example: Quisquam animi. + example: Iste exercitationem voluptate quia esse nihil sed. label: type: string description: Optional friendly name - example: Repudiandae facilis blanditiis libero nam. + example: Neque maiores quo aliquam in rem. project_id: type: string description: Owning project - example: Delectus blanditiis magnam sed iure amet. + example: Est perferendis eos et cumque nulla. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -5033,17 +5033,17 @@ definitions: version: type: integer description: Optimistic-concurrency version - example: 9048631027735279786 + example: 3490326709734661888 format: int64 example: - account_id: Officiis aliquid explicabo eaque ab. - funding_instrument_id: Ea iusto eveniet velit sint odit sed. + account_id: Rerum et. + funding_instrument_id: Inventore quasi officiis aut omnis itaque. has_credentials: true - id: Consequuntur perspiciatis modi. - label: Vero et atque in impedit velit omnis. - project_id: Quae sed. + id: Porro eius est porro eos. + label: Eveniet vel aut. + project_id: Quia nihil quo repudiandae laboriosam non. status: inactive - version: 187687687190489160 + version: 1231088733548867560 required: - id - project_id @@ -5062,15 +5062,15 @@ definitions: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Esse voluptate optio quis quae quam. + example: Provident velit voluptatibus voluptatem. label: type: string description: Optional friendly name - example: Eos nemo cupiditate. + example: Vero voluptatibus quis. example: account_id: 8r7gb - funding_instrument_id: Pariatur nostrum. - label: Odio quia omnis commodi. + funding_instrument_id: Dolores vero. + label: Dolorem qui mollitia sequi non. required: - account_id TwitterAdsCredentials: @@ -5080,25 +5080,25 @@ definitions: access_token: type: string description: OAuth 1.0a access token - example: Voluptas ut vero autem consequuntur optio omnis. + example: Et voluptatem aut est voluptatibus placeat. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Pariatur omnis ut velit dolorem dolor. + example: Pariatur perferendis explicabo expedita et velit accusamus. consumer_key: type: string description: OAuth 1.0a consumer key - example: Illo porro velit perferendis. + example: Aut quibusdam repellendus qui numquam explicabo. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Ipsum aut voluptas molestias unde. + example: Quaerat minima a voluptatem. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Mollitia nulla. - access_token_secret: Minus voluptatem ab delectus porro. - consumer_key: Omnis in qui. - consumer_secret: Nihil ut. + access_token: Recusandae totam soluta. + access_token_secret: Praesentium libero. + consumer_key: Deleniti placeat rerum. + consumer_secret: Nulla eos. required: - consumer_key - consumer_secret diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index e9c5187f..1ad9d842 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquid qui omnis et."},"example":"Asperiores recusandae deserunt ratione eius culpa sit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Magni et rerum sed voluptatum.","event_details":"Enim est occaecati sed non dolorem distinctio.","event_slug":"Aperiam eum.","id":"Omnis suscipit corrupti reiciendis.","keywords":"Aut ratione sunt nostrum tenetur.","platforms":["Dolorum aut distinctio vel.","Veniam velit sequi sit impedit dolorum voluptas.","Ipsum quaerat delectus cupiditate sit et."],"program_type":"Beatae soluta molestiae nihil quia omnis.","project_id":"Perspiciatis saepe consequatur doloribus sequi et.","status":"draft","targeting":"Dolorem cum.","url":"Quam et voluptatibus illum dolorem.","version":1135469282733514180}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"b6261fa8-da85-4670-81bb-f0aa10d65871","format":"uuid"},"example":"4d147ddb-fca6-489e-a2a8-78921eadc560"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"52099480-3594-4323-92b0-9a8e5a8fedcc","format":"uuid"},"example":"6d67841a-f263-4343-acd9-5ea22a27e47d"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Libero repudiandae aliquid ex."},"example":"Eveniet suscipit odio ratione."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Dolores commodi aperiam voluptatibus.","event_details":"Omnis quidem est non tenetur dolore.","event_slug":"Distinctio ipsa nihil ad hic repellendus nobis.","id":"Harum et minus voluptas.","keywords":"Cupiditate voluptatem.","platforms":["Cupiditate aliquam vel blanditiis sunt ut.","Aperiam quo sint dolorum vel molestiae."],"program_type":"Porro ab id necessitatibus consequatur natus tempora.","project_id":"Debitis labore aut.","status":"approved","targeting":"Et corporis officia sint.","url":"Accusamus vero et voluptas accusamus sunt.","version":1623908575818221398}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"7b75bd11-b6e0-441e-99e4-25f506ecfdd1","format":"uuid"},"example":"913052d6-1036-4a14-9f9a-107c3b258bb8"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ut aperiam eveniet nihil qui ea."},"example":"Id aut praesentium maiores unde quo culpa."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Doloremque et qui perferendis.","event_details":"Fugit voluptas molestias architecto dicta quidem illo.","event_slug":"Sapiente et et itaque dolores in.","id":"Provident quia laboriosam magnam unde.","keywords":"Quia aut sed fugiat adipisci eos rerum.","platforms":["Nihil explicabo vero.","Est qui asperiores velit enim.","Expedita ut minus ut est recusandae aspernatur."],"program_type":"Rerum et.","project_id":"Et sed nobis blanditiis.","status":"approved","targeting":"Ipsam temporibus sint et necessitatibus dolorem ut.","url":"Rem dolores eligendi ea.","version":6226287149251328788}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"25175f34-92c0-434d-a72f-1a9c500ccdda","format":"uuid"},"example":"78a49884-958d-4ef7-99b9-e60dab3c1338"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui inventore."},"example":"Sunt cum ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Similique odio adipisci dolore iste.","event_details":"Error laudantium.","event_slug":"Dolorem autem ipsa autem provident est.","id":"Pariatur voluptas odit fuga illo.","keywords":"Error necessitatibus et autem doloribus est.","platforms":["Et odio tenetur optio in ut sint.","Iste eveniet laudantium rerum.","Veritatis excepturi veniam maxime incidunt asperiores voluptatem.","Nostrum dolorum iure eaque animi."],"program_type":"Numquam quia.","project_id":"Sit ex commodi sapiente a illum.","status":"archived","targeting":"Maxime labore illo maxime provident.","url":"Quo culpa.","version":8076581276173981715}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"d76e3514-7f04-404b-85c1-c9dd589109e7","format":"uuid"},"example":"cc88b92c-5d67-435b-9340-3a62f5a9bab0"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Et magni adipisci magnam veniam.","platforms":["Odio et corporis.","Dolorem sapiente.","Aut natus."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"23c306fc-2672-44e3-a360-393f7d48f1dd","format":"uuid"},"example":"6e627787-92a4-43ee-8c98-6b97ec8af1e5"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"f41342df-fae6-4961-b9b7-6a3dde13126b","format":"uuid"},"example":"dd6598b8-8da5-472a-bcbb-2d8f068036bc"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Debitis quis quidem quam corrupti."},"example":"Voluptatem labore excepturi quibusdam iure."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Ex voluptas aspernatur aperiam voluptates aliquam.","campaign_name":"Eaque ipsam harum nisi nobis et et.","id":"Explicabo est totam qui praesentium ipsam.","platform":"Ducimus neque.","platform_campaign_id":"Aut perferendis natus.","project_id":"Cum ipsum recusandae est adipisci ullam.","status":"Excepturi corporis ut.","version":9153915624091824945}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"8a332b11-4d31-48bf-8c47-17384ebd6445","format":"uuid"},"example":"05ce6f1f-49a7-45ce-9c2c-c1a771a99cab"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"66025a18-b20e-4a9f-b7ee-db46d0219499","format":"uuid"},"example":"d0f0d2ab-d9dd-445b-bce5-1c29e2186349"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestiae qui nihil."},"example":"Ut facere magni qui veniam architecto."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Et aut consequatur inventore enim reiciendis.","campaign_name":"Ut mollitia accusantium dignissimos.","id":"Ullam omnis autem.","platform":"Neque ut rerum facilis quia molestiae ratione.","platform_campaign_id":"Fugit provident officia officiis.","project_id":"Id laboriosam nihil ea.","status":"Consequatur qui molestiae velit ratione nesciunt et.","version":476544424691753105}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus voluptatem rerum et dolorum."},"example":"Quasi vel sint nisi laborum laboriosam assumenda."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Minima eaque earum.","has_credentials":true,"id":"Excepturi deleniti voluptas aperiam vel.","label":"Id temporibus et provident maiores neque quis.","login_customer_id":"Assumenda ipsa dolor.","project_id":"Laudantium amet veritatis rerum itaque consequatur laboriosam.","status":"active","version":8240960881778207137}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro eaque dolorem."},"example":"Sunt dolorum possimus eum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"Nobis ut asperiores quo aut.","has_credentials":true,"id":"Nihil quae porro.","label":"Nulla officia vitae perspiciatis eveniet.","login_customer_id":"Dicta voluptate aut in.","project_id":"Rem autem quae.","status":"error","version":7743336992980724195}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et non et."},"example":"Delectus vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Quidem odio ab accusantium aut est deleniti.","has_credentials":true,"id":"Odio incidunt distinctio sint.","label":"Qui enim cumque saepe.","login_customer_id":"Praesentium voluptatibus deserunt aliquam necessitatibus eos.","project_id":"Aperiam quis quis reprehenderit non quae.","status":"active","version":5525678772225743935}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Eligendi et.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatum explicabo vero repudiandae temporibus ut."},"example":"Est hic enim similique et eveniet vel."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"In ipsa tempore incidunt velit provident perspiciatis.","brand_kit":"Aspernatur voluptatem nobis.","has_credentials":true,"id":"Nihil sunt doloremque.","label":"Ea architecto autem iste.","portal_id":"Omnis ut ex sunt.","project_id":"Ut ut odio odio sed minus quia.","sender_email":"Beatae ut modi voluptatum veniam.","sender_name":"Quibusdam consequuntur dolorem fugiat.","status":"deleted","version":5861862348723710898}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ex quis molestias nam quia facilis."},"example":"Deserunt earum saepe repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Porro ut et cupiditate.","brand_kit":"Animi molestiae aut fugit alias nisi qui.","has_credentials":true,"id":"Eius dicta.","label":"Non assumenda perspiciatis.","portal_id":"Voluptatem vel.","project_id":"Ullam distinctio dolore velit.","sender_email":"Dolore repudiandae necessitatibus dolorem.","sender_name":"Beatae quia minus vero at ut.","status":"active","version":2806381801577175312}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Blanditiis inventore similique est."},"example":"Possimus qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Debitis nam.","brand_kit":"Aut aut eos magnam quisquam et.","has_credentials":false,"id":"Eveniet sint voluptatibus quam dicta.","label":"Quis iste eaque.","portal_id":"Quia distinctio consequatur dolore.","project_id":"Consequuntur voluptatem est qui.","sender_email":"Corporis consequatur voluptatem voluptates.","sender_name":"Reprehenderit provident repudiandae sit.","status":"error","version":7483108258641908951}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt aliquam et velit fuga quos est.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aspernatur enim perferendis."},"example":"Soluta porro distinctio cupiditate."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Sed sed similique enim ea maiores.","has_credentials":false,"id":"In aperiam quam quis quam dolor.","label":"Sit cupiditate nobis iste qui rerum.","org_id":"Ratione expedita voluptatum commodi fuga ipsa quam.","project_id":"Earum iusto.","status":"active","version":4984404630797976872}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Molestias qui magnam impedit modi."},"example":"Ipsum ullam quis est incidunt debitis qui."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Libero ut est rerum est occaecati et.","has_credentials":false,"id":"Error nulla fuga fugit repellendus et accusamus.","label":"Nam quia aperiam sunt est.","org_id":"Consequuntur quod.","project_id":"Non sequi error assumenda quam deleniti et.","status":"inactive","version":5045833847874249009}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quia sequi consequatur aut dolorem."},"example":"Necessitatibus quam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Neque facilis est qui possimus eligendi.","has_credentials":false,"id":"Consequuntur qui quidem exercitationem.","label":"Sed numquam necessitatibus laudantium est ut.","org_id":"Et nobis voluptas dignissimos exercitationem illum.","project_id":"Ipsa quo vel architecto quas eligendi impedit.","status":"inactive","version":8080806383587730069}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ex est facilis qui ducimus modi ut.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut maiores ea omnis quia quas."},"example":"Sunt odit molestiae ab praesentium enim."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Qui nobis et delectus quam.","app_id":"Est dolor ut corporis.","has_credentials":true,"id":"Laboriosam qui id enim.","label":"Nihil corrupti repellat eius.","page_id":"Aut fuga.","project_id":"Magni repudiandae.","status":"deleted","version":2782071096062379507}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis ipsam ad sed laudantium ut ea."},"example":"Ad a et inventore tempora facilis dolores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Ad inventore voluptatum eligendi quasi.","app_id":"Placeat unde distinctio ducimus qui.","has_credentials":true,"id":"Deleniti voluptates non sint inventore.","label":"Porro voluptate.","page_id":"Aperiam velit dolores.","project_id":"Iure ut nostrum facilis suscipit.","status":"inactive","version":358292288538552244}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Natus ratione."},"example":"Amet quam consequuntur nulla quaerat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Quos hic doloribus.","app_id":"Qui a necessitatibus molestiae qui unde.","has_credentials":false,"id":"Illo vitae occaecati omnis.","label":"Explicabo possimus consequatur.","page_id":"Eos velit eum et sint corrupti.","project_id":"Pariatur debitis.","status":"deleted","version":3363918130362824521}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dolorem qui explicabo consequuntur repellat non suscipit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quidem est."},"example":"Corporis deserunt quae."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Dolor ut velit quam omnis et dolor.","customer_id":"Vitae vel omnis autem accusamus mollitia.","has_credentials":false,"id":"Maxime dicta qui aut.","label":"Velit et impedit facilis quaerat.","project_id":"Suscipit eos nam ipsa.","status":"deleted","version":443094643112211074}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sint expedita fugit iste nemo voluptas."},"example":"Fugit unde ea quis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Repellendus porro et distinctio.","customer_id":"Quia eaque.","has_credentials":true,"id":"Labore omnis provident nihil aut rerum est.","label":"Sint non.","project_id":"Amet rem ab.","status":"error","version":5425752825388180685}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut mollitia."},"example":"Pariatur ratione blanditiis."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","customer_id":"Id aut et adipisci quo ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","project_id":"Et qui ut libero numquam.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptates ut culpa saepe necessitatibus.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Consequatur beatae."},"example":"Totam dolorem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Iusto omnis.","has_credentials":false,"id":"Odio totam cum deleniti placeat fuga.","label":"Et ut quis ut.","project_id":"Saepe voluptatem reiciendis pariatur.","status":"error","version":757606501996618102}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Iure tempora non ea facilis nihil eius."},"example":"Corporis nesciunt ipsam voluptates magnam atque."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Non laudantium sunt minima repudiandae illo harum.","has_credentials":true,"id":"Atque laudantium.","label":"Enim accusantium labore esse numquam.","project_id":"Rerum earum rerum adipisci.","status":"inactive","version":6816002535409129912}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut enim."},"example":"Voluptas a natus est dolor voluptatum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Et rerum in expedita.","has_credentials":true,"id":"Voluptatum ducimus tempore quae eum consequatur dolore.","label":"Quo veritatis quis delectus est.","project_id":"Illum illum dolores tenetur ut illum.","status":"active","version":4673192311933251173}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Assumenda nesciunt distinctio eaque.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Odio autem perferendis accusamus nulla placeat aut."},"example":"Aliquid quia natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Id unde veritatis officiis aut fugiat.","funding_instrument_id":"Voluptas tenetur nobis facere.","has_credentials":true,"id":"Eaque voluptate reprehenderit sed voluptatem sed illo.","label":"Cum nisi numquam.","project_id":"Praesentium tenetur quas at ut necessitatibus dolor.","status":"active","version":4642810346647163563}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sit dignissimos est."},"example":"Harum esse."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Vitae aut ea.","funding_instrument_id":"Aut sit architecto ut unde saepe.","has_credentials":true,"id":"Non iste ad rem quidem sunt qui.","label":"Deleniti doloribus debitis assumenda dignissimos.","project_id":"Ullam ab suscipit et labore harum.","status":"error","version":753723066786334950}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptatibus ut."},"example":"Fugit nostrum rerum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Deserunt repellendus corrupti itaque quo sit.","funding_instrument_id":"Eum et ipsum expedita reprehenderit eos.","has_credentials":false,"id":"Blanditiis mollitia dolores illo nostrum magnam.","label":"Omnis nobis.","project_id":"Nostrum tempore.","status":"inactive","version":6605548766358472787}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Ut architecto deleniti nostrum sed aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"79c02b27-dc40-4b89-9073-64a5596694c3","format":"uuid"},"example":"52112f6b-ba24-497d-8dd7-e7c129c8add5"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Beatae est officia et sint.","job_id":"Et dignissimos ex.","result":[{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."},{"campaign_id":"Et voluptatem voluptatem voluptatem.","error":"Omnis doloribus qui.","ok":true,"platform":"Nobis velit in."}],"status":"running"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Vitae illo consequuntur esse."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Officia natus quia labore."},"event_details":{"description":"Extracted event/course details","example":"Quia recusandae dignissimos dolore harum totam."},"event_slug":{"type":"string","description":"Event/course slug","example":"Molestiae eius in reprehenderit nobis hic."},"id":{"type":"string","description":"Brief UUID","example":"Aliquid dignissimos minima aut fugit."},"keywords":{"description":"Keyword list","example":"Libero recusandae ut ullam aliquam."},"platforms":{"type":"array","items":{"type":"string","example":"Harum aliquam sunt eum."},"description":"Suggested default platforms","example":["Occaecati facere voluptatibus nihil nisi.","Distinctio tempore qui velit omnis dolorem est."]},"program_type":{"type":"string","description":"Funnel context","example":"Ipsum neque sapiente aliquid quidem velit."},"project_id":{"type":"string","description":"Owning project","example":"Et iure laudantium quia est molestiae."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Iure consequatur minus nostrum iste nemo."},"url":{"type":"string","description":"Event/course page URL","example":"Magni eos voluptatem sint hic ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3221003988771868872,"format":"int64"}},"example":{"copy":"Quod exercitationem.","etag":"Enim nam id.","event_details":"Repellendus eveniet veritatis impedit aut iste earum.","event_slug":"Sequi ea ut vero consequatur possimus.","id":"Ut dolores et incidunt.","keywords":"Pariatur saepe ab qui et.","platforms":["Et magni ad et provident.","Non quisquam iure.","Est ut aliquid."],"program_type":"Ipsam tempora est.","project_id":"Ipsa fugiat assumenda.","status":"archived","targeting":"Laboriosam sunt quis omnis animi.","url":"Assumenda sit delectus veniam.","version":3928799509074172783},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Sit facere iste et alias."},"event_details":{"description":"Extracted event/course details","example":"Ut iste et aspernatur delectus."},"event_slug":{"type":"string","description":"Event/course slug","example":"Aspernatur culpa sed non qui ad."},"id":{"type":"string","description":"Brief UUID","example":"Perspiciatis ea dolor."},"keywords":{"description":"Keyword list","example":"Magni ad doloremque soluta et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Rerum voluptatem saepe eligendi eum non."},"description":"Suggested default platforms","example":["Totam occaecati enim eaque blanditiis deleniti reprehenderit.","Quas commodi.","Qui mollitia architecto recusandae voluptates excepturi reiciendis.","Consequatur amet dolorem qui."]},"program_type":{"type":"string","description":"Funnel context","example":"Ratione dicta."},"project_id":{"type":"string","description":"Owning project","example":"Dolores qui."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Voluptas qui."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Autem aperiam quis.","event_details":"Quae qui optio magni itaque iure.","event_slug":"Consequatur velit atque nam voluptatem in.","id":"Est et beatae.","keywords":"Enim odit numquam.","platforms":["Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem.","Placeat dolores culpa sed."],"program_type":"Repellendus autem ullam odio quis.","project_id":"Est officiis enim qui.","status":"draft","targeting":"Placeat aut dolores at.","url":"Explicabo voluptatem et.","version":2226888956028863556},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quia amet vero dolorum incidunt officia nihil."},"event_details":{"description":"Extracted event/course details","example":"Optio enim nisi doloremque rerum sed consequatur."},"event_slug":{"type":"string","description":"Event/course slug","example":"Ut aspernatur et ad."},"id":{"type":"string","description":"Brief UUID","example":"Dignissimos voluptatem et labore sit atque qui."},"keywords":{"description":"Keyword list","example":"Dolores dignissimos perferendis tempore eum laboriosam iure."},"platforms":{"type":"array","items":{"type":"string","example":"Vel aut rerum voluptatem ad minus."},"description":"Suggested default platforms","example":["Cum nemo esse nobis.","Aut dolorem ea veniam.","Quae adipisci doloribus ullam.","Dolor eum et consequatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Unde dolore id a necessitatibus fuga ducimus."},"project_id":{"type":"string","description":"Owning project","example":"Aut eaque eveniet autem."},"status":{"type":"string","description":"Lifecycle status","example":"draft","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"At magnam saepe incidunt nisi est."},"url":{"type":"string","description":"Event/course page URL","example":"Magnam sequi esse at."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3943386503686697829,"format":"int64"}},"example":{"copy":"Quos labore est ut ratione.","event_details":"Sint molestiae occaecati.","event_slug":"Deleniti non in iure dolores et quis.","id":"Distinctio possimus.","keywords":"Ut occaecati tenetur minima.","platforms":["Minus natus.","Doloribus nam eius nulla suscipit ullam accusamus."],"program_type":"Id ducimus excepturi est et est.","project_id":"Aliquid qui facilis neque sed alias.","status":"archived","targeting":"Sed impedit.","url":"Recusandae similique assumenda ut quia.","version":5475183181677687295},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Laborum quia beatae non et excepturi."},"event_details":{"description":"Extracted event/course details","example":"Molestias voluptatibus nam debitis hic qui."},"event_slug":{"type":"string","description":"Event/course slug","example":"Exercitationem voluptatum perspiciatis autem."},"id":{"type":"string","description":"Brief UUID","example":"Ut ut qui sed explicabo dolorem totam."},"keywords":{"description":"Keyword list","example":"Minus officiis et quisquam dicta rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Sunt labore voluptate."},"description":"Suggested default platforms","example":["Ipsum quo possimus saepe quam.","Qui cum."]},"program_type":{"type":"string","description":"Funnel context","example":"Vero nulla laboriosam vel et et iure."},"project_id":{"type":"string","description":"Owning project","example":"Qui nesciunt sed magnam."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Enim est libero enim quo."},"url":{"type":"string","description":"Event/course page URL","example":"Eum ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":888507263129682759,"format":"int64"}},"example":{"copy":"Et fuga veniam.","event_details":"Aliquid eum itaque qui recusandae recusandae.","event_slug":"Illum expedita commodi in dolores nemo similique.","id":"Dolorem neque assumenda sed sapiente aspernatur ipsam.","keywords":"Ea et iusto doloremque odio pariatur.","platforms":["Voluptatem libero quia.","Harum molestiae cupiditate ab et eum ex.","Quia velit adipisci."],"program_type":"Dignissimos in tempore quo consequatur sint qui.","project_id":"Qui illo totam.","status":"archived","targeting":"Expedita animi ut velit at.","url":"Autem impedit.","version":6980228077781980481},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo soluta maxime temporibus earum et aperiam."},"event_details":{"description":"Extracted event/course details","example":"Amet officia occaecati quam nostrum quis voluptas."},"event_slug":{"type":"string","description":"Event/course slug","example":"Sapiente alias et error nobis minima."},"id":{"type":"string","description":"Brief UUID","example":"Ratione est omnis voluptas praesentium."},"keywords":{"description":"Keyword list","example":"Ab itaque tempore vel quia cum quas."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga maxime tempora rem."},"description":"Suggested default platforms","example":["Debitis rerum.","Dolor pariatur."]},"program_type":{"type":"string","description":"Funnel context","example":"Laboriosam et."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur voluptatum facilis."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Minus sit necessitatibus."},"url":{"type":"string","description":"Event/course page URL","example":"Reprehenderit dolorem impedit qui suscipit ipsa ut."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4889810267187914144,"format":"int64"}},"example":{"copy":"Excepturi cumque ullam esse.","event_details":"Quia voluptates voluptates nisi nihil aut molestias.","event_slug":"Sed commodi voluptatibus.","id":"Et est debitis ea.","keywords":"Non autem voluptatem ut.","platforms":["Facilis asperiores enim nisi.","Perspiciatis optio.","Quia doloribus omnis et excepturi fugit dolores."],"program_type":"Nemo molestiae modi ut non atque.","project_id":"Eum voluptatum accusamus illo eveniet eum.","status":"approved","targeting":"Distinctio non recusandae et qui ut exercitationem.","url":"Nobis est fugit ratione consectetur exercitationem.","version":1659901820906198210},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Tempora voluptate fuga ea distinctio."},"event_details":{"description":"Extracted event/course details","example":"Pariatur mollitia incidunt autem."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Quis harum recusandae."},"keywords":{"description":"Keyword list","example":"Mollitia aut tempore rerum."},"platforms":{"type":"array","items":{"type":"string","example":"Repellat eum totam voluptatem eos doloribus."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Eligendi magni quidem sit in quia.","Perspiciatis alias et amet ex molestiae.","Minus libero et consequuntur suscipit."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Eaque nesciunt."},"url":{"type":"string","description":"Event/course page URL","example":"Ipsum est amet quaerat."}},"example":{"copy":"Beatae consectetur aut omnis labore et quis.","event_details":"Natus deleniti est natus.","event_slug":"Inventore in eligendi ipsam.","keywords":"Dolores repellat.","platforms":["Itaque ut dolores in.","Expedita placeat dolores numquam molestias.","Aliquid deleniti fuga est aliquam."],"program_type":"education","targeting":"Similique omnis.","url":"Vel atque eos reiciendis sit minima non."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Voluptas necessitatibus cumque non porro qui molestias."},"campaign_name":{"type":"string","description":"Campaign name","example":"Nulla perferendis possimus deserunt iure et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Omnis nesciunt qui."},"id":{"type":"string","description":"Campaign UUID","example":"Et minima dolorem sit."},"platform":{"type":"string","description":"Channel","example":"In praesentium cumque."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Pariatur odio molestias voluptatum."},"project_id":{"type":"string","description":"Owning project","example":"Tempora qui."},"status":{"type":"string","description":"Campaign status","example":"Ea quidem ducimus tempora ea molestias."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":971659538665007246,"format":"int64"}},"example":{"brief_id":"Odit provident sed quo aperiam.","campaign_name":"Voluptatem repellat expedita inventore.","etag":"Maxime hic aliquam ratione ipsum.","id":"Quia fuga atque.","platform":"Aspernatur nihil et incidunt dolorem dolor sed.","platform_campaign_id":"Delectus harum voluptates sit est corporis.","project_id":"Sequi culpa.","status":"Necessitatibus ut necessitatibus in.","version":5532967292288417247},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et iste."},"campaign_name":{"type":"string","description":"Campaign name","example":"Rerum reiciendis similique."},"id":{"type":"string","description":"Campaign UUID","example":"Ea laboriosam totam unde."},"platform":{"type":"string","description":"Channel","example":"Voluptas ut nostrum officiis et accusamus provident."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Odio eos earum fuga non est."},"project_id":{"type":"string","description":"Owning project","example":"Ipsa sint optio nobis quae corporis."},"status":{"type":"string","description":"Campaign status","example":"Tempora qui incidunt tempora."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7916176946868712323,"format":"int64"}},"example":{"brief_id":"Voluptas incidunt eligendi consequatur.","campaign_name":"Earum temporibus ipsum necessitatibus ratione possimus eum.","id":"Voluptatem dolores tempora qui sit.","platform":"Labore eos et repudiandae odit omnis cupiditate.","platform_campaign_id":"Illo repellat et cum.","project_id":"Voluptates soluta animi sit ut.","status":"Repellat eveniet reiciendis consequatur consequatur sint.","version":2970088391723074573},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Et et sed."},"campaign_name":{"type":"string","description":"Campaign name","example":"Minima adipisci aut quia quisquam."},"id":{"type":"string","description":"Campaign UUID","example":"Molestiae quo non."},"platform":{"type":"string","description":"Channel","example":"Vel quaerat iure ipsam."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Necessitatibus reprehenderit illum."},"project_id":{"type":"string","description":"Owning project","example":"Reprehenderit natus."},"status":{"type":"string","description":"Campaign status","example":"Quia facilis sit."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7577275663228988931,"format":"int64"}},"example":{"brief_id":"Molestiae cupiditate quis modi blanditiis.","campaign_name":"Distinctio dignissimos.","id":"Nihil qui doloremque nam magnam aliquid impedit.","platform":"Tempora quod expedita magni.","platform_campaign_id":"Harum ipsa.","project_id":"Accusantium expedita alias placeat incidunt sit perspiciatis.","status":"Voluptatibus natus tempora commodi et.","version":6630207652424081561},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Impedit ullam eaque suscipit harum sint neque."},"platforms":{"type":"array","items":{"type":"string","example":"twitter-ads","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["meta-ads","google-ads","reddit-ads"],"minItems":1}},"example":{"config":"Optio consequatur nulla sint qui alias voluptatem.","platforms":["linkedin-ads","reddit-ads","google-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Amet hic est."},"config":{"description":"Campaign configuration snapshot","example":"Quae esse mollitia et dolorum."},"status":{"type":"string","description":"Campaign status","example":"Quaerat occaecati rerum."}},"example":{"campaign_name":"Aspernatur quos est magnam voluptates.","config":"Dolores dolore id dolore sed.","status":"Libero autem quod saepe ullam ipsum."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Accusantium totam quia."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":true}},"example":{"message":"Debitis adipisci.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Blanditiis quidem qui iusto sed.","event_details":"Dolor molestias ipsa dolorum est.","event_slug":"Accusantium ad.","keywords":"Vel fuga recusandae.","platforms":["Iste autem veniam et enim unde.","Facere quam.","Rem quia consequuntur ut.","Consequatur quos atque voluptates quo sit."],"program_type":"membership","targeting":"Nulla ut laboriosam.","url":"Modi asperiores ut libero vel."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Facere et exercitationem.","platforms":["microsoft-ads","twitter-ads","google-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."},"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"},"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."},"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."},"credentials":{"client_id":"Nisi blanditiis eveniet quasi ea.","client_secret":"Ut corporis dolorum consequatur eius perferendis nobis.","developer_token":"Et et itaque sunt.","refresh_token":"Vel voluptate necessitatibus."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."},"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."},"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatibus aliquam et."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Modi consequatur molestias et et deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Atque hic quam impedit placeat."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur enim voluptas numquam aut et."},"project_id":{"type":"string","description":"Owning project","example":"Reiciendis odit eos et quidem."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2538353845791645445,"format":"int64"}},"example":{"account_id":"Rem fugit accusantium est.","etag":"Dolorem asperiores autem aut aut soluta.","has_credentials":true,"id":"Eius dolor magnam necessitatibus amet.","label":"Rerum tempore tempora.","login_customer_id":"Et est et corporis.","project_id":"Earum aut qui.","status":"active","version":6983147448769937945},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sed ipsam enim esse iure est."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minima dolorem omnis aspernatur veritatis adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptas ipsam iste."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Quis quod aut sunt ex et autem."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus adipisci sit et enim quasi ut."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5457180552368415477,"format":"int64"}},"example":{"account_id":"Natus aliquam aut quas aliquid.","has_credentials":true,"id":"Non adipisci omnis veritatis omnis.","label":"Placeat et.","login_customer_id":"Laboriosam praesentium beatae quis.","project_id":"Omnis reprehenderit.","status":"active","version":5939335900418206229},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Vero provident voluptas consequatur iusto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eius harum."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil excepturi provident saepe aliquam architecto."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ut magnam aut illum commodi placeat sed."},"project_id":{"type":"string","description":"Owning project","example":"Qui est nemo ullam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8077434258112236542,"format":"int64"}},"example":{"account_id":"Voluptas quasi esse corporis.","has_credentials":false,"id":"Minus pariatur praesentium amet.","label":"Sint velit earum laboriosam dignissimos reiciendis et.","login_customer_id":"Deserunt reiciendis dolorem totam voluptatem.","project_id":"Libero pariatur ut.","status":"active","version":6561992588765026566},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laudantium doloremque aut eligendi perferendis aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Amet qui provident."},"label":{"type":"string","description":"Optional friendly name","example":"Ut ea."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Ea consectetur delectus."},"project_id":{"type":"string","description":"Owning project","example":"Repudiandae molestias est consectetur porro quo pariatur."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":10157424754048271,"format":"int64"}},"example":{"account_id":"Aut earum rerum ducimus dicta velit.","has_credentials":true,"id":"Id officiis architecto.","label":"Sit iste ea.","login_customer_id":"Molestiae dolorum non perspiciatis a.","project_id":"Et libero ea aut omnis.","status":"error","version":8687544223346888800},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Sint autem repudiandae asperiores et."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Quia consectetur non nulla dolore quibusdam ducimus."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Soluta quod."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Iste explicabo minima commodi qui quia est."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Omnis inventore voluptatum ab.","client_secret":"Laboriosam quos omnis deserunt libero consequatur quisquam.","developer_token":"Sapiente ex est modi cupiditate possimus ducimus.","refresh_token":"At fugiat."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sint suscipit."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quo veritatis nisi velit distinctio animi."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Non neque optio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolore voluptatem qui eveniet amet."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptate et."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Architecto molestiae cum."},"project_id":{"type":"string","description":"Owning project","example":"Qui pariatur odio reprehenderit nam."},"sender_email":{"type":"string","description":"Default sender address","example":"Perspiciatis consequatur beatae sunt officiis sequi qui."},"sender_name":{"type":"string","description":"Default sender name","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6078188127403523196,"format":"int64"}},"example":{"account_id":"Dolor molestiae quia voluptatem deserunt libero.","brand_kit":"Molestiae soluta vel ad et in voluptatem.","etag":"Aut impedit a veritatis.","has_credentials":false,"id":"Provident rerum et voluptas tenetur esse.","label":"Quaerat ipsa voluptatem.","portal_id":"Consequuntur sed ea sunt debitis.","project_id":"Assumenda sed minima nihil.","sender_email":"Voluptas qui voluptas veniam sint voluptas.","sender_name":"Non illo ab in voluptatem minus est.","status":"active","version":1552956989772584247},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eius quo."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Dolorem impedit sint consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Iusto in commodi velit in odio."},"label":{"type":"string","description":"Optional friendly name","example":"Non architecto."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Et corrupti magnam deleniti nam laboriosam esse."},"project_id":{"type":"string","description":"Owning project","example":"Aliquam voluptatem sunt et eveniet."},"sender_email":{"type":"string","description":"Default sender address","example":"Eaque ut voluptatibus qui qui officia."},"sender_name":{"type":"string","description":"Default sender name","example":"Alias quis voluptates nihil odio facere magnam."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7096858184495555885,"format":"int64"}},"example":{"account_id":"Officia suscipit qui molestias aliquid dolorum consequatur.","brand_kit":"Hic ea et.","has_credentials":false,"id":"Nihil labore accusamus illum in delectus magnam.","label":"Porro voluptatum nemo adipisci.","portal_id":"Enim aut.","project_id":"Velit sed laboriosam placeat nesciunt.","sender_email":"Dolores sed.","sender_name":"Optio enim repellendus commodi quia quod sit.","status":"inactive","version":3587423604677944667},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eligendi corporis tenetur delectus excepturi et."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Ut est est mollitia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Aperiam impedit omnis explicabo."},"label":{"type":"string","description":"Optional friendly name","example":"Enim temporibus facere."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Id libero sunt."},"project_id":{"type":"string","description":"Owning project","example":"Et et commodi autem."},"sender_email":{"type":"string","description":"Default sender address","example":"Suscipit consequatur iure dolor sit quis ut."},"sender_name":{"type":"string","description":"Default sender name","example":"Natus enim non."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2722095064844656519,"format":"int64"}},"example":{"account_id":"Doloribus similique et.","brand_kit":"Voluptas earum provident qui.","has_credentials":true,"id":"Corporis omnis.","label":"Delectus nisi minima quas voluptatem consequuntur.","portal_id":"Aliquam dolorem voluptas autem enim aut ut.","project_id":"Ea in sunt odit aspernatur.","sender_email":"Eum ut rem illum.","sender_name":"Autem ratione est exercitationem sapiente a animi.","status":"error","version":6167429858997341484},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quam aliquid reiciendis maiores similique ab."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Iure consectetur libero."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere dolorum rem laborum dolor provident."},"label":{"type":"string","description":"Optional friendly name","example":"Vitae voluptas fuga aut minima inventore tenetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Accusamus optio consequatur excepturi rerum."},"project_id":{"type":"string","description":"Owning project","example":"Odio aut suscipit."},"sender_email":{"type":"string","description":"Default sender address","example":"In officiis dolores delectus architecto."},"sender_name":{"type":"string","description":"Default sender name","example":"Velit eligendi omnis est vel est et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7137337173165660443,"format":"int64"}},"example":{"account_id":"Ratione architecto corporis totam et.","brand_kit":"Tempora reprehenderit eveniet.","has_credentials":true,"id":"Accusamus aut deleniti libero veritatis cum.","label":"Quidem perferendis.","portal_id":"Tempora magnam ea repellat qui.","project_id":"Deleniti dolorem voluptas harum soluta repudiandae quisquam.","sender_email":"Eveniet dolor necessitatibus est mollitia.","sender_name":"Officiis dolorem necessitatibus blanditiis rerum.","status":"active","version":6334382601164890326},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Totam et voluptates atque consequatur consequuntur voluptates."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Adipisci minus et vero."},"label":{"type":"string","description":"Optional friendly name","example":"Commodi facere vel."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Quos provident."},"sender_email":{"type":"string","description":"Default sender address","example":"Et fugiat reprehenderit officiis modi quae consequatur."},"sender_name":{"type":"string","description":"Default sender name","example":"Et culpa culpa veritatis."}},"example":{"account_id":"Ea et quidem quibusdam officiis dolor.","brand_kit":"Aut mollitia pariatur perferendis placeat dolores.","label":"Ea perspiciatis rerum occaecati incidunt deleniti sunt.","portal_id":"Nisi sunt.","sender_email":"Sint dolor eaque culpa.","sender_name":"Eius omnis id itaque."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Molestiae veniam exercitationem blanditiis ratione non."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Sed dolorum cupiditate quia qui dicta."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequatur ut."},"platforms":{"type":"array","items":{"type":"string","example":"Commodi qui mollitia et eum veniam."},"description":"Platforms this job will create on","example":["Eaque voluptatem omnis architecto cupiditate.","Sint culpa sed minima."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Quos enim.","platforms":["Molestiae ad voluptatum ducimus accusantium et.","Quaerat et eius culpa magni illum consequatur.","Soluta dolore vitae."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Sequi aut veniam ratione."},"job_id":{"type":"string","description":"Job UUID","example":"Quia magnam culpa ipsam totam nulla."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}]},"status":{"type":"string","description":"Job status","example":"running","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Mollitia quidem quo et enim.","job_id":"Perferendis omnis ad voluptas esse.","result":[{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."},{"campaign_id":"Nemo perspiciatis et qui aliquam doloremque itaque.","error":"Magni autem.","ok":false,"platform":"Ut totam ut."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nobis qui sunt laboriosam ipsa."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut inventore consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Rerum rem."},"label":{"type":"string","description":"Optional friendly name","example":"In vel."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Autem eaque eaque dicta ut magni."},"project_id":{"type":"string","description":"Owning project","example":"Vitae qui explicabo tempora accusantium aut."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3265309804259735983,"format":"int64"}},"example":{"account_id":"Alias quod minima blanditiis.","etag":"Iure dolores dolores dolorem sit nihil.","has_credentials":true,"id":"Error deleniti vitae molestiae qui nobis.","label":"Quia enim non asperiores velit.","org_id":"Sit est atque qui quaerat qui vitae.","project_id":"Aut temporibus dolorem cumque quis.","status":"inactive","version":4548596825330631938},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et laboriosam veritatis saepe numquam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quas delectus a maxime consequatur iste eum."},"label":{"type":"string","description":"Optional friendly name","example":"Et at iusto optio."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui quisquam quae."},"project_id":{"type":"string","description":"Owning project","example":"Vel impedit et unde et rerum."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1129434020019069718,"format":"int64"}},"example":{"account_id":"Ea nostrum corrupti ipsum minima consequuntur.","has_credentials":true,"id":"Magni temporibus et molestias.","label":"Iste ullam sunt rem non doloribus omnis.","org_id":"Hic et illo aut natus et accusamus.","project_id":"Molestias et officiis asperiores quibusdam accusamus.","status":"active","version":8161899588231294433},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos quidem debitis iusto molestias itaque consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui et dolorem."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita error cumque."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Fugit et soluta."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam repellat harum expedita aut quidem beatae."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7037294126068689767,"format":"int64"}},"example":{"account_id":"Iure ut.","has_credentials":true,"id":"Et qui officiis repudiandae qui iste accusantium.","label":"Consequatur provident ea sint.","org_id":"Eum quibusdam et minus id deleniti placeat.","project_id":"Voluptatem iste nemo numquam unde perspiciatis.","status":"active","version":3173101195127892589},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Autem quia velit aliquid quae."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quia et non id sunt adipisci consectetur."},"label":{"type":"string","description":"Optional friendly name","example":"Soluta nostrum cumque explicabo pariatur voluptatum molestias."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Consequatur vero possimus."},"project_id":{"type":"string","description":"Owning project","example":"Modi quo et inventore eum autem quia."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":700201239225519995,"format":"int64"}},"example":{"account_id":"Sequi dolor eos fugiat rem.","has_credentials":false,"id":"Maiores voluptas.","label":"Qui facilis possimus.","org_id":"Pariatur et et deserunt facere ea incidunt.","project_id":"Corporis quam quos dolor id debitis eos.","status":"inactive","version":1986183550074348775},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Officia dolores et reprehenderit."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Ex dolor.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Voluptate est reprehenderit consectetur accusamus eaque inventore."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Aut explicabo."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Libero officia et quia."},"app_id":{"type":"string","description":"Meta app ID","example":"Necessitatibus eos rerum."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui maxime eos deserunt."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est consequatur rerum neque velit nulla modi."},"label":{"type":"string","description":"Optional friendly name","example":"Nihil at."},"page_id":{"type":"string","description":"Facebook page ID","example":"Expedita sed velit distinctio."},"project_id":{"type":"string","description":"Owning project","example":"Optio quia similique vero est impedit quo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4061552416134608654,"format":"int64"}},"example":{"account_id":"Vero aut repellendus reiciendis.","app_id":"Ea ad ducimus consequatur aut.","etag":"Atque et.","has_credentials":true,"id":"Veniam amet et quisquam voluptatem fuga.","label":"Optio rerum vel molestiae id.","page_id":"Quia iure aut tenetur.","project_id":"Qui quas aut provident suscipit.","status":"inactive","version":8332327938373479794},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non impedit incidunt."},"app_id":{"type":"string","description":"Meta app ID","example":"Alias laudantium sit et."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Molestiae modi."},"label":{"type":"string","description":"Optional friendly name","example":"Temporibus ullam sint aliquam ea."},"page_id":{"type":"string","description":"Facebook page ID","example":"Rerum corrupti."},"project_id":{"type":"string","description":"Owning project","example":"Libero consectetur non."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1431900350448492398,"format":"int64"}},"example":{"account_id":"Amet et vel ipsa ad doloremque qui.","app_id":"Eum voluptatem debitis aliquid accusamus eligendi itaque.","has_credentials":false,"id":"Sed eius reiciendis rerum voluptatem suscipit rerum.","label":"Voluptas voluptatem eum consequuntur.","page_id":"Est quidem in.","project_id":"Et ex aut cupiditate qui placeat omnis.","status":"inactive","version":2895836647375905460},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nam rerum omnis praesentium omnis amet quia."},"app_id":{"type":"string","description":"Meta app ID","example":"At explicabo reiciendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est temporibus explicabo doloremque possimus."},"label":{"type":"string","description":"Optional friendly name","example":"Autem repellat et."},"page_id":{"type":"string","description":"Facebook page ID","example":"Officia rerum eligendi ex."},"project_id":{"type":"string","description":"Owning project","example":"Cupiditate ab omnis nesciunt consequatur commodi."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5777051591540907893,"format":"int64"}},"example":{"account_id":"Voluptates voluptatem similique aut.","app_id":"Natus expedita est sed.","has_credentials":true,"id":"At ratione unde dicta.","label":"Voluptas perferendis et perferendis.","page_id":"Voluptatem sit excepturi eaque.","project_id":"Doloribus aspernatur quod ipsum pariatur explicabo nesciunt.","status":"error","version":4610591738843411818},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repudiandae hic nostrum qui sed est architecto."},"app_id":{"type":"string","description":"Meta app ID","example":"Eveniet magnam dolor sint."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ducimus qui quas neque eum voluptatem."},"label":{"type":"string","description":"Optional friendly name","example":"Consectetur consequatur autem eveniet magnam dolor."},"page_id":{"type":"string","description":"Facebook page ID","example":"Id doloremque ad dolores tempore ut est."},"project_id":{"type":"string","description":"Owning project","example":"Velit corporis nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3642485435905489461,"format":"int64"}},"example":{"account_id":"Doloremque pariatur qui magni facere.","app_id":"Ut voluptas est est accusamus.","has_credentials":false,"id":"Ipsa nam ipsa magnam praesentium eos cum.","label":"Illum natus doloremque facere quis et beatae.","page_id":"Sit animi dolor ex saepe ipsa.","project_id":"Sed est recusandae enim quidem.","status":"active","version":1460268576636670658},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Adipisci ut."},"label":{"type":"string","description":"Optional friendly name","example":"Excepturi natus est est saepe doloribus unde."},"page_id":{"type":"string","description":"Facebook page ID","example":"Aut perspiciatis."}},"example":{"account_id":"act_193556282970417","app_id":"Dolores earum.","label":"Sit totam ut et.","page_id":"Quibusdam ea nam aut."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Optio non."},"app_secret":{"type":"string","description":"Meta app secret","example":"Optio in ratione accusamus quasi."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Ipsam eligendi est dolore.","app_secret":"Consequatur aut vero."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut itaque voluptatem unde adipisci aut."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Non laudantium quis ab non sunt."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aut praesentium eos ex laborum et doloremque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et natus possimus cupiditate."},"label":{"type":"string","description":"Optional friendly name","example":"Repudiandae eum."},"project_id":{"type":"string","description":"Owning project","example":"Molestiae quia neque atque delectus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9192676630235860462,"format":"int64"}},"example":{"account_id":"Voluptatem velit odio temporibus aut.","customer_id":"Enim velit voluptates officiis tempora possimus rerum.","etag":"Vitae dolor soluta beatae.","has_credentials":true,"id":"Quo est.","label":"Quas quia quam voluptate nam iste.","project_id":"Beatae totam.","status":"error","version":1007882038292754957},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quisquam sit ut aliquid consectetur."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Quia assumenda aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"label":{"type":"string","description":"Optional friendly name","example":"Iusto aspernatur fugit et facere eligendi."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed eum ad sunt impedit sint."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8275500991568401541,"format":"int64"}},"example":{"account_id":"Id voluptatem et et et eveniet.","customer_id":"Ex dolor quia et dolores.","has_credentials":true,"id":"Voluptate quam delectus optio.","label":"Molestiae fuga.","project_id":"Ducimus aliquam vel cum alias.","status":"error","version":2847235492838917454},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ipsum est a."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Molestiae similique optio et corporis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Distinctio ea."},"label":{"type":"string","description":"Optional friendly name","example":"Velit architecto error consequatur nam."},"project_id":{"type":"string","description":"Owning project","example":"Ab iste earum consequatur laboriosam maxime nemo."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6583480909021941947,"format":"int64"}},"example":{"account_id":"Ex enim rem.","customer_id":"Quo sit iure quos aut.","has_credentials":false,"id":"Eligendi voluptatem repellat consectetur alias reiciendis voluptas.","label":"Dolorum enim doloribus.","project_id":"Cumque est quis nostrum quod.","status":"active","version":2799898264679301316},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus et neque deserunt eligendi rerum architecto."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Sapiente dolor unde harum dolorem iusto quia."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facere debitis quo."},"label":{"type":"string","description":"Optional friendly name","example":"Modi eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Fuga quaerat sed."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":402075575675880099,"format":"int64"}},"example":{"account_id":"Ratione ut laboriosam dolorem ut dolorem odio.","customer_id":"Inventore iste nemo rerum corporis repellat nemo.","has_credentials":true,"id":"Eos doloremque qui repellendus.","label":"Ea et nesciunt et culpa similique.","project_id":"Incidunt in.","status":"deleted","version":2480470963761289215},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Rerum maiores in alias est laboriosam saepe."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Perferendis placeat earum occaecati et."},"label":{"type":"string","description":"Optional friendly name","example":"Unde perspiciatis."}},"example":{"account_id":"Assumenda quam possimus aut ipsa.","customer_id":"Quae et perspiciatis numquam.","label":"Eaque magni omnis dolorem."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Accusantium est."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Molestias reprehenderit."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Dolorem similique sapiente."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Pariatur esse."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Ea pariatur.","client_secret":"Aut rem molestiae assumenda ea.","developer_token":"Sed qui dolor illo facere ut voluptatem.","refresh_token":"Nam repellat."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Laudantium dolor ipsam recusandae maxime."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Repellendus assumenda voluptatem aut debitis."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":false},"platform":{"type":"string","description":"Platform this result is for","example":"In commodi et asperiores et."}},"example":{"campaign_id":"Et consequatur et et itaque qui repudiandae.","error":"Atque ullam qui rerum numquam quo omnis.","ok":true,"platform":"Unde velit eos eius accusantium odit rerum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Facilis dolor consectetur sed.","etag":"Et itaque.","has_credentials":false,"id":"Quas est deserunt maiores consequatur eum.","label":"Occaecati hic ut magnam facilis.","project_id":"Voluptatum pariatur non ratione quo ullam.","status":"inactive","version":3072744263422347458},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est quia ducimus inventore."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nisi consequatur non quam suscipit ea ea."},"label":{"type":"string","description":"Optional friendly name","example":"Autem aut maiores ut sint."},"project_id":{"type":"string","description":"Owning project","example":"Quia sed harum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4610200042662121887,"format":"int64"}},"example":{"account_id":"Impedit perspiciatis ipsam sunt distinctio consequuntur.","has_credentials":true,"id":"Et mollitia exercitationem cumque.","label":"Eaque omnis nihil itaque.","project_id":"Similique sequi occaecati.","status":"error","version":2750059486165092858},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Deserunt provident voluptates cumque reiciendis error minus."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Recusandae amet."},"label":{"type":"string","description":"Optional friendly name","example":"Expedita nihil molestiae soluta consequuntur sapiente."},"project_id":{"type":"string","description":"Owning project","example":"Magni ut amet."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8154718885862958757,"format":"int64"}},"example":{"account_id":"Rerum nesciunt veritatis consequatur porro.","has_credentials":false,"id":"Qui voluptas culpa.","label":"Delectus non aut ipsum.","project_id":"Iste nihil itaque et.","status":"deleted","version":1595767401527646160},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Nemo aut et qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ratione provident laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Et quisquam dolores."},"project_id":{"type":"string","description":"Owning project","example":"Sed voluptatem repudiandae soluta."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8907067316289641877,"format":"int64"}},"example":{"account_id":"Aliquid porro deserunt nostrum sed sint voluptas.","has_credentials":true,"id":"Officiis et error nemo iste harum.","label":"Culpa est ex.","project_id":"Commodi occaecati.","status":"error","version":2407825525433943238},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Ipsam aperiam et totam in."}},"example":{"account_id":"t2_gv9wtbfa","label":"Numquam voluptatem maiores ipsam dicta cum odit."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Cumque laborum ipsum accusantium voluptatem libero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Eligendi non."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Necessitatibus non eum ipsum eveniet quam."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Aut amet aut voluptatum magnam.","client_secret":"Accusamus eos neque velit.","refresh_token":"In iure molestiae quisquam."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Natus provident est.","client_secret":"Id dolore.","developer_token":"Non error.","refresh_token":"Accusamus aperiam eos et architecto voluptas rerum."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Molestiae suscipit non iusto."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Eum est molestiae necessitatibus magni."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Eius est rerum illo mollitia.","app_secret":"Et dolor et consectetur sint error."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magnam ut similique ea minima magnam.","client_secret":"Ut quo iure.","refresh_token":"Sit est dolores est et."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Possimus et.","access_token_secret":"Deserunt consequuntur omnis.","consumer_key":"Dignissimos voluptas magni consequatur dignissimos itaque.","consumer_secret":"Ut aperiam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Temporibus in qui provident corrupti ut similique."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Consectetur voluptas voluptas voluptatem."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quia facere vitae aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Laudantium eligendi ut et."},"label":{"type":"string","description":"Optional friendly name","example":"Saepe beatae."},"project_id":{"type":"string","description":"Owning project","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4247878238148524808,"format":"int64"}},"example":{"account_id":"Aut et ut dolorem tempore.","etag":"Commodi sit omnis.","funding_instrument_id":"Porro saepe eius earum quo porro.","has_credentials":true,"id":"Corrupti dicta pariatur totam quas deserunt.","label":"In voluptate debitis earum voluptates repellat.","project_id":"Quis impedit.","status":"error","version":1517802020058879691},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Est aut et rem eos quia et."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Facere dolorum ab laboriosam placeat atque cumque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Quam fugiat adipisci non rerum et."},"label":{"type":"string","description":"Optional friendly name","example":"Quaerat laborum voluptatibus accusamus."},"project_id":{"type":"string","description":"Owning project","example":"Et eum tenetur."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":942544011211036746,"format":"int64"}},"example":{"account_id":"Eaque eos veniam quidem maiores adipisci.","funding_instrument_id":"Molestias ullam aut odit repellat nihil at.","has_credentials":true,"id":"Alias nihil.","label":"Voluptas ullam optio.","project_id":"Temporibus error incidunt.","status":"deleted","version":5983859909197428373},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Aliquam perspiciatis libero est ratione pariatur."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Corrupti quam unde nemo ipsum et illum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Reprehenderit nemo voluptatibus."},"label":{"type":"string","description":"Optional friendly name","example":"Ipsa quis animi aliquam sunt."},"project_id":{"type":"string","description":"Owning project","example":"Perferendis corrupti mollitia tempore aut."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3919079788188515327,"format":"int64"}},"example":{"account_id":"Repellendus voluptatem.","funding_instrument_id":"Saepe quo quis ut in voluptatem.","has_credentials":true,"id":"Rerum est.","label":"Minus aut ut non.","project_id":"Enim est sapiente.","status":"error","version":6704106453019920248},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Qui doloremque magni est error maiores."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Est eum nemo architecto est aut."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Nesciunt magnam omnis est unde."},"label":{"type":"string","description":"Optional friendly name","example":"Eum animi sed explicabo et quo et."},"project_id":{"type":"string","description":"Owning project","example":"Rerum eius vitae perferendis quod."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7817365326411446744,"format":"int64"}},"example":{"account_id":"Ut et sit quae similique inventore.","funding_instrument_id":"Illum laboriosam debitis aut vitae est est.","has_credentials":false,"id":"Ab culpa consequatur.","label":"Excepturi et eveniet sunt ut.","project_id":"Veniam omnis.","status":"active","version":328362383505116272},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Dolor et aliquam deleniti."},"label":{"type":"string","description":"Optional friendly name","example":"Et nemo dicta illum omnis."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Est dolor velit et voluptatem mollitia placeat.","label":"Nemo cum delectus laudantium."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Perferendis et."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Beatae facilis dolor quod nihil quia."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"A debitis ut ea."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Quos qui quo et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Non consequuntur qui qui impedit assumenda voluptas.","access_token_secret":"Consequuntur provident nostrum vel ut.","consumer_key":"Sed voluptas fuga officia nulla.","consumer_secret":"Recusandae consequatur nulla."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Ad voluptatem.","config":"Et expedita itaque quos.","status":"Tempore impedit."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Voluptas aperiam.","brand_kit":"Itaque fugit rerum cumque.","label":"Dolores enim.","portal_id":"Assumenda harum eos eveniet ut et laboriosam.","sender_email":"Quos expedita voluptas qui eaque.","sender_name":"Laudantium nostrum ratione id eius laborum aspernatur."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Dolorum consequatur in est.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Distinctio sunt aliquid harum quis nam rerum.","label":"Excepturi blanditiis officiis quia quisquam.","page_id":"Distinctio voluptas eius error autem est."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Enim non rem error voluptas deserunt.","customer_id":"Officiis aperiam quos.","label":"Nihil dolores perspiciatis porro veniam distinctio."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Sit tempore."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Deserunt in hic dolorum facere ipsa et.","label":"Repellat veniam."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"LFX V2 - Campaign Service","description":"A collection of service endpoints to support Marketing Operations campaign creation and management.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for lfx-v2-campaign-service"}],"paths":{"/projects/{project_id}/briefs":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-brief lfx-v2-campaign-service-briefs","description":"Create a brief.","operationId":"lfx-v2-campaign-service-briefs#create-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Autem veniam.","event_details":"Vel autem voluptates.","event_slug":"Et est laboriosam.","keywords":"Enim unde omnis.","platforms":["Nam exercitationem consectetur sint.","Necessitatibus ex ea ullam corrupti.","Et omnis accusantium.","Iure modi asperiores ut."],"program_type":"education","targeting":"Quam sed rem quia consequuntur ut.","url":"Facere sint totam sapiente vitae numquam ut."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Hic ea et."},"example":"Et et commodi autem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief2"},"example":{"copy":"Aperiam eum.","event_details":"Beatae soluta molestiae nihil quia omnis.","event_slug":"Fuga recusandae odio nulla ut laboriosam.","id":"Dolor molestias ipsa dolorum est.","keywords":"Quam et voluptatibus illum dolorem.","platforms":["Suscipit corrupti reiciendis et.","Saepe consequatur.","Sequi et."],"program_type":"education","project_id":"Blanditiis quidem qui iusto sed.","status":"approved","targeting":"Eum dolorum.","url":"Rerum delectus velit.","version":6878204844566876538}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}":{"delete":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"delete-brief lfx-v2-campaign-service-briefs","description":"Archive a brief (soft delete).","operationId":"lfx-v2-campaign-service-briefs#delete-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"9bc01b99-89ba-4efb-8538-2b1612fe241d","format":"uuid"},"example":"4185e754-4b3e-4607-95ac-0588f14c2d07"}],"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-brief lfx-v2-campaign-service-briefs","description":"Get a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"e3374dee-25a0-47a6-894e-2c8dacc2c71c","format":"uuid"},"example":"9717fe0e-7c86-4c49-90fb-b9d2643146d7"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolores in."},"example":"Velit eligendi omnis est vel est et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief3"},"example":{"copy":"Voluptatem voluptas omnis est tempora ipsum aut.","event_details":"Alias non sequi consequatur dolorum.","event_slug":"Et nihil.","id":"Et placeat.","keywords":"Harum et minus voluptas.","platforms":["Voluptas culpa.","Quia tenetur ducimus.","Facere harum enim consequatur id voluptatem."],"program_type":"membership","project_id":"Qui esse.","status":"draft","targeting":"Debitis labore aut.","url":"Sequi quis.","version":1292213403290328942}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-brief lfx-v2-campaign-service-briefs","description":"Replace a brief (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"cc32c8e5-5ca3-4bd4-b68b-42bdfc7b7724","format":"uuid"},"example":"9f0f6183-8826-466a-a574-30f45cedcda5"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBriefRequestBody"},"example":{"brief":{"copy":"Autem veniam.","event_details":"Vel autem voluptates.","event_slug":"Et est laboriosam.","keywords":"Enim unde omnis.","platforms":["Nam exercitationem consectetur sint.","Necessitatibus ex ea ullam corrupti.","Et omnis accusantium.","Iure modi asperiores ut."],"program_type":"education","targeting":"Quam sed rem quia consequuntur ut.","url":"Facere sint totam sapiente vitae numquam ut."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Necessitatibus fugit voluptates pariatur facilis nostrum sint."},"example":"Possimus qui est numquam omnis nihil."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief4"},"example":{"copy":"Aut et.","event_details":"Tenetur velit quaerat aut.","event_slug":"Hic delectus.","id":"Architecto vel.","keywords":"Harum provident quia distinctio ea.","platforms":["Aliquam consequuntur quo aliquid ducimus.","Facilis facilis aut suscipit aut odio iste.","Deleniti earum magni quibusdam."],"program_type":"education","project_id":"Vel autem modi id facere.","status":"draft","targeting":"Rem harum provident provident quia laboriosam magnam.","url":"Maxime ut possimus expedita.","version":4124348486962351749}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/approve":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"approve-brief lfx-v2-campaign-service-briefs","description":"Approve a brief for campaign creation.","operationId":"lfx-v2-campaign-service-briefs#approve-brief","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"fd5c9608-acd6-49e9-bb2e-de24b6d81a44","format":"uuid"},"example":"9cfebac2-eca8-4ba0-8c29-1102ebabcfea"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Animi ut aut excepturi temporibus ipsum perferendis."},"example":"Ipsum quos voluptas iure eum tempore."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief5"},"example":{"copy":"Iusto quidem laudantium.","event_details":"Est consequatur eveniet in fuga ut.","event_slug":"Velit est quis aliquid aliquam.","id":"Consectetur porro quo.","keywords":"Ratione consequuntur aut et corrupti.","platforms":["Aliquam quia officiis hic ea consequatur.","Dolor velit debitis vitae quae.","Sunt aperiam ex voluptatibus."],"program_type":"membership","project_id":"Incidunt aut aperiam et ipsam.","status":"draft","targeting":"Quaerat ut neque expedita nostrum.","url":"Voluptate nisi natus sint.","version":5518996230427104310}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns":{"post":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"create-campaigns lfx-v2-campaign-service-briefs","description":"Create campaigns across the selected platforms (async -\u003e job).","operationId":"lfx-v2-campaign-service-briefs#create-campaigns","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"fca41ae9-5cf1-4249-84ff-3c128c4d9604","format":"uuid"},"example":"edb87f72-22ea-4a62-9cc3-0f9ec1305513"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignsRequestBody"},"example":{"input":{"config":"Quia quos ut tempora consequuntur cumque repudiandae.","platforms":["microsoft-ads","microsoft-ads","linkedin-ads"]}}}}},"responses":{"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateResponse"},"example":{"job_id":"Enim non sint praesentium.","platforms":["Et veritatis voluptas nobis.","Doloremque architecto ea et.","Asperiores facere et exercitationem soluta possimus.","Aliquid et in."],"status":"queued"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/briefs/{brief_id}/campaigns/{campaign_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-campaign lfx-v2-campaign-service-briefs","description":"Get one campaign under a brief; returns ETag.","operationId":"lfx-v2-campaign-service-briefs#get-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"40b44584-e849-4e18-9ef0-4ccead532f00","format":"uuid"},"example":"a5be33ff-d12e-479b-ad6a-7cc2ed678259"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"3d5136fa-42a8-45c6-bec5-cf457b12b3c2","format":"uuid"},"example":"01450dd7-92b6-418d-a29c-b38911d10766"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Mollitia nam aspernatur itaque itaque recusandae."},"example":"Omnis doloribus eius molestias animi quas ut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign2"},"example":{"brief_id":"Illum rerum error incidunt.","campaign_name":"Et veritatis quisquam sed ratione et.","id":"Quo quidem.","platform":"Adipisci quaerat est nobis.","platform_campaign_id":"Fugit non fuga rem adipisci.","project_id":"Cumque totam nulla aut reprehenderit.","status":"Cumque molestiae eos rem aut.","version":90571920890933503}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"update-campaign lfx-v2-campaign-service-briefs","description":"Replace a campaign (requires If-Match).","operationId":"lfx-v2-campaign-service-briefs#update-campaign","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"brief_id","in":"path","description":"Brief UUID","required":true,"schema":{"type":"string","description":"Brief UUID","example":"9a0492f8-2923-44bc-8d2f-16bc941b2873","format":"uuid"},"example":"a22bdbd6-342c-4b01-a5f2-015845ba9835"},{"name":"campaign_id","in":"path","description":"Campaign UUID","required":true,"schema":{"type":"string","description":"Campaign UUID","example":"fde7d17f-00f1-46be-bf9e-fe43cfa50d20","format":"uuid"},"example":"1192ee6b-f97c-47cc-85c1-a249cf3a9953"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignRequestBody"},"example":{"campaign":{"campaign_name":"Eos doloribus autem corrupti sed voluptatum laborum.","config":"Perferendis qui maiores aut reiciendis.","status":"Suscipit quas sunt eos nulla."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quas odio."},"example":"Perferendis asperiores."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign3"},"example":{"brief_id":"Beatae placeat cumque iure veritatis cumque.","campaign_name":"Deserunt aliquid omnis explicabo doloremque et sed.","id":"Porro architecto.","platform":"Ex distinctio ipsum ab assumenda natus.","platform_campaign_id":"Esse est.","project_id":"Aperiam doloribus aut.","status":"Odio sunt totam.","version":9047518515926792446}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-google-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Google Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-google-ads lfx-v2-campaign-service-connections","description":"Get the project's Google Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Temporibus ut sint ipsam impedit et minima."},"example":"Vero quibusdam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection3"},"example":{"account_id":"Perspiciatis id.","has_credentials":true,"id":"Officia et sint numquam accusamus.","label":"Vel natus provident.","login_customer_id":"Aut et fuga enim nihil nihil quae.","project_id":"Eos et architecto voluptas.","status":"inactive","version":270615534997019024}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-google-ads lfx-v2-campaign-service-connections","description":"Create the project's Google Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Architecto itaque doloribus voluptatem consequatur quis fugiat.","client_secret":"Recusandae qui culpa.","developer_token":"Accusamus et atque enim.","refresh_token":"Dolorum minus voluptatem."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Maiores impedit consequuntur est fugit."},"example":"Accusantium et eos."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection2"},"example":{"account_id":"In recusandae maiores et voluptatem.","has_credentials":true,"id":"Fuga nostrum velit hic excepturi omnis.","label":"Odio labore pariatur nobis.","login_customer_id":"Doloribus qui consequatur et dignissimos ex.","project_id":"Distinctio quos ut unde et atque.","status":"error","version":8118771688807322679}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-google-ads lfx-v2-campaign-service-connections","description":"Replace the Google Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleAdsRequestBody"},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolor quia necessitatibus."},"example":"Excepturi iure voluptas voluptatem."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsConnection4"},"example":{"account_id":"Nobis soluta.","has_credentials":false,"id":"Vitae perspiciatis eveniet quibusdam nobis ut asperiores.","label":"Quis dicta voluptate aut in corporis.","login_customer_id":"Deleniti voluptas aperiam vel quae laudantium.","project_id":"Aut enim et.","status":"active","version":4385483960184879572}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-google-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Google Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Architecto itaque doloribus voluptatem consequatur quis fugiat.","client_secret":"Recusandae qui culpa.","developer_token":"Accusamus et atque enim.","refresh_token":"Dolorum minus voluptatem."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-google-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-google-ads lfx-v2-campaign-service-connections","description":"Verify the stored Google Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-google-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Rerum itaque consequatur laboriosam non.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-hubspot lfx-v2-campaign-service-connections","description":"Soft-delete the project's HubSpot connection.","operationId":"lfx-v2-campaign-service-connections#delete-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-hubspot lfx-v2-campaign-service-connections","description":"Get the project's HubSpot connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Sunt odit molestiae ab praesentium enim."},"example":"Earum non fugiat placeat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection3"},"example":{"account_id":"Molestiae suscipit non iusto.","brand_kit":"Et cupiditate molestiae ea ullam minima voluptatem.","has_credentials":false,"id":"Eaque ut laudantium nostrum ratione.","label":"Voluptate itaque fugit rerum cumque.","portal_id":"Soluta omnis eius dicta ut.","project_id":"Eius laborum.","sender_email":"Distinctio dolore velit pariatur.","sender_name":"Assumenda perspiciatis dolor porro.","status":"error","version":5347858386956008427}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-hubspot lfx-v2-campaign-service-connections","description":"Create the project's HubSpot connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHubspotRequestBody"},"example":{"config":{"account_id":"Maxime dicta qui aut.","brand_kit":"Corrupti voluptas.","label":"Dolor porro inventore alias error.","portal_id":"Suscipit eos nam ipsa.","sender_email":"Velit et impedit facilis quaerat.","sender_name":"Dolor ut velit quam omnis et dolor."},"credentials":{"private_app_token":"Vitae vel omnis autem accusamus mollitia."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ad a et inventore tempora facilis dolores."},"example":"Animi similique voluptatem vel voluptatibus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection2"},"example":{"account_id":"Esse voluptate eum laboriosam distinctio non.","brand_kit":"Harum eos eveniet ut.","has_credentials":false,"id":"Rem quia vel ipsam dolores.","label":"Ullam facilis ab sapiente voluptatem.","portal_id":"Id aut et adipisci quo ut.","project_id":"Et qui ut libero numquam.","sender_email":"Deserunt voluptates ut culpa saepe necessitatibus veritatis.","sender_name":"Enim id voluptas aperiam distinctio.","status":"inactive","version":8626906144120400240}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-hubspot lfx-v2-campaign-service-connections","description":"Replace the HubSpot connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHubspotRequestBody"},"example":{"config":{"account_id":"Maxime dicta qui aut.","brand_kit":"Corrupti voluptas.","label":"Dolor porro inventore alias error.","portal_id":"Suscipit eos nam ipsa.","sender_email":"Velit et impedit facilis quaerat.","sender_name":"Dolor ut velit quam omnis et dolor."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Amet quam consequuntur nulla quaerat."},"example":"Commodi dolores autem doloribus laborum et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubspotConnection4"},"example":{"account_id":"Non unde.","brand_kit":"Incidunt velit provident perspiciatis.","has_credentials":true,"id":"Quia minus vero.","label":"Fugit alias nisi qui maiores.","portal_id":"Doloremque explicabo ut.","project_id":"Ut quis animi molestiae.","sender_email":"Odio odio sed minus quia quia ea.","sender_name":"Autem iste ea in ipsa.","status":"error","version":7175407383173057293}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-hubspot lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) HubSpot credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialHubspotRequestBody"},"example":{"credentials":{"private_app_token":"Vitae vel omnis autem accusamus mollitia."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-hubspot/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-hubspot lfx-v2-campaign-service-connections","description":"Verify the stored HubSpot credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-hubspot","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Sunt itaque omnis ut ex sunt sit.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-linkedin-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's LinkedIn Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-linkedin-ads lfx-v2-campaign-service-connections","description":"Get the project's LinkedIn Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quo porro asperiores eum officiis."},"example":"Autem assumenda dolor qui ut facere."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection3"},"example":{"account_id":"Et eum est molestiae necessitatibus magni.","has_credentials":true,"id":"Voluptatibus deserunt.","label":"Et eligendi et numquam dolorum consequatur in.","org_id":"Deserunt ipsum dolorum quas error.","project_id":"Necessitatibus eos.","status":"error","version":3367774197321419764}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-linkedin-ads lfx-v2-campaign-service-connections","description":"Create the project's LinkedIn Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Temporibus et provident maiores neque.","org_id":"208777"},"credentials":{"access_token":"Illo minima eaque earum."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Est similique rerum consequatur."},"example":"Aut consectetur mollitia repellat."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection2"},"example":{"account_id":"Qui enim cumque saepe.","has_credentials":true,"id":"Eligendi tempore provident dicta temporibus debitis porro.","label":"Aperiam quis quis reprehenderit non quae.","org_id":"Accusantium aut.","project_id":"Odio incidunt distinctio sint.","status":"error","version":6613376414740649303}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the LinkedIn Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkedinAdsRequestBody"},"example":{"config":{"account_id":"538170226","label":"Temporibus et provident maiores neque.","org_id":"208777"}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Qui veniam architecto deleniti adipisci quas itaque."},"example":"Fuga rerum iure possimus et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedinAdsConnection4"},"example":{"account_id":"Est rerum.","has_credentials":true,"id":"Et accusamus sed non sequi.","label":"Sunt est labore libero.","org_id":"Natus expedita aspernatur consequuntur quod ducimus molestias.","project_id":"Assumenda quam deleniti et et nam quia.","status":"error","version":313762477408274568}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-linkedin-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) LinkedIn Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialLinkedinAdsRequestBody"},"example":{"credentials":{"access_token":"Illo minima eaque earum."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-linkedin-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-linkedin-ads lfx-v2-campaign-service-connections","description":"Verify the stored LinkedIn Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-linkedin-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptatem iste nisi in aperiam.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-meta-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Meta Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-meta-ads lfx-v2-campaign-service-connections","description":"Get the project's Meta Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et voluptatum excepturi nemo."},"example":"Veniam doloremque dolores voluptatum aut mollitia aperiam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection3"},"example":{"account_id":"Est distinctio sunt aliquid harum quis nam.","app_id":"Consectetur sint error ipsam maiores.","has_credentials":true,"id":"Facilis qui ducimus modi ut culpa.","label":"Eius error autem.","page_id":"Rerum illo mollitia odio et dolor.","project_id":"Blanditiis officiis quia quisquam corrupti distinctio.","status":"active","version":2737266573164142326}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-meta-ads lfx-v2-campaign-service-connections","description":"Create the project's Meta Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Qui rerum est sed sed.","label":"Quis quam dolor occaecati earum iusto rerum.","page_id":"Cupiditate nobis."},"credentials":{"access_token":"Enim ea.","app_secret":"Quidem molestiae deleniti omnis."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Hic voluptatibus accusamus vel."},"example":"Quo maxime laboriosam alias molestiae ea."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection2"},"example":{"account_id":"Sed numquam necessitatibus laudantium est ut.","app_id":"Voluptatem possimus et corrupti et nobis.","has_credentials":false,"id":"Nostrum corporis quasi magnam.","label":"Ipsa quo vel architecto quas eligendi impedit.","page_id":"Qui possimus.","project_id":"Qui quidem exercitationem.","status":"deleted","version":5650595339177390494}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-meta-ads lfx-v2-campaign-service-connections","description":"Replace the Meta Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMetaAdsRequestBody"},"example":{"config":{"account_id":"act_193556282970417","app_id":"Qui rerum est sed sed.","label":"Quis quam dolor occaecati earum iusto rerum.","page_id":"Cupiditate nobis."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Porro et fuga facere est qui vero."},"example":"Molestias quisquam est."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdsConnection4"},"example":{"account_id":"Porro voluptate.","app_id":"Velit dolores omnis placeat unde distinctio ducimus.","has_credentials":false,"id":"Perspiciatis deleniti.","label":"Facilis suscipit.","page_id":"Eligendi quasi eos ipsa et dolore.","project_id":"Non sint inventore iste iure ut.","status":"error","version":7363633618316247458}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-meta-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Meta Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialMetaAdsRequestBody"},"example":{"credentials":{"access_token":"Enim ea.","app_secret":"Quidem molestiae deleniti omnis."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-meta-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-meta-ads lfx-v2-campaign-service-connections","description":"Verify the stored Meta Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-meta-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Dignissimos non sed omnis officiis et.","ok":true}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-microsoft-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Microsoft Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-microsoft-ads lfx-v2-campaign-service-connections","description":"Get the project's Microsoft Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Soluta porro distinctio cupiditate."},"example":"Voluptatem optio perspiciatis reprehenderit."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection3"},"example":{"account_id":"Deserunt quod.","customer_id":"Nisi blanditiis eveniet quasi ea.","has_credentials":true,"id":"Perspiciatis porro.","label":"Rem error.","project_id":"Distinctio amet enim.","status":"active","version":3519020753859014023}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-microsoft-ads lfx-v2-campaign-service-connections","description":"Create the project's Microsoft Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Ut necessitatibus dolor nemo.","customer_id":"Nisi numquam nihil id unde.","label":"Voluptatem sed illo numquam praesentium tenetur quas."},"credentials":{"client_id":"Officiis aut fugiat optio ut.","client_secret":"Et voluptas tenetur nobis facere.","developer_token":"Blanditiis mollitia dolores illo nostrum magnam.","refresh_token":"Quo corporis recusandae dicta quibusdam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Ipsum ullam quis est incidunt debitis qui."},"example":"Quia sunt dignissimos pariatur dolorem natus."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection2"},"example":{"account_id":"Eum et ipsum expedita reprehenderit eos.","customer_id":"Deleniti nostrum.","has_credentials":true,"id":"Omnis nobis.","label":"Rerum explicabo.","project_id":"Deserunt repellendus corrupti itaque quo sit.","status":"deleted","version":7665319414608673783}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the Microsoft Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMicrosoftAdsRequestBody"},"example":{"config":{"account_id":"Ut necessitatibus dolor nemo.","customer_id":"Nisi numquam nihil id unde.","label":"Voluptatem sed illo numquam praesentium tenetur quas."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Necessitatibus quam."},"example":"Assumenda repellat et rerum cum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftAdsConnection4"},"example":{"account_id":"Labore omnis provident nihil aut rerum est.","customer_id":"Corporis sint non dolorem repellendus.","has_credentials":false,"id":"Vel voluptate necessitatibus.","label":"Mollitia aut rerum quis et modi.","project_id":"Et et itaque sunt.","status":"active","version":2920255620636300538}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-microsoft-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Microsoft Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialGoogleAdsRequestBody"},"example":{"credentials":{"client_id":"Officiis aut fugiat optio ut.","client_secret":"Et voluptas tenetur nobis facere.","developer_token":"Blanditiis mollitia dolores illo nostrum magnam.","refresh_token":"Quo corporis recusandae dicta quibusdam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-microsoft-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-microsoft-ads lfx-v2-campaign-service-connections","description":"Verify the stored Microsoft Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-microsoft-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Distinctio dolor aut assumenda fugiat quia.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-reddit-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's Reddit Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-reddit-ads lfx-v2-campaign-service-connections","description":"Get the project's Reddit Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Et et."},"example":"At qui error totam aut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection3"},"example":{"account_id":"Unde dicta autem dolorem qui explicabo.","has_credentials":true,"id":"Omnis neque autem ex eos.","label":"A necessitatibus molestiae.","project_id":"Eum et sint corrupti eos.","status":"deleted","version":4219814008454412160}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-reddit-ads lfx-v2-campaign-service-connections","description":"Create the project's Reddit Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Laboriosam qui id enim."},"credentials":{"client_id":"Magni repudiandae.","client_secret":"Nihil corrupti repellat eius.","refresh_token":"Qui nobis et delectus quam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quos atque dolorem error fugiat qui."},"example":"Enim molestiae suscipit sequi et."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection2"},"example":{"account_id":"Pariatur debitis.","has_credentials":true,"id":"Est dolor ut corporis.","label":"Illo vitae occaecati omnis.","project_id":"Cupiditate ut illo dolor quaerat totam.","status":"active","version":1381780689877724774}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the Reddit Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedditAdsRequestBody"},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Laboriosam qui id enim."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Veritatis culpa quasi qui iure consequuntur porro."},"example":"Nobis quas sunt dolorum."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedditAdsConnection4"},"example":{"account_id":"Perferendis velit atque.","has_credentials":true,"id":"Ut similique ea minima magnam non ut.","label":"Est dolores est et recusandae nihil.","project_id":"Iure nam.","status":"active","version":4591742417728159020}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-reddit-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) Reddit Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialRedditAdsRequestBody"},"example":{"credentials":{"client_id":"Magni repudiandae.","client_secret":"Nihil corrupti repellat eius.","refresh_token":"Qui nobis et delectus quam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-reddit-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-reddit-ads lfx-v2-campaign-service-connections","description":"Verify the stored Reddit Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-reddit-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Adipisci sint enim.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads":{"delete":{"tags":["lfx-v2-campaign-service-connections"],"summary":"delete-twitter-ads lfx-v2-campaign-service-connections","description":"Soft-delete the project's X/Twitter Ads connection.","operationId":"lfx-v2-campaign-service-connections#delete-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"204":{"description":"No Content response."},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"get":{"tags":["lfx-v2-campaign-service-connections"],"summary":"get-twitter-ads lfx-v2-campaign-service-connections","description":"Get the project's X/Twitter Ads connection (credentials redacted; returns ETag).","operationId":"lfx-v2-campaign-service-connections#get-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Quasi vel sint nisi laborum laboriosam assumenda."},"example":"Ut totam quia ipsam quia ut quibusdam."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection3"},"example":{"account_id":"Magni consequatur dignissimos itaque quia.","funding_instrument_id":"Et voluptatem deserunt consequuntur omnis sed dolore.","has_credentials":true,"id":"Repellat assumenda nesciunt distinctio eaque aliquam.","label":"Et reprehenderit dignissimos.","project_id":"Veniam consectetur deserunt in hic dolorum facere.","status":"inactive","version":7072791787806691868}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"create-twitter-ads lfx-v2-campaign-service-connections","description":"Create the project's X/Twitter Ads connection (singleton; 409 if one already exists).","operationId":"lfx-v2-campaign-service-connections#create-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Dolorem non laudantium sunt minima repudiandae illo.","label":"Labore esse."},"credentials":{"access_token":"Deleniti placeat fuga aut saepe.","access_token_secret":"Reiciendis pariatur repellat.","consumer_key":"Nulla dolorum deserunt ut sit dolor.","consumer_secret":"Eos nihil ipsam ex odio totam."}}}}},"responses":{"201":{"description":"Created response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Eum aut delectus voluptatem."},"example":"Repudiandae sequi."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection2"},"example":{"account_id":"Illum illum dolores tenetur ut illum.","funding_instrument_id":"Delectus est aut et rerum in expedita.","has_credentials":true,"id":"Omnis consequatur.","label":"Voluptatum ducimus tempore quae eum consequatur dolore.","project_id":"Cum non atque aut autem sint.","status":"active","version":1365614189000530579}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"409":{"description":"Conflict: A connection already exists for this provider on the project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]},"put":{"tags":["lfx-v2-campaign-service-connections"],"summary":"update-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the X/Twitter Ads connection config (requires If-Match; does not set credentials).","operationId":"lfx-v2-campaign-service-connections#update-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"If-Match","in":"header","description":"If-Match header carrying the current ETag/version","allowEmptyValue":true,"schema":{"type":"string","description":"If-Match header carrying the current ETag/version","example":"3"},"example":"3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTwitterAdsRequestBody"},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Dolorem non laudantium sunt minima repudiandae illo.","label":"Labore esse."}}}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag header value (mirrors version)","schema":{"type":"string","description":"ETag header value (mirrors version)","example":"Delectus vel."},"example":"Iure doloremque vel et aut."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterAdsConnection4"},"example":{"account_id":"Quam officiis aut sit architecto ut unde.","funding_instrument_id":"Voluptates atque.","has_credentials":false,"id":"Sunt qui cupiditate ullam ab suscipit et.","label":"Assumenda dignissimos beatae vitae aut ea dolor.","project_id":"Harum corporis deleniti doloribus.","status":"active","version":7481335546350109928}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"412":{"description":"PreconditionFailed: ETag mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionFailedError"},"example":{"code":"412","message":"The supplied ETag does not match the current version."}}}},"428":{"description":"PreconditionRequired: If-Match header required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreconditionRequiredError"},"example":{"code":"428","message":"An If-Match header is required."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/set-credential":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"set-credential-twitter-ads lfx-v2-campaign-service-connections","description":"Replace the stored (encrypted) X/Twitter Ads credential. Separate from update so credential replacement is independently permissioned and audited. Not a rotate — the service does not generate or swap secrets upstream.","operationId":"lfx-v2-campaign-service-connections#set-credential-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCredentialTwitterAdsRequestBody"},"example":{"credentials":{"access_token":"Deleniti placeat fuga aut saepe.","access_token_secret":"Reiciendis pariatur repellat.","consumer_key":"Nulla dolorum deserunt ut sit dolor.","consumer_secret":"Eos nihil ipsam ex odio totam."}}}}},"responses":{"204":{"description":"No Content response."},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/connection-twitter-ads/test":{"post":{"tags":["lfx-v2-campaign-service-connections"],"summary":"test-twitter-ads lfx-v2-campaign-service-connections","description":"Verify the stored X/Twitter Ads credential against the provider.","operationId":"lfx-v2-campaign-service-connections#test-twitter-ads","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResult"},"example":{"message":"Voluptate reprehenderit.","ok":false}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}},"/projects/{project_id}/jobs/{job_id}":{"get":{"tags":["lfx-v2-campaign-service-briefs"],"summary":"get-job lfx-v2-campaign-service-briefs","description":"Poll campaign-creation job status.","operationId":"lfx-v2-campaign-service-briefs#get-job","parameters":[{"name":"project_id","in":"path","description":"Project UUID or slug that scopes the connection","required":true,"schema":{"type":"string","description":"Project UUID or slug that scopes the connection","example":"cncf"},"example":"cncf"},{"name":"job_id","in":"path","description":"Job UUID","required":true,"schema":{"type":"string","description":"Job UUID","example":"35d610c9-3332-4801-9b65-11002ee56afa","format":"uuid"},"example":"a22e3d45-a3ff-4bb1-9983-d7ce7173fde7"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPollResponse"},"example":{"error":"Aut aut ducimus dolores.","job_id":"Accusantium enim temporibus dolor ipsam.","result":[{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."},{"campaign_id":"Quisquam voluptatibus sint quia.","error":"Tempore nemo illum ut maiores.","ok":false,"platform":"Officiis est."}],"status":"failed"}}}},"400":{"description":"BadRequest: Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"},"example":{"code":"400","message":"The request was invalid."}}}},"404":{"description":"NotFound: Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"},"example":{"code":"404","message":"The connection was not found."}}}},"409":{"description":"Conflict: Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictError"},"example":{"code":"409","message":"A connection for this provider already exists on the project."}}}},"500":{"description":"InternalServerError: Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalServerError"},"example":{"code":"500","message":"An internal server error occurred."}}}},"503":{"description":"ServiceUnavailable: Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnServiceUnavailableError"},"example":{"code":"503","message":"The service is unavailable."}}}}},"security":[{"jwt_header_Authorization":[]}]}}},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"400"},"message":{"type":"string","description":"Error message","example":"The request was invalid."}},"example":{"code":"400","message":"The request was invalid."},"required":["code","message"]},"Brief":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Eligendi ipsam aut vel atque."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"In voluptas."},"event_details":{"description":"Extracted event/course details","example":"Rerum cum eaque nesciunt est totam inventore."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Exercitationem eligendi magni quidem."},"id":{"type":"string","description":"Brief UUID","example":"Amet quaerat modi."},"keywords":{"description":"Keyword list","example":"Reiciendis sit minima."},"platforms":{"type":"array","items":{"type":"string","example":"Perspiciatis alias et amet ex molestiae."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Libero et consequuntur suscipit distinctio pariatur mollitia.","Autem quo tempora voluptate fuga.","Distinctio maiores mollitia aut."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"project_id":{"type":"string","description":"Owning project","example":"Eum totam voluptatem eos."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Unde et."},"url":{"type":"string","description":"Event/course page URL","example":"In quia."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1675828466631258091,"format":"int64"}},"example":{"copy":"Magni eos voluptatem sint hic ut.","etag":"Nisi repudiandae.","event_details":"Molestiae eius in reprehenderit nobis hic.","event_slug":"Est natus sequi beatae.","id":"Placeat dolores numquam molestias quibusdam aliquid.","keywords":"Harum aliquam sunt eum.","platforms":["Similique omnis.","Aliquid dignissimos minima aut fugit.","Et iure laudantium quia est molestiae.","Ipsum neque sapiente aliquid quidem velit."],"program_type":"events","project_id":"Fuga est aliquam debitis.","status":"draft","targeting":"Eaque occaecati.","url":"Aut omnis labore et quis consequatur dolores.","version":1167300153394787715},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief2":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Quo veritatis nisi velit distinctio animi."},"event_details":{"description":"Extracted event/course details","example":"Sapiente perspiciatis dolores dignissimos soluta non vel."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Aut mollitia pariatur perferendis placeat dolores."},"id":{"type":"string","description":"Brief UUID","example":"Sint nisi sunt sed."},"keywords":{"description":"Keyword list","example":"Provident rerum et voluptas tenetur esse."},"platforms":{"type":"array","items":{"type":"string","example":"Qui pariatur odio reprehenderit nam."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Et id sint suscipit quia ipsa voluptas.","Non neque optio.","Architecto molestiae cum.","Perspiciatis consequatur beatae sunt officiis sequi qui."]},"program_type":{"type":"string","description":"Funnel context","example":"membership","enum":["events","education","membership"]},"project_id":{"type":"string","description":"Owning project","example":"Dolor eaque culpa quae eius omnis id."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Assumenda sed minima nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Dolore voluptatem qui eveniet amet."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":9087350093442770114,"format":"int64"}},"example":{"copy":"Dolor cumque dolores.","event_details":"Ad et in voluptatem et perspiciatis.","event_slug":"Quia aut impedit a veritatis.","id":"Voluptatem vel dolor molestiae quia voluptatem.","keywords":"Aut ratione dicta.","platforms":["Qui voluptas veniam.","Voluptas maxime non illo ab in voluptatem.","Est magnam molestiae soluta."],"program_type":"education","project_id":"Libero qui.","status":"draft","targeting":"Aspernatur culpa sed non qui ad.","url":"Consequuntur sed ea sunt debitis.","version":1905073879386313651},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief3":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Alias quis magni ad doloremque."},"event_details":{"description":"Extracted event/course details","example":"Facere iste."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Reprehenderit saepe quas commodi qui qui mollitia."},"id":{"type":"string","description":"Brief UUID","example":"Facere rerum voluptatem saepe eligendi."},"keywords":{"description":"Keyword list","example":"Et quam totam."},"platforms":{"type":"array","items":{"type":"string","example":"Reiciendis numquam consequatur."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Qui eaque ut iste.","Aspernatur delectus rem."]},"program_type":{"type":"string","description":"Funnel context","example":"education","enum":["events","education","membership"]},"project_id":{"type":"string","description":"Owning project","example":"Non minima possimus totam occaecati enim eaque."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Eos repudiandae voluptate est enim aut laborum."},"url":{"type":"string","description":"Event/course page URL","example":"Recusandae voluptates."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7978828505057037537,"format":"int64"}},"example":{"copy":"Quae qui optio magni itaque iure.","event_details":"Placeat dolores culpa sed.","event_slug":"Autem ullam.","id":"Est et beatae.","keywords":"Autem aperiam quis.","platforms":["Eveniet explicabo voluptatem et quis.","Ea ut voluptatem velit.","Aut est est eum ut ut.","Et molestiae blanditiis nihil dolor exercitationem."],"program_type":"events","project_id":"Est officiis enim qui.","status":"archived","targeting":"Enim odit numquam.","url":"Quis sed consequatur velit atque nam.","version":4992739119008200883},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief4":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Dolor eum et consequatur."},"event_details":{"description":"Extracted event/course details","example":"Quae adipisci doloribus ullam."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Dignissimos aut eaque."},"id":{"type":"string","description":"Brief UUID","example":"Dolores at voluptatem beatae quis dignissimos."},"keywords":{"description":"Keyword list","example":"Optio enim nisi doloremque rerum sed consequatur."},"platforms":{"type":"array","items":{"type":"string","example":"Fuga ducimus dolorem ut."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Ad optio magnam sequi esse.","Modi vel aut rerum.","Ad minus vero assumenda cum nemo.","Nobis assumenda aut dolorem ea veniam."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"project_id":{"type":"string","description":"Owning project","example":"Et labore sit."},"status":{"type":"string","description":"Lifecycle status","example":"approved","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Quia amet vero dolorum incidunt officia nihil."},"url":{"type":"string","description":"Event/course page URL","example":"Autem ut unde dolore id a."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2033029701447525509,"format":"int64"}},"example":{"copy":"Corrupti sint molestiae occaecati est.","event_details":"Nam eius nulla suscipit ullam.","event_slug":"Sint consequuntur omnis distinctio possimus non aliquid.","id":"Perferendis tempore eum laboriosam.","keywords":"Labore est ut ratione nobis ut occaecati.","platforms":["Est et est.","Deleniti non in iure dolores et quis.","Recusandae similique assumenda ut quia.","Nesciunt minus natus non."],"program_type":"membership","project_id":"Odio at magnam saepe incidunt.","status":"approved","targeting":"Minima veritatis sed impedit laborum.","url":"Facilis neque sed alias dolore id.","version":7666233696583259840},"required":["id","project_id","program_type","event_slug","status","version"]},"Brief5":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Consequatur laborum."},"event_details":{"description":"Extracted event/course details","example":"Cum ipsa molestias voluptatibus nam debitis hic."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Et et iure tempora exercitationem voluptatum."},"id":{"type":"string","description":"Brief UUID","example":"Ut qui sed explicabo dolorem totam non."},"keywords":{"description":"Keyword list","example":"Beatae non et excepturi sit minus."},"platforms":{"type":"array","items":{"type":"string","example":"Ut corrupti sunt labore."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Cum ipsum quo possimus.","Quam culpa."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"project_id":{"type":"string","description":"Owning project","example":"Nesciunt sed magnam sed vero nulla."},"status":{"type":"string","description":"Lifecycle status","example":"archived","enum":["draft","approved","archived"]},"targeting":{"description":"Targeting recommendation","example":"Et quisquam dicta."},"url":{"type":"string","description":"Event/course page URL","example":"Autem et."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6074244296634719915,"format":"int64"}},"example":{"copy":"Adipisci vel.","event_details":"Et eum ex doloremque quia.","event_slug":"Ipsam consequatur qui illo totam.","id":"Est libero enim quo sit aut tempora.","keywords":"Eum itaque.","platforms":["Expedita commodi in dolores.","Similique eaque autem impedit tenetur voluptatibus.","Libero quia quam harum molestiae cupiditate."],"program_type":"membership","project_id":"Neque assumenda sed.","status":"draft","targeting":"Recusandae recusandae est et fuga veniam natus.","url":"Dignissimos in tempore quo consequatur sint qui.","version":3604003677758724955},"required":["id","project_id","program_type","event_slug","status","version"]},"BriefInput":{"type":"object","properties":{"copy":{"description":"Ad copy","example":"Praesentium et."},"event_details":{"description":"Extracted event/course details","example":"Dolor consectetur eos iste."},"event_slug":{"type":"string","description":"Event/course slug (unique within the project)","example":"Porro commodi odio sunt esse."},"keywords":{"description":"Keyword list","example":"Veniam iusto consequatur quia sed officia eligendi."},"platforms":{"type":"array","items":{"type":"string","example":"Itaque voluptatem est quis impedit."},"description":"Suggested default platforms (a planning hint; binding selection is on the campaign)","example":["Harum et consequatur eligendi eum necessitatibus.","Magnam ut.","Voluptate voluptates corrupti sapiente.","Dolorum repellat expedita ut recusandae dolor."]},"program_type":{"type":"string","description":"Funnel context","example":"events","enum":["events","education","membership"]},"targeting":{"description":"Targeting recommendation","example":"Qui impedit."},"url":{"type":"string","description":"Event/course page URL","example":"Incidunt eos dolores laborum sed molestias."}},"example":{"copy":"Animi sit esse ratione aliquid.","event_details":"Repudiandae tenetur aperiam saepe vel.","event_slug":"Alias minus reprehenderit dignissimos aut velit.","keywords":"Laborum est quasi dignissimos.","platforms":["Omnis doloribus.","Cum ut quo.","Necessitatibus id sint dicta assumenda omnis voluptatem.","Praesentium voluptatem blanditiis non totam temporibus."],"program_type":"events","targeting":"Velit quis harum recusandae est ipsum.","url":"At sint laborum veniam."},"required":["program_type","event_slug"]},"Campaign":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Qui mollitia et eum veniam."},"campaign_name":{"type":"string","description":"Campaign name","example":"Culpa sed minima iure."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Et tempora quaerat et eius."},"id":{"type":"string","description":"Campaign UUID","example":"Sint qui alias voluptatem ut."},"platform":{"type":"string","description":"Channel","example":"Aliquam eaque voluptatem omnis."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Cupiditate aut."},"project_id":{"type":"string","description":"Owning project","example":"Ut recusandae modi."},"status":{"type":"string","description":"Campaign status","example":"Enim occaecati beatae eveniet molestiae ad voluptatum."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1755263284665276006,"format":"int64"}},"example":{"brief_id":"Et asperiores.","campaign_name":"Voluptatem aut debitis vitae unde velit eos.","etag":"Et et itaque qui repudiandae magnam.","id":"Magni illum consequatur quaerat soluta.","platform":"Maiores reiciendis.","platform_campaign_id":"Dolor ipsam recusandae maxime nesciunt repellendus.","project_id":"Vitae autem in.","status":"Accusantium odit rerum commodi ea.","version":3660260905327304928},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign2":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Velit at omnis autem."},"campaign_name":{"type":"string","description":"Campaign name","example":"Laboriosam et."},"id":{"type":"string","description":"Campaign UUID","example":"Doloremque odio."},"platform":{"type":"string","description":"Channel","example":"Ratione est omnis voluptas praesentium."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Aspernatur voluptatum facilis."},"project_id":{"type":"string","description":"Owning project","example":"Ipsum expedita animi."},"status":{"type":"string","description":"Campaign status","example":"Sapiente alias et error nobis minima."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4893105039439918924,"format":"int64"}},"example":{"brief_id":"Tempora rem ab earum debitis rerum perspiciatis.","campaign_name":"Voluptas itaque quo soluta maxime temporibus earum.","id":"Dolorem impedit qui.","platform":"Pariatur quae amet officia.","platform_campaign_id":"Quam nostrum.","project_id":"Ipsa ut animi fuga.","status":"Aperiam et ab.","version":8291275966671335223},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"Campaign3":{"type":"object","properties":{"brief_id":{"type":"string","description":"Parent brief","example":"Aut est et."},"campaign_name":{"type":"string","description":"Campaign name","example":"Consequatur nemo molestiae modi ut non atque."},"id":{"type":"string","description":"Campaign UUID","example":"Vel quia cum quas."},"platform":{"type":"string","description":"Channel","example":"Debitis ea molestiae eum voluptatum."},"platform_campaign_id":{"type":"string","description":"ID returned by the ad platform","example":"Illo eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Minus sit necessitatibus."},"status":{"type":"string","description":"Campaign status","example":"Sed commodi voluptatibus."},"version":{"type":"integer","description":"Optimistic-concurrency version","example":5825805897083964981,"format":"int64"}},"example":{"brief_id":"Perspiciatis optio.","campaign_name":"Excepturi cumque ullam esse.","id":"Est fugit ratione consectetur.","platform":"Quia doloribus omnis et excepturi fugit dolores.","platform_campaign_id":"Quia voluptates voluptates nisi nihil aut molestias.","project_id":"Sed fuga facilis asperiores enim nisi.","status":"Non autem voluptatem ut.","version":7716950937642575525},"required":["id","project_id","brief_id","platform","campaign_name","status","version"]},"CampaignCreateInput":{"type":"object","properties":{"config":{"description":"Per-platform campaign configuration","example":"Omnis dolorem est aut quia recusandae."},"platforms":{"type":"array","items":{"type":"string","example":"hubspot","enum":["google-ads","linkedin-ads","meta-ads","reddit-ads","twitter-ads","microsoft-ads","hubspot"]},"description":"Platforms to create campaigns on (binding selection)","example":["google-ads"],"minItems":1}},"example":{"config":"Totam tempora vitae.","platforms":["reddit-ads"]},"required":["platforms"]},"CampaignUpdateInput":{"type":"object","properties":{"campaign_name":{"type":"string","description":"Campaign name","example":"Ullam qui rerum numquam quo."},"config":{"description":"Campaign configuration snapshot","example":"Quaerat molestias."},"status":{"type":"string","description":"Campaign status","example":"A quia magnam culpa ipsam totam."}},"example":{"campaign_name":"Sequi aut veniam ratione.","config":"Laboriosam cumque mollitia.","status":"Perferendis omnis ad voluptas esse."},"required":["campaign_name","status"]},"ConflictError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"409"},"message":{"type":"string","description":"Error message","example":"A connection for this provider already exists on the project."}},"example":{"code":"409","message":"A connection for this provider already exists on the project."},"required":["code","message"]},"ConnServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"ConnectionTestResult":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable detail","example":"Et enim totam et minima."},"ok":{"type":"boolean","description":"Whether the credential authenticated against the provider","example":false}},"example":{"message":"Est tempora qui.","ok":false},"required":["ok"]},"CreateBriefRequestBody":{"type":"object","properties":{"brief":{"$ref":"#/components/schemas/BriefInput"}},"example":{"brief":{"copy":"Autem veniam.","event_details":"Vel autem voluptates.","event_slug":"Et est laboriosam.","keywords":"Enim unde omnis.","platforms":["Nam exercitationem consectetur sint.","Necessitatibus ex ea ullam corrupti.","Et omnis accusantium.","Iure modi asperiores ut."],"program_type":"education","targeting":"Quam sed rem quia consequuntur ut.","url":"Facere sint totam sapiente vitae numquam ut."}},"required":["brief"]},"CreateCampaignsRequestBody":{"type":"object","properties":{"input":{"$ref":"#/components/schemas/CampaignCreateInput"}},"example":{"input":{"config":"Quia quos ut tempora consequuntur cumque repudiandae.","platforms":["microsoft-ads","microsoft-ads","linkedin-ads"]}},"required":["input"]},"CreateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"credentials":{"client_id":"Architecto itaque doloribus voluptatem consequatur quis fugiat.","client_secret":"Recusandae qui culpa.","developer_token":"Accusamus et atque enim.","refresh_token":"Dolorum minus voluptatem."}},"required":["config","credentials"]},"CreateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"},"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"config":{"account_id":"Maxime dicta qui aut.","brand_kit":"Corrupti voluptas.","label":"Dolor porro inventore alias error.","portal_id":"Suscipit eos nam ipsa.","sender_email":"Velit et impedit facilis quaerat.","sender_name":"Dolor ut velit quam omnis et dolor."},"credentials":{"private_app_token":"Vitae vel omnis autem accusamus mollitia."}},"required":["config","credentials"]},"CreateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"config":{"account_id":"538170226","label":"Temporibus et provident maiores neque.","org_id":"208777"},"credentials":{"access_token":"Illo minima eaque earum."}},"required":["config","credentials"]},"CreateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Qui rerum est sed sed.","label":"Quis quam dolor occaecati earum iusto rerum.","page_id":"Cupiditate nobis."},"credentials":{"access_token":"Enim ea.","app_secret":"Quidem molestiae deleniti omnis."}},"required":["config","credentials"]},"CreateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/MicrosoftAdsCredentials"}},"example":{"config":{"account_id":"Ut necessitatibus dolor nemo.","customer_id":"Nisi numquam nihil id unde.","label":"Voluptatem sed illo numquam praesentium tenetur quas."},"credentials":{"client_id":"Officiis aut fugiat optio ut.","client_secret":"Et voluptas tenetur nobis facere.","developer_token":"Blanditiis mollitia dolores illo nostrum magnam.","refresh_token":"Quo corporis recusandae dicta quibusdam."}},"required":["config","credentials"]},"CreateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Laboriosam qui id enim."},"credentials":{"client_id":"Magni repudiandae.","client_secret":"Nihil corrupti repellat eius.","refresh_token":"Qui nobis et delectus quam."}},"required":["config","credentials"]},"CreateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"},"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Dolorem non laudantium sunt minima repudiandae illo.","label":"Labore esse."},"credentials":{"access_token":"Deleniti placeat fuga aut saepe.","access_token_secret":"Reiciendis pariatur repellat.","consumer_key":"Nulla dolorum deserunt ut sit dolor.","consumer_secret":"Eos nihil ipsam ex odio totam."}},"required":["config","credentials"]},"GoogleAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Voluptatem repellat expedita inventore."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"In doloremque autem maxime hic aliquam ratione."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit provident sed quo aperiam."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus harum voluptates sit est corporis."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Reprehenderit amet hic est odio."},"project_id":{"type":"string","description":"Owning project","example":"Aspernatur nihil et incidunt dolorem dolor sed."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2066924184302318041,"format":"int64"}},"example":{"account_id":"Ullam ipsum.","etag":"Dolore sed.","has_credentials":false,"id":"Occaecati rerum reiciendis.","label":"Magnam voluptates molestiae libero autem quod.","login_customer_id":"Sunt accusantium totam quia.","project_id":"Esse mollitia et dolorum accusantium aspernatur quos.","status":"error","version":3252068377050447352},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"GoogleAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Corporis et iste impedit voluptas."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Non recusandae et qui ut exercitationem officia."},"label":{"type":"string","description":"Optional friendly name","example":"Unde quia ipsa sint optio nobis quae."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Accusamus provident omnis."},"project_id":{"type":"string","description":"Owning project","example":"Tempora ea laboriosam."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3989869738197030603,"format":"int64"}},"example":{"account_id":"Repellendus saepe voluptatem dolores.","has_credentials":false,"id":"Eos earum fuga.","label":"Reiciendis similique laborum tempora qui incidunt.","login_customer_id":"Voluptates soluta animi sit ut.","project_id":"Est facilis.","status":"deleted","version":3133980880975603750},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Earum temporibus ipsum necessitatibus ratione possimus eum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Voluptas incidunt eligendi consequatur."},"label":{"type":"string","description":"Optional friendly name","example":"Illo repellat et cum."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Consequatur consequatur."},"project_id":{"type":"string","description":"Owning project","example":"Labore eos et repudiandae odit omnis cupiditate."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2647723585259991483,"format":"int64"}},"example":{"account_id":"Quaerat iure ipsam.","has_credentials":false,"id":"Et vel molestiae quo.","label":"Et sed debitis.","login_customer_id":"Aut minima adipisci aut quia quisquam veniam.","project_id":"Placeat reprehenderit natus pariatur.","status":"active","version":7897706105846459095},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Molestiae cupiditate quis modi blanditiis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Facilis sit autem."},"label":{"type":"string","description":"Optional friendly name","example":"Accusantium expedita alias placeat incidunt sit perspiciatis."},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"Magni sit harum."},"project_id":{"type":"string","description":"Owning project","example":"Nihil qui doloremque nam magnam aliquid impedit."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7345260181453091454,"format":"int64"}},"example":{"account_id":"Repellendus adipisci sit et enim quasi ut.","has_credentials":true,"id":"Et distinctio dignissimos fugiat voluptatibus natus.","label":"Dolorem omnis aspernatur veritatis adipisci.","login_customer_id":"Amet sed ipsam enim esse.","project_id":"Commodi et nihil et.","status":"active","version":2256303273039083512},"required":["id","project_id","account_id","has_credentials","status","version"]},"GoogleAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Google Ads customer ID","example":"8666746580"},"label":{"type":"string","description":"Optional friendly name","example":"TLF Main"},"login_customer_id":{"type":"string","description":"Manager account used for API access","example":"9746983954"}},"example":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"},"required":["account_id"]},"GoogleAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"In praesentium cumque."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Pariatur odio molestias voluptatum."},"developer_token":{"type":"string","description":"Google Ads developer token","example":"Nulla perferendis possimus deserunt iure et."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Voluptas necessitatibus cumque non porro qui molestias."}},"description":"Google Ads OAuth credential set. Write-only; never returned.","example":{"client_id":"Qui omnis nesciunt qui consequuntur.","client_secret":"Fuga atque.","developer_token":"Sequi culpa.","refresh_token":"Ea quidem ducimus tempora ea molestias."},"required":["refresh_token","client_id","client_secret","developer_token"]},"HubspotConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Beatae totam."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Molestiae veniam exercitationem blanditiis ratione non."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Voluptate nam iste architecto."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eos ex laborum et doloremque."},"label":{"type":"string","description":"Optional friendly name","example":"Quo est."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Velit odio temporibus aut numquam est."},"project_id":{"type":"string","description":"Owning project","example":"Non laudantium quis ab non sunt."},"sender_email":{"type":"string","description":"Default sender address","example":"Ut vitae dolor soluta beatae."},"sender_name":{"type":"string","description":"Default sender name","example":"Enim velit voluptates officiis tempora possimus rerum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7472986980795124202,"format":"int64"}},"example":{"account_id":"Quos provident.","brand_kit":"Dolorem ea et quidem quibusdam officiis.","etag":"Officiis modi quae consequatur voluptatem et.","has_credentials":false,"id":"Sed dolorum cupiditate quia qui dicta.","label":"Totam et voluptates atque consequatur consequuntur voluptates.","portal_id":"Culpa veritatis ut adipisci minus.","project_id":"Commodi facere vel.","sender_email":"Vero eum ea perspiciatis rerum.","sender_name":"Incidunt deleniti.","status":"inactive","version":413153877019026133},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"HubspotConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut illum laboriosam debitis aut."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Quisquam sit ut aliquid consectetur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Et eveniet sunt."},"label":{"type":"string","description":"Optional friendly name","example":"Similique inventore et voluptatum."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Nobis ipsam blanditiis commodi accusamus maxime."},"project_id":{"type":"string","description":"Owning project","example":"Veniam ut et sit."},"sender_email":{"type":"string","description":"Default sender address","example":"Quia sed eum ad sunt impedit sint."},"sender_name":{"type":"string","description":"Default sender name","example":"Iusto aspernatur fugit et facere eligendi."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3458229418861381091,"format":"int64"}},"example":{"account_id":"Fuga et id voluptatem et et et.","brand_kit":"Velit architecto error consequatur nam.","has_credentials":false,"id":"Harum nisi illo quia.","label":"Aliquam vel cum alias iusto.","portal_id":"Doloribus ex dolor quia et dolores.","project_id":"Aut in voluptate quam delectus optio saepe.","sender_email":"Distinctio ea.","sender_name":"Ab iste earum consequatur laboriosam maxime nemo.","status":"error","version":6330333226367628566},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reiciendis voluptas."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Eligendi facere."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Ipsum est a."},"label":{"type":"string","description":"Optional friendly name","example":"Et corporis error eligendi voluptatem repellat consectetur."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Nostrum quod rerum dolorum."},"project_id":{"type":"string","description":"Owning project","example":"Quia voluptatem veritatis molestiae similique."},"sender_email":{"type":"string","description":"Default sender address","example":"Doloribus et ex enim rem modi omnis."},"sender_name":{"type":"string","description":"Default sender name","example":"Atque quo sit iure quos."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1162295855624220314,"format":"int64"}},"example":{"account_id":"Vitae sapiente dolor unde harum dolorem iusto.","brand_kit":"Quis inventore iste nemo rerum corporis repellat.","has_credentials":true,"id":"Quo eveniet fuga quaerat.","label":"Deserunt eligendi rerum architecto necessitatibus alias.","portal_id":"Qui repellendus sit incidunt in et.","project_id":"Et modi eveniet magni repellendus et.","sender_email":"Et nesciunt et culpa similique quasi ratione.","sender_name":"Laboriosam dolorem ut dolorem odio aut reprehenderit.","status":"active","version":7214923908250326040},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et eveniet eaque non architecto aut."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Nihil odio facere magnam quasi dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Excepturi iusto in."},"label":{"type":"string","description":"Optional friendly name","example":"Rem aliquam voluptatem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Enim distinctio et corrupti magnam deleniti nam."},"project_id":{"type":"string","description":"Owning project","example":"Velit in."},"sender_email":{"type":"string","description":"Default sender address","example":"Esse temporibus eaque ut voluptatibus."},"sender_name":{"type":"string","description":"Default sender name","example":"Qui officia tempora alias quis."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4048071747606254476,"format":"int64"}},"example":{"account_id":"Voluptatum nemo adipisci.","brand_kit":"Optio enim repellendus commodi quia quod sit.","has_credentials":false,"id":"Sint consequatur quisquam nihil.","label":"Laboriosam placeat nesciunt tempore.","portal_id":"Molestias aliquid dolorum consequatur est qui qui.","project_id":"Accusamus illum in delectus magnam corporis velit.","sender_email":"Enim aut.","sender_name":"Dolores sed.","status":"deleted","version":1989293428795722898},"required":["id","project_id","account_id","has_credentials","status","version"]},"HubspotConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"HubSpot list/audience ID","example":"Unde perspiciatis."},"brand_kit":{"type":"string","description":"Per-project brand kit selector","example":"Assumenda quam possimus aut ipsa."},"label":{"type":"string","description":"Optional friendly name","example":"Sed qui dolor illo facere ut voluptatem."},"portal_id":{"type":"string","description":"HubSpot portal/account ID","example":"Rerum maiores in alias est laboriosam saepe."},"sender_email":{"type":"string","description":"Default sender address","example":"Perferendis placeat earum occaecati et."},"sender_name":{"type":"string","description":"Default sender name","example":"Eaque magni omnis dolorem."}},"example":{"account_id":"Et natus possimus cupiditate.","brand_kit":"Quod amet itaque aut.","label":"Quae et perspiciatis numquam.","portal_id":"Molestiae quia neque atque delectus.","sender_email":"Repudiandae eum.","sender_name":"Ut itaque voluptatem unde adipisci aut."},"required":["account_id"]},"HubspotCredentials":{"type":"object","properties":{"private_app_token":{"type":"string","description":"HubSpot private app token","example":"Aut rem molestiae assumenda ea."}},"description":"HubSpot private app token. Write-only; never returned.","example":{"private_app_token":"Nam repellat."},"required":["private_app_token"]},"InternalServerError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"500"},"message":{"type":"string","description":"Error message","example":"An internal server error occurred."}},"example":{"code":"500","message":"An internal server error occurred."},"required":["code","message"]},"JobCreateResponse":{"type":"object","properties":{"job_id":{"type":"string","description":"Poll GET /projects/{projectId}/jobs/{jobId}","example":"Consequuntur esse culpa."},"platforms":{"type":"array","items":{"type":"string","example":"Ut ullam aliquam dolore iure consequatur."},"description":"Platforms this job will create on","example":["Iste nemo.","Sunt deleniti.","Natus quia labore non ut dolores et."]},"status":{"type":"string","description":"Initial status (always 'queued' on create)","example":"queued","enum":["queued"]}},"example":{"job_id":"Voluptatem ipsa.","platforms":["Ipsam tempora est.","Sequi ea ut vero consequatur possimus.","Assumenda sit delectus veniam."],"status":"queued"},"required":["job_id","status","platforms"]},"JobPollResponse":{"type":"object","properties":{"error":{"type":"string","description":"Terminal error, if any","example":"Temporibus illum impedit ullam eaque."},"job_id":{"type":"string","description":"Job UUID","example":"Sunt quis odio enim nam id voluptatem."},"result":{"type":"array","items":{"$ref":"#/components/schemas/PlatformResult"},"description":"Per-platform results, written once when the job reaches a terminal state","example":[{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."},{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."},{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."},{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."}]},"status":{"type":"string","description":"Job status","example":"queued","enum":["queued","running","succeeded","partial","failed"]}},"example":{"error":"Itaque optio consequatur.","job_id":"Harum sint neque quia.","result":[{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."},{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."},{"campaign_id":"Aliquam facilis iste sed voluptatum laboriosam.","error":"Vero voluptatum a quos a sed exercitationem.","ok":false,"platform":"Ullam enim voluptatem."}],"status":"failed"},"required":["job_id","status"]},"LinkedinAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Laboriosam quos omnis deserunt libero consequatur quisquam."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Modi cupiditate."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Soluta quod."},"label":{"type":"string","description":"Optional friendly name","example":"Omnis inventore voluptatum ab."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Ducimus qui modi consequatur."},"project_id":{"type":"string","description":"Owning project","example":"At fugiat."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7336458220235154606,"format":"int64"}},"example":{"account_id":"Aliquam et asperiores quae voluptatem velit.","etag":"Enim voluptas numquam.","has_credentials":true,"id":"Et et deleniti sint reiciendis.","label":"Hic quam impedit placeat consequatur.","org_id":"Et iusto eius dolor magnam necessitatibus.","project_id":"Eos et quidem est.","status":"error","version":5408757854107547795},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"LinkedinAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Adipisci omnis veritatis omnis praesentium omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Est laborum."},"label":{"type":"string","description":"Optional friendly name","example":"Quod aut sunt ex et autem delectus."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Aut natus aliquam."},"project_id":{"type":"string","description":"Owning project","example":"Libero necessitatibus."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6869928491943758950,"format":"int64"}},"example":{"account_id":"Tempore qui est.","has_credentials":true,"id":"Quas aliquid.","label":"Praesentium beatae quis ut eius.","org_id":"Excepturi provident saepe aliquam architecto.","project_id":"Saepe non tempore.","status":"active","version":8098284705619161180},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Minus pariatur praesentium amet."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vero provident voluptas consequatur iusto."},"label":{"type":"string","description":"Optional friendly name","example":"Ut magnam aut illum commodi placeat sed."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Qui sint velit earum laboriosam dignissimos reiciendis."},"project_id":{"type":"string","description":"Owning project","example":"Pariatur quas."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1671194498896693162,"format":"int64"}},"example":{"account_id":"Provident autem repudiandae molestias est consectetur porro.","has_credentials":false,"id":"Quisquam voluptas quasi esse corporis molestiae.","label":"Dolorem totam voluptatem recusandae amet.","org_id":"Ea ut.","project_id":"Suscipit fugiat deserunt.","status":"inactive","version":7812167479041835646},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Et libero ea aut omnis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Doloremque aut eligendi perferendis aut et."},"label":{"type":"string","description":"Optional friendly name","example":"Id officiis architecto."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"Corrupti aut earum rerum ducimus dicta."},"project_id":{"type":"string","description":"Owning project","example":"Eum molestiae ea consectetur delectus."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6409712151005637179,"format":"int64"}},"example":{"account_id":"Et rerum repudiandae et at iusto.","has_credentials":false,"id":"Quo omnis et et molestiae dolorum.","label":"Consequatur iste eum amet vel impedit et.","org_id":"Veritatis saepe numquam rem sapiente.","project_id":"Perspiciatis a aut quas delectus a.","status":"inactive","version":8814877888903559420},"required":["id","project_id","account_id","has_credentials","status","version"]},"LinkedinAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"LinkedIn ad account ID","example":"538170226"},"label":{"type":"string","description":"Optional friendly name","example":"Est ipsam sint autem repudiandae asperiores et."},"org_id":{"type":"string","description":"LinkedIn organization URN id","example":"208777"}},"example":{"account_id":"538170226","label":"Quia consectetur non nulla dolore quibusdam ducimus.","org_id":"208777"},"required":["account_id","org_id"]},"LinkedinAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth access token","example":"Accusantium debitis adipisci qui iste explicabo."}},"description":"LinkedIn Ads credential. Write-only; never returned.","example":{"access_token":"Commodi qui."},"required":["access_token"]},"MetaAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut magni beatae error deleniti."},"app_id":{"type":"string","description":"Meta app ID","example":"Enim non asperiores velit aut."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Culpa aut temporibus dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Tenetur nobis qui."},"label":{"type":"string","description":"Optional friendly name","example":"Inventore consequatur velit autem eaque eaque."},"page_id":{"type":"string","description":"Facebook page ID","example":"Quis accusantium."},"project_id":{"type":"string","description":"Owning project","example":"Laboriosam ipsa voluptas et vel dolorum."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7112569565459851125,"format":"int64"}},"example":{"account_id":"Sit nihil enim sit.","app_id":"Ipsam eligendi est dolore.","etag":"Qui vitae iste.","has_credentials":false,"id":"Quod minima.","label":"Dolores dolores.","page_id":"Non ipsam optio in ratione accusamus quasi.","project_id":"Ipsum et et laudantium.","status":"deleted","version":6379674624138849400},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MetaAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ullam sunt rem non doloribus."},"app_id":{"type":"string","description":"Meta app ID","example":"Consequuntur quia et saepe aperiam."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Esse qui quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Officiis asperiores quibusdam accusamus possimus."},"page_id":{"type":"string","description":"Facebook page ID","example":"Corrupti ipsum."},"project_id":{"type":"string","description":"Owning project","example":"Est magni temporibus et molestias voluptatem molestias."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3056771457873327009,"format":"int64"}},"example":{"account_id":"Aut quidem beatae officiis expedita error.","app_id":"Corporis nulla magni.","has_credentials":false,"id":"Et illo aut natus.","label":"Dolorem labore laboriosam repellat harum.","page_id":"Debitis iusto molestias itaque.","project_id":"Accusamus ipsa qui.","status":"error","version":5243837876383249590},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Consequatur provident ea sint."},"app_id":{"type":"string","description":"Meta app ID","example":"Minus id deleniti."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Fugit et soluta."},"label":{"type":"string","description":"Optional friendly name","example":"Voluptatem iste nemo numquam unde perspiciatis."},"page_id":{"type":"string","description":"Facebook page ID","example":"Facere ut repudiandae eum quibusdam."},"project_id":{"type":"string","description":"Owning project","example":"Et qui officiis repudiandae qui iste accusantium."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1953847576666852892,"format":"int64"}},"example":{"account_id":"Eum autem quia quis soluta nostrum cumque.","app_id":"Saepe amet voluptatem veniam.","has_credentials":false,"id":"Dolorem quia.","label":"Adipisci consectetur ut modi quo et.","page_id":"Rem autem quia velit aliquid.","project_id":"Non id.","status":"error","version":7788869661064623160},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eos fugiat rem minima ab ea animi."},"app_id":{"type":"string","description":"Meta app ID","example":"Voluptatem libero consectetur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Vero possimus rem maiores voluptas voluptate."},"label":{"type":"string","description":"Optional friendly name","example":"Eos qui facilis possimus consequatur sequi."},"page_id":{"type":"string","description":"Facebook page ID","example":"Facere ea incidunt et molestiae."},"project_id":{"type":"string","description":"Owning project","example":"Quam quos dolor id debitis."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6530264541662515284,"format":"int64"}},"example":{"account_id":"Minus alias laudantium.","app_id":"Rerum numquam et ex aut cupiditate qui.","has_credentials":true,"id":"Ducimus temporibus ullam sint aliquam ea voluptatibus.","label":"Temporibus accusamus rerum.","page_id":"Eius reiciendis rerum voluptatem.","project_id":"Impedit incidunt sint.","status":"inactive","version":93554437328757363},"required":["id","project_id","account_id","has_credentials","status","version"]},"MetaAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Meta ad account ID","example":"act_193556282970417"},"app_id":{"type":"string","description":"Meta app ID","example":"Explicabo totam officia dolores."},"label":{"type":"string","description":"Optional friendly name","example":"Est et corporis maxime voluptate."},"page_id":{"type":"string","description":"Facebook page ID","example":"Reprehenderit consectetur accusamus eaque inventore et."}},"example":{"account_id":"act_193556282970417","app_id":"Accusantium aut reiciendis in.","label":"Reprehenderit aut ex dolor sint.","page_id":"Rem nihil vitae qui explicabo."},"required":["account_id"]},"MetaAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"Meta access token","example":"Mollitia earum aut qui sit rerum."},"app_secret":{"type":"string","description":"Meta app secret","example":"Tempora voluptatem rem fugit accusantium est necessitatibus."}},"description":"Meta Ads credential. Write-only; never returned.","example":{"access_token":"Officia dolorem.","app_secret":"Asperiores autem aut aut soluta quae."},"required":["access_token","app_secret"]},"MicrosoftAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"In voluptate debitis earum voluptates repellat."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Dolore expedita."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Dolorem tempore qui."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Necessitatibus quia facere vitae aperiam velit corrupti."},"label":{"type":"string","description":"Optional friendly name","example":"Deserunt minima quis impedit."},"project_id":{"type":"string","description":"Owning project","example":"Pariatur totam."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":3340961523623056274,"format":"int64"}},"example":{"account_id":"Molestias reprehenderit.","customer_id":"Ea pariatur.","etag":"Dolorem similique sapiente.","has_credentials":true,"id":"Sit omnis.","label":"Accusantium est.","project_id":"Porro saepe eius earum quo porro.","status":"active","version":5013574793121618962},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"MicrosoftAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Non rerum."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Tenetur magnam quaerat laborum voluptatibus accusamus itaque."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Culpa est ex."},"label":{"type":"string","description":"Optional friendly name","example":"Eius eos sit quam fugiat."},"project_id":{"type":"string","description":"Owning project","example":"Aliquid porro deserunt nostrum sed sint voluptas."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":396103720096053742,"format":"int64"}},"example":{"account_id":"Cumque adipisci.","customer_id":"Error incidunt consequuntur voluptas ullam optio.","has_credentials":true,"id":"Aut et rem eos quia.","label":"Laboriosam placeat.","project_id":"Modi accusantium et repudiandae facere dolorum.","status":"error","version":316921975293270952},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Reprehenderit nemo voluptatibus."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Tempore aut voluptas ipsa quis animi."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Eaque eos veniam quidem maiores adipisci."},"label":{"type":"string","description":"Optional friendly name","example":"Molestias ullam aut odit repellat nihil at."},"project_id":{"type":"string","description":"Owning project","example":"Impedit a."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1334308724833154060,"format":"int64"}},"example":{"account_id":"Ipsum et illum.","customer_id":"Enim est sapiente.","has_credentials":true,"id":"Sunt reprehenderit aliquam perspiciatis libero.","label":"Et qui quos corrupti quam unde.","project_id":"Ratione pariatur.","status":"inactive","version":4456369783861517132},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Quis ut in voluptatem nesciunt."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Unde adipisci rerum eius vitae perferendis."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Minus aut ut non."},"label":{"type":"string","description":"Optional friendly name","example":"Blanditiis est et saepe."},"project_id":{"type":"string","description":"Owning project","example":"Repellendus voluptatem."},"status":{"type":"string","description":"Connection status","example":"error","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":4034090178991751772,"format":"int64"}},"example":{"account_id":"Eum nemo architecto est.","customer_id":"Consequatur provident veniam omnis quia.","has_credentials":true,"id":"Quidem eum animi.","label":"Est error maiores excepturi exercitationem quo porro.","project_id":"Explicabo et quo et velit qui doloremque.","status":"deleted","version":5942764375177239504},"required":["id","project_id","account_id","has_credentials","status","version"]},"MicrosoftAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Microsoft Advertising account ID","example":"Laudantium eligendi ut et."},"customer_id":{"type":"string","description":"Microsoft Advertising customer ID","example":"Maiores nam sequi iste iusto reiciendis ipsa."},"label":{"type":"string","description":"Optional friendly name","example":"Est dolor velit et voluptatem mollitia placeat."}},"example":{"account_id":"Temporibus in qui provident corrupti ut similique.","customer_id":"Voluptas doloremque nobis consectetur voluptas voluptas.","label":"Saepe beatae."},"required":["account_id"]},"MicrosoftAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Beatae facilis dolor quod nihil quia."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Sed voluptas fuga officia nulla."},"developer_token":{"type":"string","description":"Microsoft Advertising developer token","example":"Non consequuntur qui qui impedit assumenda voluptas."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Recusandae consequatur nulla."}},"description":"Microsoft Advertising OAuth credential set. Write-only; never returned.","example":{"client_id":"Consequuntur provident nostrum vel ut.","client_secret":"Et nemo dicta illum omnis.","developer_token":"Nemo cum delectus laudantium.","refresh_token":"Dolor et aliquam deleniti."},"required":["client_id","client_secret","refresh_token","developer_token"]},"NotFoundError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"404"},"message":{"type":"string","description":"Error message","example":"The connection was not found."}},"example":{"code":"404","message":"The connection was not found."},"required":["code","message"]},"PlatformResult":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost.","example":"Provident illo non quisquam iure."},"error":{"type":"string","description":"Failure reason (present when not ok)","example":"Est ut aliquid."},"ok":{"type":"boolean","description":"Whether the campaign was created (or reused) successfully","example":true},"platform":{"type":"string","description":"Platform this result is for","example":"Est et magni."}},"example":{"campaign_id":"Exercitationem accusamus pariatur saepe ab qui.","error":"Ab laboriosam sunt quis omnis.","ok":false,"platform":"Repellendus eveniet veritatis impedit aut iste earum."},"required":["platform","ok"]},"PreconditionFailedError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"412"},"message":{"type":"string","description":"Error message","example":"The supplied ETag does not match the current version."}},"example":{"code":"412","message":"The supplied ETag does not match the current version."},"required":["code","message"]},"PreconditionRequiredError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"428"},"message":{"type":"string","description":"Error message","example":"An If-Match header is required."}},"example":{"code":"428","message":"An If-Match header is required."},"required":["code","message"]},"RedditAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Sit soluta quia qui."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Expedita sed velit distinctio."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Optio quia similique vero est impedit quo."},"label":{"type":"string","description":"Optional friendly name","example":"Libero officia et quia."},"project_id":{"type":"string","description":"Owning project","example":"Nihil at."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1438953144952054594,"format":"int64"}},"example":{"account_id":"Optio rerum vel molestiae id.","etag":"Reiciendis excepturi.","has_credentials":false,"id":"Necessitatibus eos rerum.","label":"Qui quas aut provident suscipit.","project_id":"Veniam amet et quisquam voluptatem fuga.","status":"active","version":8349066598252210000},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"RedditAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Repellendus velit soluta est quidem in dolorem."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Omnis vitae."},"label":{"type":"string","description":"Optional friendly name","example":"Amet et vel ipsa ad doloremque qui."},"project_id":{"type":"string","description":"Owning project","example":"Voluptatem eum consequuntur."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7523183128313694126,"format":"int64"}},"example":{"account_id":"Autem repellat et.","has_credentials":true,"id":"Accusamus eligendi itaque est est.","label":"Nesciunt consequatur commodi.","project_id":"Explicabo doloremque possimus soluta cupiditate ab.","status":"active","version":7930594330395664596},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"At ratione unde dicta."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Praesentium omnis amet quia quia ea amet."},"label":{"type":"string","description":"Optional friendly name","example":"At explicabo reiciendis."},"project_id":{"type":"string","description":"Owning project","example":"Officia rerum eligendi ex."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":6548567568963242840,"format":"int64"}},"example":{"account_id":"Aut esse sint earum magnam.","has_credentials":true,"id":"Ipsum pariatur explicabo.","label":"Et perferendis aut voluptates voluptatem.","project_id":"Qui voluptas.","status":"inactive","version":7316195578965090635},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Corporis nemo et consectetur consequatur."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Fuga natus."},"label":{"type":"string","description":"Optional friendly name","example":"Eum voluptatem eveniet."},"project_id":{"type":"string","description":"Owning project","example":"Est sed et ducimus qui quas."},"status":{"type":"string","description":"Connection status","example":"active","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":8379899225513618277,"format":"int64"}},"example":{"account_id":"Tempore ut.","has_credentials":false,"id":"Consectetur repudiandae hic nostrum.","label":"Doloremque ad.","project_id":"Sed est architecto sit est est labore.","status":"active","version":477213815092233328},"required":["id","project_id","account_id","has_credentials","status","version"]},"RedditAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"Reddit advertiser ID","example":"t2_gv9wtbfa"},"label":{"type":"string","description":"Optional friendly name","example":"Dolores earum."}},"example":{"account_id":"t2_gv9wtbfa","label":"Est consequatur rerum neque velit nulla modi."},"required":["account_id"]},"RedditAdsCredentials":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth client id","example":"Consequatur aut vero."},"client_secret":{"type":"string","description":"OAuth client secret","example":"Excepturi natus est est saepe doloribus unde."},"refresh_token":{"type":"string","description":"OAuth refresh token","example":"Aut perspiciatis."}},"description":"Reddit Ads OAuth credential. Write-only; never returned.","example":{"client_id":"Adipisci ut.","client_secret":"Sit totam ut et.","refresh_token":"Quibusdam ea nam aut."},"required":["client_id","client_secret","refresh_token"]},"ServiceUnavailableError":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code","example":"503"},"message":{"type":"string","description":"Error message","example":"The service is unavailable."}},"example":{"code":"503","message":"The service is unavailable."},"required":["code","message"]},"SetCredentialGoogleAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/GoogleAdsCredentials"}},"example":{"credentials":{"client_id":"Architecto itaque doloribus voluptatem consequatur quis fugiat.","client_secret":"Recusandae qui culpa.","developer_token":"Accusamus et atque enim.","refresh_token":"Dolorum minus voluptatem."}},"required":["credentials"]},"SetCredentialHubspotRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/HubspotCredentials"}},"example":{"credentials":{"private_app_token":"Vitae vel omnis autem accusamus mollitia."}},"required":["credentials"]},"SetCredentialLinkedinAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/LinkedinAdsCredentials"}},"example":{"credentials":{"access_token":"Illo minima eaque earum."}},"required":["credentials"]},"SetCredentialMetaAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/MetaAdsCredentials"}},"example":{"credentials":{"access_token":"Enim ea.","app_secret":"Quidem molestiae deleniti omnis."}},"required":["credentials"]},"SetCredentialRedditAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/RedditAdsCredentials"}},"example":{"credentials":{"client_id":"Magni repudiandae.","client_secret":"Nihil corrupti repellat eius.","refresh_token":"Qui nobis et delectus quam."}},"required":["credentials"]},"SetCredentialTwitterAdsRequestBody":{"type":"object","properties":{"credentials":{"$ref":"#/components/schemas/TwitterAdsCredentials"}},"example":{"credentials":{"access_token":"Deleniti placeat fuga aut saepe.","access_token_secret":"Reiciendis pariatur repellat.","consumer_key":"Nulla dolorum deserunt ut sit dolor.","consumer_secret":"Eos nihil ipsam ex odio totam."}},"required":["credentials"]},"TwitterAdsConnection":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Ut quas officiis mollitia ducimus sunt repellendus."},"etag":{"type":"string","description":"ETag header value (mirrors version)","example":"Aliquam est autem vel eos minima."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Quas est deserunt maiores consequatur eum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Odit illo ut ut."},"label":{"type":"string","description":"Optional friendly name","example":"Debitis atque laboriosam unde facilis."},"project_id":{"type":"string","description":"Owning project","example":"Nam modi nostrum assumenda alias sed."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":2463177480955435124,"format":"int64"}},"example":{"account_id":"Quisquam recusandae nesciunt et.","etag":"Ut ea sequi quos qui quo et.","funding_instrument_id":"Perferendis et.","has_credentials":true,"id":"Voluptatum pariatur non ratione quo ullam.","label":"Facilis dolor consectetur sed.","project_id":"Occaecati hic ut magnam facilis.","status":"deleted","version":8315950268383046552},"required":["id","project_id","account_id","has_credentials","status","version","etag"]},"TwitterAdsConnection2":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Illum natus doloremque facere quis et beatae."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Magni facere saepe dignissimos eos facere."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Dolor sint consectetur ipsa nam ipsa magnam."},"label":{"type":"string","description":"Optional friendly name","example":"Sed est recusandae enim quidem."},"project_id":{"type":"string","description":"Owning project","example":"Eos cum."},"status":{"type":"string","description":"Connection status","example":"inactive","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1050609458141446118,"format":"int64"}},"example":{"account_id":"Quia sed harum.","funding_instrument_id":"Ut sint laborum est quia ducimus inventore.","has_credentials":false,"id":"Animi dolor ex saepe ipsa ipsam.","label":"Nisi consequatur non quam suscipit ea ea.","project_id":"Voluptas est est accusamus.","status":"inactive","version":7559450314363992253},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection3":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Eaque omnis nihil itaque."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Sunt distinctio consequuntur enim in."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":true},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Delectus soluta repudiandae et."},"label":{"type":"string","description":"Optional friendly name","example":"Sequi occaecati."},"project_id":{"type":"string","description":"Owning project","example":"Exercitationem cumque libero."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":7986908834898485319,"format":"int64"}},"example":{"account_id":"Voluptates cumque.","funding_instrument_id":"Enim corrupti.","has_credentials":false,"id":"Est recusandae amet beatae.","label":"Sapiente quam deserunt.","project_id":"Ut amet consequatur expedita nihil molestiae soluta.","status":"inactive","version":3218820863122651463},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnection4":{"type":"object","properties":{"account_id":{"type":"string","description":"Provider account identifier","example":"Rerum nesciunt veritatis consequatur porro."},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"Ratione provident laborum."},"has_credentials":{"type":"boolean","description":"Whether an encrypted credential is stored","example":false},"id":{"type":"string","description":"Service-generated connection UUID (not used in paths)","example":"Qui voluptas culpa."},"label":{"type":"string","description":"Optional friendly name","example":"Delectus non aut ipsum."},"project_id":{"type":"string","description":"Owning project","example":"Iste nihil itaque et."},"status":{"type":"string","description":"Connection status","example":"deleted","enum":["active","inactive","error","deleted"]},"version":{"type":"integer","description":"Optimistic-concurrency version","example":1595767401527646160,"format":"int64"}},"example":{"account_id":"Aut sed consequatur officiis et error.","funding_instrument_id":"Commodi occaecati.","has_credentials":false,"id":"Sed voluptatem repudiandae soluta.","label":"Nemo aut et qui.","project_id":"Et quisquam dolores.","status":"active","version":8795877030736776782},"required":["id","project_id","account_id","has_credentials","status","version"]},"TwitterAdsConnectionConfig":{"type":"object","properties":{"account_id":{"type":"string","description":"X/Twitter Ads account ID","example":"8r7gb"},"funding_instrument_id":{"type":"string","description":"Funding instrument for the ad account","example":"In iure molestiae quisquam."},"label":{"type":"string","description":"Optional friendly name","example":"Accusamus eos neque velit."}},"example":{"account_id":"8r7gb","funding_instrument_id":"Numquam voluptatem maiores ipsam dicta cum odit.","label":"Ipsam aperiam et totam in."},"required":["account_id"]},"TwitterAdsCredentials":{"type":"object","properties":{"access_token":{"type":"string","description":"OAuth 1.0a access token","example":"Iure aut tenetur ipsum ea ad ducimus."},"access_token_secret":{"type":"string","description":"OAuth 1.0a access token secret","example":"Aut temporibus."},"consumer_key":{"type":"string","description":"OAuth 1.0a consumer key","example":"Aut tenetur."},"consumer_secret":{"type":"string","description":"OAuth 1.0a consumer secret","example":"Et et."}},"description":"X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned.","example":{"access_token":"Necessitatibus non eum ipsum eveniet quam.","access_token_secret":"Aut amet aut voluptatum magnam.","consumer_key":"Laborum ipsum accusantium voluptatem libero.","consumer_secret":"Eligendi non."},"required":["consumer_key","consumer_secret","access_token","access_token_secret"]},"UpdateCampaignRequestBody":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/CampaignUpdateInput"}},"example":{"campaign":{"campaign_name":"Eos doloribus autem corrupti sed voluptatum laborum.","config":"Perferendis qui maiores aut reiciendis.","status":"Suscipit quas sunt eos nulla."}},"required":["campaign"]},"UpdateGoogleAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/GoogleAdsConnectionConfig"}},"example":{"config":{"account_id":"8666746580","label":"TLF Main","login_customer_id":"9746983954"}},"required":["config"]},"UpdateHubspotRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/HubspotConnectionConfig"}},"example":{"config":{"account_id":"Maxime dicta qui aut.","brand_kit":"Corrupti voluptas.","label":"Dolor porro inventore alias error.","portal_id":"Suscipit eos nam ipsa.","sender_email":"Velit et impedit facilis quaerat.","sender_name":"Dolor ut velit quam omnis et dolor."}},"required":["config"]},"UpdateLinkedinAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/LinkedinAdsConnectionConfig"}},"example":{"config":{"account_id":"538170226","label":"Temporibus et provident maiores neque.","org_id":"208777"}},"required":["config"]},"UpdateMetaAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MetaAdsConnectionConfig"}},"example":{"config":{"account_id":"act_193556282970417","app_id":"Qui rerum est sed sed.","label":"Quis quam dolor occaecati earum iusto rerum.","page_id":"Cupiditate nobis."}},"required":["config"]},"UpdateMicrosoftAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/MicrosoftAdsConnectionConfig"}},"example":{"config":{"account_id":"Ut necessitatibus dolor nemo.","customer_id":"Nisi numquam nihil id unde.","label":"Voluptatem sed illo numquam praesentium tenetur quas."}},"required":["config"]},"UpdateRedditAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/RedditAdsConnectionConfig"}},"example":{"config":{"account_id":"t2_gv9wtbfa","label":"Laboriosam qui id enim."}},"required":["config"]},"UpdateTwitterAdsRequestBody":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/TwitterAdsConnectionConfig"}},"example":{"config":{"account_id":"8r7gb","funding_instrument_id":"Dolorem non laudantium sunt minima repudiandae illo.","label":"Labore esse."}},"required":["config"]}},"securitySchemes":{"jwt_header_Authorization":{"type":"http","description":"JWT issued by Heimdall; audience is this service.","scheme":"bearer"}}},"tags":[{"name":"lfx-v2-campaign-service-svc","description":"The campaign service supports Marketing Operations campaign creation and management."},{"name":"lfx-v2-campaign-service-briefs","description":"Manage campaign briefs and their subordinate platform campaigns, including async multi-platform creation."},{"name":"lfx-v2-campaign-service-connections","description":"Manage a project's singleton, per-provider ad-platform connections."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 609c0b00..0b2eccf2 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -32,18 +32,18 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Blanditiis quidem qui iusto sed. - event_details: Dolor molestias ipsa dolorum est. - event_slug: Accusantium ad. - keywords: Vel fuga recusandae. + copy: Autem veniam. + event_details: Vel autem voluptates. + event_slug: Et est laboriosam. + keywords: Enim unde omnis. platforms: - - Iste autem veniam et enim unde. - - Facere quam. - - Rem quia consequuntur ut. - - Consequatur quos atque voluptates quo sit. - program_type: membership - targeting: Nulla ut laboriosam. - url: Modi asperiores ut libero vel. + - Nam exercitationem consectetur sint. + - Necessitatibus ex ea ullam corrupti. + - Et omnis accusantium. + - Iure modi asperiores ut. + program_type: education + targeting: Quam sed rem quia consequuntur ut. + url: Facere sint totam sapiente vitae numquam ut. responses: "201": description: Created response. @@ -53,28 +53,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aliquid qui omnis et. - example: Asperiores recusandae deserunt ratione eius culpa sit. + example: Hic ea et. + example: Et et commodi autem. content: application/json: schema: $ref: '#/components/schemas/Brief2' example: - copy: Magni et rerum sed voluptatum. - event_details: Enim est occaecati sed non dolorem distinctio. - event_slug: Aperiam eum. - id: Omnis suscipit corrupti reiciendis. - keywords: Aut ratione sunt nostrum tenetur. + copy: Aperiam eum. + event_details: Beatae soluta molestiae nihil quia omnis. + event_slug: Fuga recusandae odio nulla ut laboriosam. + id: Dolor molestias ipsa dolorum est. + keywords: Quam et voluptatibus illum dolorem. platforms: - - Dolorum aut distinctio vel. - - Veniam velit sequi sit impedit dolorum voluptas. - - Ipsum quaerat delectus cupiditate sit et. - program_type: Beatae soluta molestiae nihil quia omnis. - project_id: Perspiciatis saepe consequatur doloribus sequi et. - status: draft - targeting: Dolorem cum. - url: Quam et voluptatibus illum dolorem. - version: 1135469282733514180 + - Suscipit corrupti reiciendis et. + - Saepe consequatur. + - Sequi et. + program_type: education + project_id: Blanditiis quidem qui iusto sed. + status: approved + targeting: Eum dolorum. + url: Rerum delectus velit. + version: 6878204844566876538 "400": description: 'BadRequest: Bad request' content: @@ -146,9 +146,9 @@ paths: schema: type: string description: Brief UUID - example: b6261fa8-da85-4670-81bb-f0aa10d65871 + example: 9bc01b99-89ba-4efb-8538-2b1612fe241d format: uuid - example: 4d147ddb-fca6-489e-a2a8-78921eadc560 + example: 4185e754-4b3e-4607-95ac-0588f14c2d07 responses: "204": description: No Content response. @@ -222,9 +222,9 @@ paths: schema: type: string description: Brief UUID - example: 52099480-3594-4323-92b0-9a8e5a8fedcc + example: e3374dee-25a0-47a6-894e-2c8dacc2c71c format: uuid - example: 6d67841a-f263-4343-acd9-5ea22a27e47d + example: 9717fe0e-7c86-4c49-90fb-b9d2643146d7 responses: "200": description: OK response. @@ -234,27 +234,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Libero repudiandae aliquid ex. - example: Eveniet suscipit odio ratione. + example: Dolores in. + example: Velit eligendi omnis est vel est et. content: application/json: schema: $ref: '#/components/schemas/Brief3' example: - copy: Dolores commodi aperiam voluptatibus. - event_details: Omnis quidem est non tenetur dolore. - event_slug: Distinctio ipsa nihil ad hic repellendus nobis. - id: Harum et minus voluptas. - keywords: Cupiditate voluptatem. + copy: Voluptatem voluptas omnis est tempora ipsum aut. + event_details: Alias non sequi consequatur dolorum. + event_slug: Et nihil. + id: Et placeat. + keywords: Harum et minus voluptas. platforms: - - Cupiditate aliquam vel blanditiis sunt ut. - - Aperiam quo sint dolorum vel molestiae. - program_type: Porro ab id necessitatibus consequatur natus tempora. - project_id: Debitis labore aut. - status: approved - targeting: Et corporis officia sint. - url: Accusamus vero et voluptas accusamus sunt. - version: 1623908575818221398 + - Voluptas culpa. + - Quia tenetur ducimus. + - Facere harum enim consequatur id voluptatem. + program_type: membership + project_id: Qui esse. + status: draft + targeting: Debitis labore aut. + url: Sequi quis. + version: 1292213403290328942 "400": description: 'BadRequest: Bad request' content: @@ -325,9 +326,9 @@ paths: schema: type: string description: Brief UUID - example: 7b75bd11-b6e0-441e-99e4-25f506ecfdd1 + example: cc32c8e5-5ca3-4bd4-b68b-42bdfc7b7724 format: uuid - example: 913052d6-1036-4a14-9f9a-107c3b258bb8 + example: 9f0f6183-8826-466a-a574-30f45cedcda5 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -345,18 +346,18 @@ paths: $ref: '#/components/schemas/CreateBriefRequestBody' example: brief: - copy: Blanditiis quidem qui iusto sed. - event_details: Dolor molestias ipsa dolorum est. - event_slug: Accusantium ad. - keywords: Vel fuga recusandae. + copy: Autem veniam. + event_details: Vel autem voluptates. + event_slug: Et est laboriosam. + keywords: Enim unde omnis. platforms: - - Iste autem veniam et enim unde. - - Facere quam. - - Rem quia consequuntur ut. - - Consequatur quos atque voluptates quo sit. - program_type: membership - targeting: Nulla ut laboriosam. - url: Modi asperiores ut libero vel. + - Nam exercitationem consectetur sint. + - Necessitatibus ex ea ullam corrupti. + - Et omnis accusantium. + - Iure modi asperiores ut. + program_type: education + targeting: Quam sed rem quia consequuntur ut. + url: Facere sint totam sapiente vitae numquam ut. responses: "200": description: OK response. @@ -366,28 +367,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ut aperiam eveniet nihil qui ea. - example: Id aut praesentium maiores unde quo culpa. + example: Necessitatibus fugit voluptates pariatur facilis nostrum sint. + example: Possimus qui est numquam omnis nihil. content: application/json: schema: $ref: '#/components/schemas/Brief4' example: - copy: Doloremque et qui perferendis. - event_details: Fugit voluptas molestias architecto dicta quidem illo. - event_slug: Sapiente et et itaque dolores in. - id: Provident quia laboriosam magnam unde. - keywords: Quia aut sed fugiat adipisci eos rerum. + copy: Aut et. + event_details: Tenetur velit quaerat aut. + event_slug: Hic delectus. + id: Architecto vel. + keywords: Harum provident quia distinctio ea. platforms: - - Nihil explicabo vero. - - Est qui asperiores velit enim. - - Expedita ut minus ut est recusandae aspernatur. - program_type: Rerum et. - project_id: Et sed nobis blanditiis. - status: approved - targeting: Ipsam temporibus sint et necessitatibus dolorem ut. - url: Rem dolores eligendi ea. - version: 6226287149251328788 + - Aliquam consequuntur quo aliquid ducimus. + - Facilis facilis aut suscipit aut odio iste. + - Deleniti earum magni quibusdam. + program_type: education + project_id: Vel autem modi id facere. + status: draft + targeting: Rem harum provident provident quia laboriosam magnam. + url: Maxime ut possimus expedita. + version: 4124348486962351749 "400": description: 'BadRequest: Bad request' content: @@ -477,9 +478,9 @@ paths: schema: type: string description: Brief UUID - example: 25175f34-92c0-434d-a72f-1a9c500ccdda + example: fd5c9608-acd6-49e9-bb2e-de24b6d81a44 format: uuid - example: 78a49884-958d-4ef7-99b9-e60dab3c1338 + example: 9cfebac2-eca8-4ba0-8c29-1102ebabcfea - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -498,29 +499,28 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Qui inventore. - example: Sunt cum ut. + example: Animi ut aut excepturi temporibus ipsum perferendis. + example: Ipsum quos voluptas iure eum tempore. content: application/json: schema: $ref: '#/components/schemas/Brief5' example: - copy: Similique odio adipisci dolore iste. - event_details: Error laudantium. - event_slug: Dolorem autem ipsa autem provident est. - id: Pariatur voluptas odit fuga illo. - keywords: Error necessitatibus et autem doloribus est. + copy: Iusto quidem laudantium. + event_details: Est consequatur eveniet in fuga ut. + event_slug: Velit est quis aliquid aliquam. + id: Consectetur porro quo. + keywords: Ratione consequuntur aut et corrupti. platforms: - - Et odio tenetur optio in ut sint. - - Iste eveniet laudantium rerum. - - Veritatis excepturi veniam maxime incidunt asperiores voluptatem. - - Nostrum dolorum iure eaque animi. - program_type: Numquam quia. - project_id: Sit ex commodi sapiente a illum. - status: archived - targeting: Maxime labore illo maxime provident. - url: Quo culpa. - version: 8076581276173981715 + - Aliquam quia officiis hic ea consequatur. + - Dolor velit debitis vitae quae. + - Sunt aperiam ex voluptatibus. + program_type: membership + project_id: Incidunt aut aperiam et ipsam. + status: draft + targeting: Quaerat ut neque expedita nostrum. + url: Voluptate nisi natus sint. + version: 5518996230427104310 "400": description: 'BadRequest: Bad request' content: @@ -610,9 +610,9 @@ paths: schema: type: string description: Brief UUID - example: d76e3514-7f04-404b-85c1-c9dd589109e7 + example: fca41ae9-5cf1-4249-84ff-3c128c4d9604 format: uuid - example: cc88b92c-5d67-435b-9340-3a62f5a9bab0 + example: edb87f72-22ea-4a62-9cc3-0f9ec1305513 requestBody: required: true content: @@ -621,11 +621,11 @@ paths: $ref: '#/components/schemas/CreateCampaignsRequestBody' example: input: - config: Facere et exercitationem. + config: Quia quos ut tempora consequuntur cumque repudiandae. platforms: - microsoft-ads - - twitter-ads - - google-ads + - microsoft-ads + - linkedin-ads responses: "202": description: Accepted response. @@ -634,11 +634,12 @@ paths: schema: $ref: '#/components/schemas/JobCreateResponse' example: - job_id: Et magni adipisci magnam veniam. + job_id: Enim non sint praesentium. platforms: - - Odio et corporis. - - Dolorem sapiente. - - Aut natus. + - Et veritatis voluptas nobis. + - Doloremque architecto ea et. + - Asperiores facere et exercitationem soluta possimus. + - Aliquid et in. status: queued "400": description: 'BadRequest: Bad request' @@ -711,9 +712,9 @@ paths: schema: type: string description: Brief UUID - example: 23c306fc-2672-44e3-a360-393f7d48f1dd + example: 40b44584-e849-4e18-9ef0-4ccead532f00 format: uuid - example: 6e627787-92a4-43ee-8c98-6b97ec8af1e5 + example: a5be33ff-d12e-479b-ad6a-7cc2ed678259 - name: campaign_id in: path description: Campaign UUID @@ -721,9 +722,9 @@ paths: schema: type: string description: Campaign UUID - example: f41342df-fae6-4961-b9b7-6a3dde13126b + example: 3d5136fa-42a8-45c6-bec5-cf457b12b3c2 format: uuid - example: dd6598b8-8da5-472a-bcbb-2d8f068036bc + example: 01450dd7-92b6-418d-a29c-b38911d10766 responses: "200": description: OK response. @@ -733,21 +734,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Debitis quis quidem quam corrupti. - example: Voluptatem labore excepturi quibusdam iure. + example: Mollitia nam aspernatur itaque itaque recusandae. + example: Omnis doloribus eius molestias animi quas ut. content: application/json: schema: $ref: '#/components/schemas/Campaign2' example: - brief_id: Ex voluptas aspernatur aperiam voluptates aliquam. - campaign_name: Eaque ipsam harum nisi nobis et et. - id: Explicabo est totam qui praesentium ipsam. - platform: Ducimus neque. - platform_campaign_id: Aut perferendis natus. - project_id: Cum ipsum recusandae est adipisci ullam. - status: Excepturi corporis ut. - version: 9153915624091824945 + brief_id: Illum rerum error incidunt. + campaign_name: Et veritatis quisquam sed ratione et. + id: Quo quidem. + platform: Adipisci quaerat est nobis. + platform_campaign_id: Fugit non fuga rem adipisci. + project_id: Cumque totam nulla aut reprehenderit. + status: Cumque molestiae eos rem aut. + version: 90571920890933503 "400": description: 'BadRequest: Bad request' content: @@ -818,9 +819,9 @@ paths: schema: type: string description: Brief UUID - example: 8a332b11-4d31-48bf-8c47-17384ebd6445 + example: 9a0492f8-2923-44bc-8d2f-16bc941b2873 format: uuid - example: 05ce6f1f-49a7-45ce-9c2c-c1a771a99cab + example: a22bdbd6-342c-4b01-a5f2-015845ba9835 - name: campaign_id in: path description: Campaign UUID @@ -828,9 +829,9 @@ paths: schema: type: string description: Campaign UUID - example: 66025a18-b20e-4a9f-b7ee-db46d0219499 + example: fde7d17f-00f1-46be-bf9e-fe43cfa50d20 format: uuid - example: d0f0d2ab-d9dd-445b-bce5-1c29e2186349 + example: 1192ee6b-f97c-47cc-85c1-a249cf3a9953 - name: If-Match in: header description: If-Match header carrying the current ETag/version @@ -848,9 +849,9 @@ paths: $ref: '#/components/schemas/UpdateCampaignRequestBody' example: campaign: - campaign_name: Ad voluptatem. - config: Et expedita itaque quos. - status: Tempore impedit. + campaign_name: Eos doloribus autem corrupti sed voluptatum laborum. + config: Perferendis qui maiores aut reiciendis. + status: Suscipit quas sunt eos nulla. responses: "200": description: OK response. @@ -860,21 +861,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Molestiae qui nihil. - example: Ut facere magni qui veniam architecto. + example: Quas odio. + example: Perferendis asperiores. content: application/json: schema: $ref: '#/components/schemas/Campaign3' example: - brief_id: Et aut consequatur inventore enim reiciendis. - campaign_name: Ut mollitia accusantium dignissimos. - id: Ullam omnis autem. - platform: Neque ut rerum facilis quia molestiae ratione. - platform_campaign_id: Fugit provident officia officiis. - project_id: Id laboriosam nihil ea. - status: Consequatur qui molestiae velit ratione nesciunt et. - version: 476544424691753105 + brief_id: Beatae placeat cumque iure veritatis cumque. + campaign_name: Deserunt aliquid omnis explicabo doloremque et sed. + id: Porro architecto. + platform: Ex distinctio ipsum ab assumenda natus. + platform_campaign_id: Esse est. + project_id: Aperiam doloribus aut. + status: Odio sunt totam. + version: 9047518515926792446 "400": description: 'BadRequest: Bad request' content: @@ -1014,21 +1015,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Delectus voluptatem rerum et dolorum. - example: Quasi vel sint nisi laborum laboriosam assumenda. + example: Temporibus ut sint ipsam impedit et minima. + example: Vero quibusdam. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection3' example: - account_id: Minima eaque earum. + account_id: Perspiciatis id. has_credentials: true - id: Excepturi deleniti voluptas aperiam vel. - label: Id temporibus et provident maiores neque quis. - login_customer_id: Assumenda ipsa dolor. - project_id: Laudantium amet veritatis rerum itaque consequatur laboriosam. - status: active - version: 8240960881778207137 + id: Officia et sint numquam accusamus. + label: Vel natus provident. + login_customer_id: Aut et fuga enim nihil nihil quae. + project_id: Eos et architecto voluptas. + status: inactive + version: 270615534997019024 "404": description: 'NotFound: Resource not found' content: @@ -1086,10 +1087,10 @@ paths: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Natus provident est. - client_secret: Id dolore. - developer_token: Non error. - refresh_token: Accusamus aperiam eos et architecto voluptas rerum. + client_id: Architecto itaque doloribus voluptatem consequatur quis fugiat. + client_secret: Recusandae qui culpa. + developer_token: Accusamus et atque enim. + refresh_token: Dolorum minus voluptatem. responses: "201": description: Created response. @@ -1099,21 +1100,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Porro eaque dolorem. - example: Sunt dolorum possimus eum. + example: Maiores impedit consequuntur est fugit. + example: Accusantium et eos. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection2' example: - account_id: Nobis ut asperiores quo aut. + account_id: In recusandae maiores et voluptatem. has_credentials: true - id: Nihil quae porro. - label: Nulla officia vitae perspiciatis eveniet. - login_customer_id: Dicta voluptate aut in. - project_id: Rem autem quae. + id: Fuga nostrum velit hic excepturi omnis. + label: Odio labore pariatur nobis. + login_customer_id: Doloribus qui consequatur et dignissimos ex. + project_id: Distinctio quos ut unde et atque. status: error - version: 7743336992980724195 + version: 8118771688807322679 "400": description: 'BadRequest: Bad request' content: @@ -1197,21 +1198,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Et non et. - example: Delectus vel. + example: Dolor quia necessitatibus. + example: Excepturi iure voluptas voluptatem. content: application/json: schema: $ref: '#/components/schemas/GoogleAdsConnection4' example: - account_id: Quidem odio ab accusantium aut est deleniti. - has_credentials: true - id: Odio incidunt distinctio sint. - label: Qui enim cumque saepe. - login_customer_id: Praesentium voluptatibus deserunt aliquam necessitatibus eos. - project_id: Aperiam quis quis reprehenderit non quae. + account_id: Nobis soluta. + has_credentials: false + id: Vitae perspiciatis eveniet quibusdam nobis ut asperiores. + label: Quis dicta voluptate aut in corporis. + login_customer_id: Deleniti voluptas aperiam vel quae laudantium. + project_id: Aut enim et. status: active - version: 5525678772225743935 + version: 4385483960184879572 "400": description: 'BadRequest: Bad request' content: @@ -1293,10 +1294,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Natus provident est. - client_secret: Id dolore. - developer_token: Non error. - refresh_token: Accusamus aperiam eos et architecto voluptas rerum. + client_id: Architecto itaque doloribus voluptatem consequatur quis fugiat. + client_secret: Recusandae qui culpa. + developer_token: Accusamus et atque enim. + refresh_token: Dolorum minus voluptatem. responses: "204": description: No Content response. @@ -1363,8 +1364,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Eligendi et. - ok: false + message: Rerum itaque consequatur laboriosam non. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -1468,24 +1469,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatum explicabo vero repudiandae temporibus ut. - example: Est hic enim similique et eveniet vel. + example: Sunt odit molestiae ab praesentium enim. + example: Earum non fugiat placeat. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection3' example: - account_id: In ipsa tempore incidunt velit provident perspiciatis. - brand_kit: Aspernatur voluptatem nobis. - has_credentials: true - id: Nihil sunt doloremque. - label: Ea architecto autem iste. - portal_id: Omnis ut ex sunt. - project_id: Ut ut odio odio sed minus quia. - sender_email: Beatae ut modi voluptatum veniam. - sender_name: Quibusdam consequuntur dolorem fugiat. - status: deleted - version: 5861862348723710898 + account_id: Molestiae suscipit non iusto. + brand_kit: Et cupiditate molestiae ea ullam minima voluptatem. + has_credentials: false + id: Eaque ut laudantium nostrum ratione. + label: Voluptate itaque fugit rerum cumque. + portal_id: Soluta omnis eius dicta ut. + project_id: Eius laborum. + sender_email: Distinctio dolore velit pariatur. + sender_name: Assumenda perspiciatis dolor porro. + status: error + version: 5347858386956008427 "404": description: 'NotFound: Resource not found' content: @@ -1539,14 +1540,14 @@ paths: $ref: '#/components/schemas/CreateHubspotRequestBody' example: config: - account_id: Voluptas aperiam. - brand_kit: Itaque fugit rerum cumque. - label: Dolores enim. - portal_id: Assumenda harum eos eveniet ut et laboriosam. - sender_email: Quos expedita voluptas qui eaque. - sender_name: Laudantium nostrum ratione id eius laborum aspernatur. + account_id: Maxime dicta qui aut. + brand_kit: Corrupti voluptas. + label: Dolor porro inventore alias error. + portal_id: Suscipit eos nam ipsa. + sender_email: Velit et impedit facilis quaerat. + sender_name: Dolor ut velit quam omnis et dolor. credentials: - private_app_token: Molestiae suscipit non iusto. + private_app_token: Vitae vel omnis autem accusamus mollitia. responses: "201": description: Created response. @@ -1556,24 +1557,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Ex quis molestias nam quia facilis. - example: Deserunt earum saepe repellat. + example: Ad a et inventore tempora facilis dolores. + example: Animi similique voluptatem vel voluptatibus. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection2' example: - account_id: Porro ut et cupiditate. - brand_kit: Animi molestiae aut fugit alias nisi qui. - has_credentials: true - id: Eius dicta. - label: Non assumenda perspiciatis. - portal_id: Voluptatem vel. - project_id: Ullam distinctio dolore velit. - sender_email: Dolore repudiandae necessitatibus dolorem. - sender_name: Beatae quia minus vero at ut. - status: active - version: 2806381801577175312 + account_id: Esse voluptate eum laboriosam distinctio non. + brand_kit: Harum eos eveniet ut. + has_credentials: false + id: Rem quia vel ipsam dolores. + label: Ullam facilis ab sapiente voluptatem. + portal_id: Id aut et adipisci quo ut. + project_id: Et qui ut libero numquam. + sender_email: Deserunt voluptates ut culpa saepe necessitatibus veritatis. + sender_name: Enim id voluptas aperiam distinctio. + status: inactive + version: 8626906144120400240 "400": description: 'BadRequest: Bad request' content: @@ -1645,12 +1646,12 @@ paths: $ref: '#/components/schemas/UpdateHubspotRequestBody' example: config: - account_id: Voluptas aperiam. - brand_kit: Itaque fugit rerum cumque. - label: Dolores enim. - portal_id: Assumenda harum eos eveniet ut et laboriosam. - sender_email: Quos expedita voluptas qui eaque. - sender_name: Laudantium nostrum ratione id eius laborum aspernatur. + account_id: Maxime dicta qui aut. + brand_kit: Corrupti voluptas. + label: Dolor porro inventore alias error. + portal_id: Suscipit eos nam ipsa. + sender_email: Velit et impedit facilis quaerat. + sender_name: Dolor ut velit quam omnis et dolor. responses: "200": description: OK response. @@ -1660,24 +1661,24 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Blanditiis inventore similique est. - example: Possimus qui. + example: Amet quam consequuntur nulla quaerat. + example: Commodi dolores autem doloribus laborum et. content: application/json: schema: $ref: '#/components/schemas/HubspotConnection4' example: - account_id: Debitis nam. - brand_kit: Aut aut eos magnam quisquam et. - has_credentials: false - id: Eveniet sint voluptatibus quam dicta. - label: Quis iste eaque. - portal_id: Quia distinctio consequatur dolore. - project_id: Consequuntur voluptatem est qui. - sender_email: Corporis consequatur voluptatem voluptates. - sender_name: Reprehenderit provident repudiandae sit. + account_id: Non unde. + brand_kit: Incidunt velit provident perspiciatis. + has_credentials: true + id: Quia minus vero. + label: Fugit alias nisi qui maiores. + portal_id: Doloremque explicabo ut. + project_id: Ut quis animi molestiae. + sender_email: Odio odio sed minus quia quia ea. + sender_name: Autem iste ea in ipsa. status: error - version: 7483108258641908951 + version: 7175407383173057293 "400": description: 'BadRequest: Bad request' content: @@ -1759,7 +1760,7 @@ paths: $ref: '#/components/schemas/SetCredentialHubspotRequestBody' example: credentials: - private_app_token: Molestiae suscipit non iusto. + private_app_token: Vitae vel omnis autem accusamus mollitia. responses: "204": description: No Content response. @@ -1826,8 +1827,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Sunt aliquam et velit fuga quos est. - ok: false + message: Sunt itaque omnis ut ex sunt sit. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -1931,21 +1932,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aspernatur enim perferendis. - example: Soluta porro distinctio cupiditate. + example: Quo porro asperiores eum officiis. + example: Autem assumenda dolor qui ut facere. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection3' example: - account_id: Sed sed similique enim ea maiores. - has_credentials: false - id: In aperiam quam quis quam dolor. - label: Sit cupiditate nobis iste qui rerum. - org_id: Ratione expedita voluptatum commodi fuga ipsa quam. - project_id: Earum iusto. - status: active - version: 4984404630797976872 + account_id: Et eum est molestiae necessitatibus magni. + has_credentials: true + id: Voluptatibus deserunt. + label: Et eligendi et numquam dolorum consequatur in. + org_id: Deserunt ipsum dolorum quas error. + project_id: Necessitatibus eos. + status: error + version: 3367774197321419764 "404": description: 'NotFound: Resource not found' content: @@ -2000,10 +2001,10 @@ paths: example: config: account_id: "538170226" - label: Dolorum consequatur in est. + label: Temporibus et provident maiores neque. org_id: "208777" credentials: - access_token: Eum est molestiae necessitatibus magni. + access_token: Illo minima eaque earum. responses: "201": description: Created response. @@ -2013,21 +2014,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Molestias qui magnam impedit modi. - example: Ipsum ullam quis est incidunt debitis qui. + example: Est similique rerum consequatur. + example: Aut consectetur mollitia repellat. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection2' example: - account_id: Libero ut est rerum est occaecati et. - has_credentials: false - id: Error nulla fuga fugit repellendus et accusamus. - label: Nam quia aperiam sunt est. - org_id: Consequuntur quod. - project_id: Non sequi error assumenda quam deleniti et. - status: inactive - version: 5045833847874249009 + account_id: Qui enim cumque saepe. + has_credentials: true + id: Eligendi tempore provident dicta temporibus debitis porro. + label: Aperiam quis quis reprehenderit non quae. + org_id: Accusantium aut. + project_id: Odio incidunt distinctio sint. + status: error + version: 6613376414740649303 "400": description: 'BadRequest: Bad request' content: @@ -2100,7 +2101,7 @@ paths: example: config: account_id: "538170226" - label: Dolorum consequatur in est. + label: Temporibus et provident maiores neque. org_id: "208777" responses: "200": @@ -2111,21 +2112,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quia sequi consequatur aut dolorem. - example: Necessitatibus quam. + example: Qui veniam architecto deleniti adipisci quas itaque. + example: Fuga rerum iure possimus et. content: application/json: schema: $ref: '#/components/schemas/LinkedinAdsConnection4' example: - account_id: Neque facilis est qui possimus eligendi. - has_credentials: false - id: Consequuntur qui quidem exercitationem. - label: Sed numquam necessitatibus laudantium est ut. - org_id: Et nobis voluptas dignissimos exercitationem illum. - project_id: Ipsa quo vel architecto quas eligendi impedit. - status: inactive - version: 8080806383587730069 + account_id: Est rerum. + has_credentials: true + id: Et accusamus sed non sequi. + label: Sunt est labore libero. + org_id: Natus expedita aspernatur consequuntur quod ducimus molestias. + project_id: Assumenda quam deleniti et et nam quia. + status: error + version: 313762477408274568 "400": description: 'BadRequest: Bad request' content: @@ -2207,7 +2208,7 @@ paths: $ref: '#/components/schemas/SetCredentialLinkedinAdsRequestBody' example: credentials: - access_token: Eum est molestiae necessitatibus magni. + access_token: Illo minima eaque earum. responses: "204": description: No Content response. @@ -2274,7 +2275,7 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ex est facilis qui ducimus modi ut. + message: Voluptatem iste nisi in aperiam. ok: true "404": description: 'NotFound: Resource not found' @@ -2379,22 +2380,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut maiores ea omnis quia quas. - example: Sunt odit molestiae ab praesentium enim. + example: Et voluptatum excepturi nemo. + example: Veniam doloremque dolores voluptatum aut mollitia aperiam. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection3' example: - account_id: Qui nobis et delectus quam. - app_id: Est dolor ut corporis. + account_id: Est distinctio sunt aliquid harum quis nam. + app_id: Consectetur sint error ipsam maiores. has_credentials: true - id: Laboriosam qui id enim. - label: Nihil corrupti repellat eius. - page_id: Aut fuga. - project_id: Magni repudiandae. - status: deleted - version: 2782071096062379507 + id: Facilis qui ducimus modi ut culpa. + label: Eius error autem. + page_id: Rerum illo mollitia odio et dolor. + project_id: Blanditiis officiis quia quisquam corrupti distinctio. + status: active + version: 2737266573164142326 "404": description: 'NotFound: Resource not found' content: @@ -2449,12 +2450,12 @@ paths: example: config: account_id: act_193556282970417 - app_id: Distinctio sunt aliquid harum quis nam rerum. - label: Excepturi blanditiis officiis quia quisquam. - page_id: Distinctio voluptas eius error autem est. + app_id: Qui rerum est sed sed. + label: Quis quam dolor occaecati earum iusto rerum. + page_id: Cupiditate nobis. credentials: - access_token: Eius est rerum illo mollitia. - app_secret: Et dolor et consectetur sint error. + access_token: Enim ea. + app_secret: Quidem molestiae deleniti omnis. responses: "201": description: Created response. @@ -2464,22 +2465,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Omnis ipsam ad sed laudantium ut ea. - example: Ad a et inventore tempora facilis dolores. + example: Hic voluptatibus accusamus vel. + example: Quo maxime laboriosam alias molestiae ea. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection2' example: - account_id: Ad inventore voluptatum eligendi quasi. - app_id: Placeat unde distinctio ducimus qui. - has_credentials: true - id: Deleniti voluptates non sint inventore. - label: Porro voluptate. - page_id: Aperiam velit dolores. - project_id: Iure ut nostrum facilis suscipit. - status: inactive - version: 358292288538552244 + account_id: Sed numquam necessitatibus laudantium est ut. + app_id: Voluptatem possimus et corrupti et nobis. + has_credentials: false + id: Nostrum corporis quasi magnam. + label: Ipsa quo vel architecto quas eligendi impedit. + page_id: Qui possimus. + project_id: Qui quidem exercitationem. + status: deleted + version: 5650595339177390494 "400": description: 'BadRequest: Bad request' content: @@ -2552,9 +2553,9 @@ paths: example: config: account_id: act_193556282970417 - app_id: Distinctio sunt aliquid harum quis nam rerum. - label: Excepturi blanditiis officiis quia quisquam. - page_id: Distinctio voluptas eius error autem est. + app_id: Qui rerum est sed sed. + label: Quis quam dolor occaecati earum iusto rerum. + page_id: Cupiditate nobis. responses: "200": description: OK response. @@ -2564,22 +2565,22 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Natus ratione. - example: Amet quam consequuntur nulla quaerat. + example: Porro et fuga facere est qui vero. + example: Molestias quisquam est. content: application/json: schema: $ref: '#/components/schemas/MetaAdsConnection4' example: - account_id: Quos hic doloribus. - app_id: Qui a necessitatibus molestiae qui unde. + account_id: Porro voluptate. + app_id: Velit dolores omnis placeat unde distinctio ducimus. has_credentials: false - id: Illo vitae occaecati omnis. - label: Explicabo possimus consequatur. - page_id: Eos velit eum et sint corrupti. - project_id: Pariatur debitis. - status: deleted - version: 3363918130362824521 + id: Perspiciatis deleniti. + label: Facilis suscipit. + page_id: Eligendi quasi eos ipsa et dolore. + project_id: Non sint inventore iste iure ut. + status: error + version: 7363633618316247458 "400": description: 'BadRequest: Bad request' content: @@ -2661,8 +2662,8 @@ paths: $ref: '#/components/schemas/SetCredentialMetaAdsRequestBody' example: credentials: - access_token: Eius est rerum illo mollitia. - app_secret: Et dolor et consectetur sint error. + access_token: Enim ea. + app_secret: Quidem molestiae deleniti omnis. responses: "204": description: No Content response. @@ -2729,8 +2730,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Dolorem qui explicabo consequuntur repellat non suscipit. - ok: false + message: Dignissimos non sed omnis officiis et. + ok: true "404": description: 'NotFound: Resource not found' content: @@ -2834,21 +2835,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Quidem est. - example: Corporis deserunt quae. + example: Soluta porro distinctio cupiditate. + example: Voluptatem optio perspiciatis reprehenderit. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection3' example: - account_id: Dolor ut velit quam omnis et dolor. - customer_id: Vitae vel omnis autem accusamus mollitia. - has_credentials: false - id: Maxime dicta qui aut. - label: Velit et impedit facilis quaerat. - project_id: Suscipit eos nam ipsa. - status: deleted - version: 443094643112211074 + account_id: Deserunt quod. + customer_id: Nisi blanditiis eveniet quasi ea. + has_credentials: true + id: Perspiciatis porro. + label: Rem error. + project_id: Distinctio amet enim. + status: active + version: 3519020753859014023 "404": description: 'NotFound: Resource not found' content: @@ -2902,14 +2903,14 @@ paths: $ref: '#/components/schemas/CreateMicrosoftAdsRequestBody' example: config: - account_id: Enim non rem error voluptas deserunt. - customer_id: Officiis aperiam quos. - label: Nihil dolores perspiciatis porro veniam distinctio. + account_id: Ut necessitatibus dolor nemo. + customer_id: Nisi numquam nihil id unde. + label: Voluptatem sed illo numquam praesentium tenetur quas. credentials: - client_id: Nisi blanditiis eveniet quasi ea. - client_secret: Ut corporis dolorum consequatur eius perferendis nobis. - developer_token: Et et itaque sunt. - refresh_token: Vel voluptate necessitatibus. + client_id: Officiis aut fugiat optio ut. + client_secret: Et voluptas tenetur nobis facere. + developer_token: Blanditiis mollitia dolores illo nostrum magnam. + refresh_token: Quo corporis recusandae dicta quibusdam. responses: "201": description: Created response. @@ -2919,21 +2920,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sint expedita fugit iste nemo voluptas. - example: Fugit unde ea quis. + example: Ipsum ullam quis est incidunt debitis qui. + example: Quia sunt dignissimos pariatur dolorem natus. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection2' example: - account_id: Repellendus porro et distinctio. - customer_id: Quia eaque. + account_id: Eum et ipsum expedita reprehenderit eos. + customer_id: Deleniti nostrum. has_credentials: true - id: Labore omnis provident nihil aut rerum est. - label: Sint non. - project_id: Amet rem ab. - status: error - version: 5425752825388180685 + id: Omnis nobis. + label: Rerum explicabo. + project_id: Deserunt repellendus corrupti itaque quo sit. + status: deleted + version: 7665319414608673783 "400": description: 'BadRequest: Bad request' content: @@ -3005,9 +3006,9 @@ paths: $ref: '#/components/schemas/UpdateMicrosoftAdsRequestBody' example: config: - account_id: Enim non rem error voluptas deserunt. - customer_id: Officiis aperiam quos. - label: Nihil dolores perspiciatis porro veniam distinctio. + account_id: Ut necessitatibus dolor nemo. + customer_id: Nisi numquam nihil id unde. + label: Voluptatem sed illo numquam praesentium tenetur quas. responses: "200": description: OK response. @@ -3017,21 +3018,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut mollitia. - example: Pariatur ratione blanditiis. + example: Necessitatibus quam. + example: Assumenda repellat et rerum cum. content: application/json: schema: $ref: '#/components/schemas/MicrosoftAdsConnection4' example: - account_id: Esse voluptate eum laboriosam distinctio non. - customer_id: Id aut et adipisci quo ut. + account_id: Labore omnis provident nihil aut rerum est. + customer_id: Corporis sint non dolorem repellendus. has_credentials: false - id: Rem quia vel ipsam dolores. - label: Ullam facilis ab sapiente voluptatem. - project_id: Et qui ut libero numquam. - status: inactive - version: 8626906144120400240 + id: Vel voluptate necessitatibus. + label: Mollitia aut rerum quis et modi. + project_id: Et et itaque sunt. + status: active + version: 2920255620636300538 "400": description: 'BadRequest: Bad request' content: @@ -3113,10 +3114,10 @@ paths: $ref: '#/components/schemas/SetCredentialGoogleAdsRequestBody' example: credentials: - client_id: Nisi blanditiis eveniet quasi ea. - client_secret: Ut corporis dolorum consequatur eius perferendis nobis. - developer_token: Et et itaque sunt. - refresh_token: Vel voluptate necessitatibus. + client_id: Officiis aut fugiat optio ut. + client_secret: Et voluptas tenetur nobis facere. + developer_token: Blanditiis mollitia dolores illo nostrum magnam. + refresh_token: Quo corporis recusandae dicta quibusdam. responses: "204": description: No Content response. @@ -3183,8 +3184,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Voluptates ut culpa saepe necessitatibus. - ok: true + message: Distinctio dolor aut assumenda fugiat quia. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -3288,20 +3289,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Consequatur beatae. - example: Totam dolorem. + example: Et et. + example: At qui error totam aut. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection3' example: - account_id: Iusto omnis. - has_credentials: false - id: Odio totam cum deleniti placeat fuga. - label: Et ut quis ut. - project_id: Saepe voluptatem reiciendis pariatur. - status: error - version: 757606501996618102 + account_id: Unde dicta autem dolorem qui explicabo. + has_credentials: true + id: Omnis neque autem ex eos. + label: A necessitatibus molestiae. + project_id: Eum et sint corrupti eos. + status: deleted + version: 4219814008454412160 "404": description: 'NotFound: Resource not found' content: @@ -3356,11 +3357,11 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Sit tempore. + label: Laboriosam qui id enim. credentials: - client_id: Magnam ut similique ea minima magnam. - client_secret: Ut quo iure. - refresh_token: Sit est dolores est et. + client_id: Magni repudiandae. + client_secret: Nihil corrupti repellat eius. + refresh_token: Qui nobis et delectus quam. responses: "201": description: Created response. @@ -3370,20 +3371,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Iure tempora non ea facilis nihil eius. - example: Corporis nesciunt ipsam voluptates magnam atque. + example: Quos atque dolorem error fugiat qui. + example: Enim molestiae suscipit sequi et. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection2' example: - account_id: Non laudantium sunt minima repudiandae illo harum. + account_id: Pariatur debitis. has_credentials: true - id: Atque laudantium. - label: Enim accusantium labore esse numquam. - project_id: Rerum earum rerum adipisci. - status: inactive - version: 6816002535409129912 + id: Est dolor ut corporis. + label: Illo vitae occaecati omnis. + project_id: Cupiditate ut illo dolor quaerat totam. + status: active + version: 1381780689877724774 "400": description: 'BadRequest: Bad request' content: @@ -3456,7 +3457,7 @@ paths: example: config: account_id: t2_gv9wtbfa - label: Sit tempore. + label: Laboriosam qui id enim. responses: "200": description: OK response. @@ -3466,20 +3467,20 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Aut enim. - example: Voluptas a natus est dolor voluptatum. + example: Veritatis culpa quasi qui iure consequuntur porro. + example: Nobis quas sunt dolorum. content: application/json: schema: $ref: '#/components/schemas/RedditAdsConnection4' example: - account_id: Et rerum in expedita. + account_id: Perferendis velit atque. has_credentials: true - id: Voluptatum ducimus tempore quae eum consequatur dolore. - label: Quo veritatis quis delectus est. - project_id: Illum illum dolores tenetur ut illum. + id: Ut similique ea minima magnam non ut. + label: Est dolores est et recusandae nihil. + project_id: Iure nam. status: active - version: 4673192311933251173 + version: 4591742417728159020 "400": description: 'BadRequest: Bad request' content: @@ -3561,9 +3562,9 @@ paths: $ref: '#/components/schemas/SetCredentialRedditAdsRequestBody' example: credentials: - client_id: Magnam ut similique ea minima magnam. - client_secret: Ut quo iure. - refresh_token: Sit est dolores est et. + client_id: Magni repudiandae. + client_secret: Nihil corrupti repellat eius. + refresh_token: Qui nobis et delectus quam. responses: "204": description: No Content response. @@ -3630,8 +3631,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Assumenda nesciunt distinctio eaque. - ok: true + message: Adipisci sint enim. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -3735,21 +3736,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Odio autem perferendis accusamus nulla placeat aut. - example: Aliquid quia natus. + example: Quasi vel sint nisi laborum laboriosam assumenda. + example: Ut totam quia ipsam quia ut quibusdam. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection3' example: - account_id: Id unde veritatis officiis aut fugiat. - funding_instrument_id: Voluptas tenetur nobis facere. + account_id: Magni consequatur dignissimos itaque quia. + funding_instrument_id: Et voluptatem deserunt consequuntur omnis sed dolore. has_credentials: true - id: Eaque voluptate reprehenderit sed voluptatem sed illo. - label: Cum nisi numquam. - project_id: Praesentium tenetur quas at ut necessitatibus dolor. - status: active - version: 4642810346647163563 + id: Repellat assumenda nesciunt distinctio eaque aliquam. + label: Et reprehenderit dignissimos. + project_id: Veniam consectetur deserunt in hic dolorum facere. + status: inactive + version: 7072791787806691868 "404": description: 'NotFound: Resource not found' content: @@ -3804,13 +3805,13 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Deserunt in hic dolorum facere ipsa et. - label: Repellat veniam. + funding_instrument_id: Dolorem non laudantium sunt minima repudiandae illo. + label: Labore esse. credentials: - access_token: Possimus et. - access_token_secret: Deserunt consequuntur omnis. - consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. - consumer_secret: Ut aperiam. + access_token: Deleniti placeat fuga aut saepe. + access_token_secret: Reiciendis pariatur repellat. + consumer_key: Nulla dolorum deserunt ut sit dolor. + consumer_secret: Eos nihil ipsam ex odio totam. responses: "201": description: Created response. @@ -3820,21 +3821,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Sit dignissimos est. - example: Harum esse. + example: Eum aut delectus voluptatem. + example: Repudiandae sequi. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection2' example: - account_id: Vitae aut ea. - funding_instrument_id: Aut sit architecto ut unde saepe. + account_id: Illum illum dolores tenetur ut illum. + funding_instrument_id: Delectus est aut et rerum in expedita. has_credentials: true - id: Non iste ad rem quidem sunt qui. - label: Deleniti doloribus debitis assumenda dignissimos. - project_id: Ullam ab suscipit et labore harum. - status: error - version: 753723066786334950 + id: Omnis consequatur. + label: Voluptatum ducimus tempore quae eum consequatur dolore. + project_id: Cum non atque aut autem sint. + status: active + version: 1365614189000530579 "400": description: 'BadRequest: Bad request' content: @@ -3907,8 +3908,8 @@ paths: example: config: account_id: 8r7gb - funding_instrument_id: Deserunt in hic dolorum facere ipsa et. - label: Repellat veniam. + funding_instrument_id: Dolorem non laudantium sunt minima repudiandae illo. + label: Labore esse. responses: "200": description: OK response. @@ -3918,21 +3919,21 @@ paths: schema: type: string description: ETag header value (mirrors version) - example: Voluptatibus ut. - example: Fugit nostrum rerum. + example: Delectus vel. + example: Iure doloremque vel et aut. content: application/json: schema: $ref: '#/components/schemas/TwitterAdsConnection4' example: - account_id: Deserunt repellendus corrupti itaque quo sit. - funding_instrument_id: Eum et ipsum expedita reprehenderit eos. + account_id: Quam officiis aut sit architecto ut unde. + funding_instrument_id: Voluptates atque. has_credentials: false - id: Blanditiis mollitia dolores illo nostrum magnam. - label: Omnis nobis. - project_id: Nostrum tempore. - status: inactive - version: 6605548766358472787 + id: Sunt qui cupiditate ullam ab suscipit et. + label: Assumenda dignissimos beatae vitae aut ea dolor. + project_id: Harum corporis deleniti doloribus. + status: active + version: 7481335546350109928 "400": description: 'BadRequest: Bad request' content: @@ -4014,10 +4015,10 @@ paths: $ref: '#/components/schemas/SetCredentialTwitterAdsRequestBody' example: credentials: - access_token: Possimus et. - access_token_secret: Deserunt consequuntur omnis. - consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. - consumer_secret: Ut aperiam. + access_token: Deleniti placeat fuga aut saepe. + access_token_secret: Reiciendis pariatur repellat. + consumer_key: Nulla dolorum deserunt ut sit dolor. + consumer_secret: Eos nihil ipsam ex odio totam. responses: "204": description: No Content response. @@ -4084,8 +4085,8 @@ paths: schema: $ref: '#/components/schemas/ConnectionTestResult' example: - message: Ut architecto deleniti nostrum sed aperiam. - ok: true + message: Voluptate reprehenderit. + ok: false "404": description: 'NotFound: Resource not found' content: @@ -4139,9 +4140,9 @@ paths: schema: type: string description: Job UUID - example: 79c02b27-dc40-4b89-9073-64a5596694c3 + example: 35d610c9-3332-4801-9b65-11002ee56afa format: uuid - example: 52112f6b-ba24-497d-8dd7-e7c129c8add5 + example: a22e3d45-a3ff-4bb1-9983-d7ce7173fde7 responses: "200": description: OK response. @@ -4150,22 +4151,26 @@ paths: schema: $ref: '#/components/schemas/JobPollResponse' example: - error: Beatae est officia et sint. - job_id: Et dignissimos ex. + error: Aut aut ducimus dolores. + job_id: Accusantium enim temporibus dolor ipsam. result: - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - - campaign_id: Et voluptatem voluptatem voluptatem. - error: Omnis doloribus qui. - ok: true - platform: Nobis velit in. - status: running + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + - campaign_id: Quisquam voluptatibus sint quia. + error: Tempore nemo illum ut maiores. + ok: false + platform: Officiis est. + status: failed "400": description: 'BadRequest: Bad request' content: @@ -4237,79 +4242,85 @@ components: properties: copy: description: Ad copy - example: Vitae illo consequuntur esse. + example: Eligendi ipsam aut vel atque. etag: type: string description: ETag header value (mirrors version) - example: Officia natus quia labore. + example: In voluptas. event_details: description: Extracted event/course details - example: Quia recusandae dignissimos dolore harum totam. + example: Rerum cum eaque nesciunt est totam inventore. event_slug: type: string - description: Event/course slug - example: Molestiae eius in reprehenderit nobis hic. + description: Event/course slug (unique within the project) + example: Exercitationem eligendi magni quidem. id: type: string description: Brief UUID - example: Aliquid dignissimos minima aut fugit. + example: Amet quaerat modi. keywords: description: Keyword list - example: Libero recusandae ut ullam aliquam. + example: Reiciendis sit minima. platforms: type: array items: type: string - example: Harum aliquam sunt eum. - description: Suggested default platforms + example: Perspiciatis alias et amet ex molestiae. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Occaecati facere voluptatibus nihil nisi. - - Distinctio tempore qui velit omnis dolorem est. + - Libero et consequuntur suscipit distinctio pariatur mollitia. + - Autem quo tempora voluptate fuga. + - Distinctio maiores mollitia aut. program_type: type: string description: Funnel context - example: Ipsum neque sapiente aliquid quidem velit. + example: events + enum: + - events + - education + - membership project_id: type: string description: Owning project - example: Et iure laudantium quia est molestiae. + example: Eum totam voluptatem eos. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Iure consequatur minus nostrum iste nemo. + example: Unde et. url: type: string description: Event/course page URL - example: Magni eos voluptatem sint hic ut. + example: In quia. version: type: integer description: Optimistic-concurrency version - example: 3221003988771868872 + example: 1675828466631258091 format: int64 example: - copy: Quod exercitationem. - etag: Enim nam id. - event_details: Repellendus eveniet veritatis impedit aut iste earum. - event_slug: Sequi ea ut vero consequatur possimus. - id: Ut dolores et incidunt. - keywords: Pariatur saepe ab qui et. + copy: Magni eos voluptatem sint hic ut. + etag: Nisi repudiandae. + event_details: Molestiae eius in reprehenderit nobis hic. + event_slug: Est natus sequi beatae. + id: Placeat dolores numquam molestias quibusdam aliquid. + keywords: Harum aliquam sunt eum. platforms: - - Et magni ad et provident. - - Non quisquam iure. - - Est ut aliquid. - program_type: Ipsam tempora est. - project_id: Ipsa fugiat assumenda. - status: archived - targeting: Laboriosam sunt quis omnis animi. - url: Assumenda sit delectus veniam. - version: 3928799509074172783 + - Similique omnis. + - Aliquid dignissimos minima aut fugit. + - Et iure laudantium quia est molestiae. + - Ipsum neque sapiente aliquid quidem velit. + program_type: events + project_id: Fuga est aliquam debitis. + status: draft + targeting: Eaque occaecati. + url: Aut omnis labore et quis consequatur dolores. + version: 1167300153394787715 required: - id - project_id @@ -4322,77 +4333,80 @@ components: properties: copy: description: Ad copy - example: Sit facere iste et alias. + example: Quo veritatis nisi velit distinctio animi. event_details: description: Extracted event/course details - example: Ut iste et aspernatur delectus. + example: Sapiente perspiciatis dolores dignissimos soluta non vel. event_slug: type: string - description: Event/course slug - example: Aspernatur culpa sed non qui ad. + description: Event/course slug (unique within the project) + example: Aut mollitia pariatur perferendis placeat dolores. id: type: string description: Brief UUID - example: Perspiciatis ea dolor. + example: Sint nisi sunt sed. keywords: description: Keyword list - example: Magni ad doloremque soluta et quam totam. + example: Provident rerum et voluptas tenetur esse. platforms: type: array items: type: string - example: Rerum voluptatem saepe eligendi eum non. - description: Suggested default platforms + example: Qui pariatur odio reprehenderit nam. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Totam occaecati enim eaque blanditiis deleniti reprehenderit. - - Quas commodi. - - Qui mollitia architecto recusandae voluptates excepturi reiciendis. - - Consequatur amet dolorem qui. + - Et id sint suscipit quia ipsa voluptas. + - Non neque optio. + - Architecto molestiae cum. + - Perspiciatis consequatur beatae sunt officiis sequi qui. program_type: type: string description: Funnel context - example: Ratione dicta. + example: membership + enum: + - events + - education + - membership project_id: type: string description: Owning project - example: Dolores qui. + example: Dolor eaque culpa quae eius omnis id. status: type: string description: Lifecycle status - example: archived + example: approved enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Eos repudiandae voluptate est enim aut laborum. + example: Assumenda sed minima nihil. url: type: string description: Event/course page URL - example: Voluptas qui. + example: Dolore voluptatem qui eveniet amet. version: type: integer description: Optimistic-concurrency version - example: 7978828505057037537 + example: 9087350093442770114 format: int64 example: - copy: Autem aperiam quis. - event_details: Quae qui optio magni itaque iure. - event_slug: Consequatur velit atque nam voluptatem in. - id: Est et beatae. - keywords: Enim odit numquam. + copy: Dolor cumque dolores. + event_details: Ad et in voluptatem et perspiciatis. + event_slug: Quia aut impedit a veritatis. + id: Voluptatem vel dolor molestiae quia voluptatem. + keywords: Aut ratione dicta. platforms: - - Ea ut voluptatem velit. - - Aut est est eum ut ut. - - Et molestiae blanditiis nihil dolor exercitationem. - - Placeat dolores culpa sed. - program_type: Repellendus autem ullam odio quis. - project_id: Est officiis enim qui. + - Qui voluptas veniam. + - Voluptas maxime non illo ab in voluptatem. + - Est magnam molestiae soluta. + program_type: education + project_id: Libero qui. status: draft - targeting: Placeat aut dolores at. - url: Explicabo voluptatem et. - version: 2226888956028863556 + targeting: Aspernatur culpa sed non qui ad. + url: Consequuntur sed ea sunt debitis. + version: 1905073879386313651 required: - id - project_id @@ -4405,75 +4419,79 @@ components: properties: copy: description: Ad copy - example: Quia amet vero dolorum incidunt officia nihil. + example: Alias quis magni ad doloremque. event_details: description: Extracted event/course details - example: Optio enim nisi doloremque rerum sed consequatur. + example: Facere iste. event_slug: type: string - description: Event/course slug - example: Ut aspernatur et ad. + description: Event/course slug (unique within the project) + example: Reprehenderit saepe quas commodi qui qui mollitia. id: type: string description: Brief UUID - example: Dignissimos voluptatem et labore sit atque qui. + example: Facere rerum voluptatem saepe eligendi. keywords: description: Keyword list - example: Dolores dignissimos perferendis tempore eum laboriosam iure. + example: Et quam totam. platforms: type: array items: type: string - example: Vel aut rerum voluptatem ad minus. - description: Suggested default platforms + example: Reiciendis numquam consequatur. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Cum nemo esse nobis. - - Aut dolorem ea veniam. - - Quae adipisci doloribus ullam. - - Dolor eum et consequatur. + - Qui eaque ut iste. + - Aspernatur delectus rem. program_type: type: string description: Funnel context - example: Unde dolore id a necessitatibus fuga ducimus. + example: education + enum: + - events + - education + - membership project_id: type: string description: Owning project - example: Aut eaque eveniet autem. + example: Non minima possimus totam occaecati enim eaque. status: type: string description: Lifecycle status - example: draft + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: At magnam saepe incidunt nisi est. + example: Eos repudiandae voluptate est enim aut laborum. url: type: string description: Event/course page URL - example: Magnam sequi esse at. + example: Recusandae voluptates. version: type: integer description: Optimistic-concurrency version - example: 3943386503686697829 + example: 7978828505057037537 format: int64 example: - copy: Quos labore est ut ratione. - event_details: Sint molestiae occaecati. - event_slug: Deleniti non in iure dolores et quis. - id: Distinctio possimus. - keywords: Ut occaecati tenetur minima. + copy: Quae qui optio magni itaque iure. + event_details: Placeat dolores culpa sed. + event_slug: Autem ullam. + id: Est et beatae. + keywords: Autem aperiam quis. platforms: - - Minus natus. - - Doloribus nam eius nulla suscipit ullam accusamus. - program_type: Id ducimus excepturi est et est. - project_id: Aliquid qui facilis neque sed alias. + - Eveniet explicabo voluptatem et quis. + - Ea ut voluptatem velit. + - Aut est est eum ut ut. + - Et molestiae blanditiis nihil dolor exercitationem. + program_type: events + project_id: Est officiis enim qui. status: archived - targeting: Sed impedit. - url: Recusandae similique assumenda ut quia. - version: 5475183181677687295 + targeting: Enim odit numquam. + url: Quis sed consequatur velit atque nam. + version: 4992739119008200883 required: - id - project_id @@ -4486,74 +4504,81 @@ components: properties: copy: description: Ad copy - example: Laborum quia beatae non et excepturi. + example: Dolor eum et consequatur. event_details: description: Extracted event/course details - example: Molestias voluptatibus nam debitis hic qui. + example: Quae adipisci doloribus ullam. event_slug: type: string - description: Event/course slug - example: Exercitationem voluptatum perspiciatis autem. + description: Event/course slug (unique within the project) + example: Dignissimos aut eaque. id: type: string description: Brief UUID - example: Ut ut qui sed explicabo dolorem totam. + example: Dolores at voluptatem beatae quis dignissimos. keywords: description: Keyword list - example: Minus officiis et quisquam dicta rerum. + example: Optio enim nisi doloremque rerum sed consequatur. platforms: type: array items: type: string - example: Sunt labore voluptate. - description: Suggested default platforms + example: Fuga ducimus dolorem ut. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Ipsum quo possimus saepe quam. - - Qui cum. + - Ad optio magnam sequi esse. + - Modi vel aut rerum. + - Ad minus vero assumenda cum nemo. + - Nobis assumenda aut dolorem ea veniam. program_type: type: string description: Funnel context - example: Vero nulla laboriosam vel et et iure. + example: events + enum: + - events + - education + - membership project_id: type: string description: Owning project - example: Qui nesciunt sed magnam. + example: Et labore sit. status: type: string description: Lifecycle status - example: archived + example: approved enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Enim est libero enim quo. + example: Quia amet vero dolorum incidunt officia nihil. url: type: string description: Event/course page URL - example: Eum ut. + example: Autem ut unde dolore id a. version: type: integer description: Optimistic-concurrency version - example: 888507263129682759 + example: 2033029701447525509 format: int64 example: - copy: Et fuga veniam. - event_details: Aliquid eum itaque qui recusandae recusandae. - event_slug: Illum expedita commodi in dolores nemo similique. - id: Dolorem neque assumenda sed sapiente aspernatur ipsam. - keywords: Ea et iusto doloremque odio pariatur. + copy: Corrupti sint molestiae occaecati est. + event_details: Nam eius nulla suscipit ullam. + event_slug: Sint consequuntur omnis distinctio possimus non aliquid. + id: Perferendis tempore eum laboriosam. + keywords: Labore est ut ratione nobis ut occaecati. platforms: - - Voluptatem libero quia. - - Harum molestiae cupiditate ab et eum ex. - - Quia velit adipisci. - program_type: Dignissimos in tempore quo consequatur sint qui. - project_id: Qui illo totam. - status: archived - targeting: Expedita animi ut velit at. - url: Autem impedit. - version: 6980228077781980481 + - Est et est. + - Deleniti non in iure dolores et quis. + - Recusandae similique assumenda ut quia. + - Nesciunt minus natus non. + program_type: membership + project_id: Odio at magnam saepe incidunt. + status: approved + targeting: Minima veritatis sed impedit laborum. + url: Facilis neque sed alias dolore id. + version: 7666233696583259840 required: - id - project_id @@ -4566,74 +4591,78 @@ components: properties: copy: description: Ad copy - example: Quo soluta maxime temporibus earum et aperiam. + example: Consequatur laborum. event_details: description: Extracted event/course details - example: Amet officia occaecati quam nostrum quis voluptas. + example: Cum ipsa molestias voluptatibus nam debitis hic. event_slug: type: string - description: Event/course slug - example: Sapiente alias et error nobis minima. + description: Event/course slug (unique within the project) + example: Et et iure tempora exercitationem voluptatum. id: type: string description: Brief UUID - example: Ratione est omnis voluptas praesentium. + example: Ut qui sed explicabo dolorem totam non. keywords: description: Keyword list - example: Ab itaque tempore vel quia cum quas. + example: Beatae non et excepturi sit minus. platforms: type: array items: type: string - example: Fuga maxime tempora rem. - description: Suggested default platforms + example: Ut corrupti sunt labore. + description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Debitis rerum. - - Dolor pariatur. + - Cum ipsum quo possimus. + - Quam culpa. program_type: type: string description: Funnel context - example: Laboriosam et. + example: events + enum: + - events + - education + - membership project_id: type: string description: Owning project - example: Aspernatur voluptatum facilis. + example: Nesciunt sed magnam sed vero nulla. status: type: string description: Lifecycle status - example: approved + example: archived enum: - draft - approved - archived targeting: description: Targeting recommendation - example: Minus sit necessitatibus. + example: Et quisquam dicta. url: type: string description: Event/course page URL - example: Reprehenderit dolorem impedit qui suscipit ipsa ut. + example: Autem et. version: type: integer description: Optimistic-concurrency version - example: 4889810267187914144 + example: 6074244296634719915 format: int64 example: - copy: Excepturi cumque ullam esse. - event_details: Quia voluptates voluptates nisi nihil aut molestias. - event_slug: Sed commodi voluptatibus. - id: Et est debitis ea. - keywords: Non autem voluptatem ut. + copy: Adipisci vel. + event_details: Et eum ex doloremque quia. + event_slug: Ipsam consequatur qui illo totam. + id: Est libero enim quo sit aut tempora. + keywords: Eum itaque. platforms: - - Facilis asperiores enim nisi. - - Perspiciatis optio. - - Quia doloribus omnis et excepturi fugit dolores. - program_type: Nemo molestiae modi ut non atque. - project_id: Eum voluptatum accusamus illo eveniet eum. - status: approved - targeting: Distinctio non recusandae et qui ut exercitationem. - url: Nobis est fugit ratione consectetur exercitationem. - version: 1659901820906198210 + - Expedita commodi in dolores. + - Similique eaque autem impedit tenetur voluptatibus. + - Libero quia quam harum molestiae cupiditate. + program_type: membership + project_id: Neque assumenda sed. + status: draft + targeting: Recusandae recusandae est et fuga veniam natus. + url: Dignissimos in tempore quo consequatur sint qui. + version: 3604003677758724955 required: - id - project_id @@ -4646,54 +4675,56 @@ components: properties: copy: description: Ad copy - example: Tempora voluptate fuga ea distinctio. + example: Praesentium et. event_details: description: Extracted event/course details - example: Pariatur mollitia incidunt autem. + example: Dolor consectetur eos iste. event_slug: type: string description: Event/course slug (unique within the project) - example: Quis harum recusandae. + example: Porro commodi odio sunt esse. keywords: description: Keyword list - example: Mollitia aut tempore rerum. + example: Veniam iusto consequatur quia sed officia eligendi. platforms: type: array items: type: string - example: Repellat eum totam voluptatem eos doloribus. + example: Itaque voluptatem est quis impedit. description: Suggested default platforms (a planning hint; binding selection is on the campaign) example: - - Eligendi magni quidem sit in quia. - - Perspiciatis alias et amet ex molestiae. - - Minus libero et consequuntur suscipit. + - Harum et consequatur eligendi eum necessitatibus. + - Magnam ut. + - Voluptate voluptates corrupti sapiente. + - Dolorum repellat expedita ut recusandae dolor. program_type: type: string description: Funnel context - example: membership + example: events enum: - events - education - membership targeting: description: Targeting recommendation - example: Eaque nesciunt. + example: Qui impedit. url: type: string description: Event/course page URL - example: Ipsum est amet quaerat. + example: Incidunt eos dolores laborum sed molestias. example: - copy: Beatae consectetur aut omnis labore et quis. - event_details: Natus deleniti est natus. - event_slug: Inventore in eligendi ipsam. - keywords: Dolores repellat. + copy: Animi sit esse ratione aliquid. + event_details: Repudiandae tenetur aperiam saepe vel. + event_slug: Alias minus reprehenderit dignissimos aut velit. + keywords: Laborum est quasi dignissimos. platforms: - - Itaque ut dolores in. - - Expedita placeat dolores numquam molestias. - - Aliquid deleniti fuga est aliquam. - program_type: education - targeting: Similique omnis. - url: Vel atque eos reiciendis sit minima non. + - Omnis doloribus. + - Cum ut quo. + - Necessitatibus id sint dicta assumenda omnis voluptatem. + - Praesentium voluptatem blanditiis non totam temporibus. + program_type: events + targeting: Velit quis harum recusandae est ipsum. + url: At sint laborum veniam. required: - program_type - event_slug @@ -4703,50 +4734,50 @@ components: brief_id: type: string description: Parent brief - example: Voluptas necessitatibus cumque non porro qui molestias. + example: Qui mollitia et eum veniam. campaign_name: type: string description: Campaign name - example: Nulla perferendis possimus deserunt iure et. + example: Culpa sed minima iure. etag: type: string description: ETag header value (mirrors version) - example: Omnis nesciunt qui. + example: Et tempora quaerat et eius. id: type: string description: Campaign UUID - example: Et minima dolorem sit. + example: Sint qui alias voluptatem ut. platform: type: string description: Channel - example: In praesentium cumque. + example: Aliquam eaque voluptatem omnis. platform_campaign_id: type: string description: ID returned by the ad platform - example: Pariatur odio molestias voluptatum. + example: Cupiditate aut. project_id: type: string description: Owning project - example: Tempora qui. + example: Ut recusandae modi. status: type: string description: Campaign status - example: Ea quidem ducimus tempora ea molestias. + example: Enim occaecati beatae eveniet molestiae ad voluptatum. version: type: integer description: Optimistic-concurrency version - example: 971659538665007246 + example: 1755263284665276006 format: int64 example: - brief_id: Odit provident sed quo aperiam. - campaign_name: Voluptatem repellat expedita inventore. - etag: Maxime hic aliquam ratione ipsum. - id: Quia fuga atque. - platform: Aspernatur nihil et incidunt dolorem dolor sed. - platform_campaign_id: Delectus harum voluptates sit est corporis. - project_id: Sequi culpa. - status: Necessitatibus ut necessitatibus in. - version: 5532967292288417247 + brief_id: Et asperiores. + campaign_name: Voluptatem aut debitis vitae unde velit eos. + etag: Et et itaque qui repudiandae magnam. + id: Magni illum consequatur quaerat soluta. + platform: Maiores reiciendis. + platform_campaign_id: Dolor ipsam recusandae maxime nesciunt repellendus. + project_id: Vitae autem in. + status: Accusantium odit rerum commodi ea. + version: 3660260905327304928 required: - id - project_id @@ -4761,45 +4792,45 @@ components: brief_id: type: string description: Parent brief - example: Et iste. + example: Velit at omnis autem. campaign_name: type: string description: Campaign name - example: Rerum reiciendis similique. + example: Laboriosam et. id: type: string description: Campaign UUID - example: Ea laboriosam totam unde. + example: Doloremque odio. platform: type: string description: Channel - example: Voluptas ut nostrum officiis et accusamus provident. + example: Ratione est omnis voluptas praesentium. platform_campaign_id: type: string description: ID returned by the ad platform - example: Odio eos earum fuga non est. + example: Aspernatur voluptatum facilis. project_id: type: string description: Owning project - example: Ipsa sint optio nobis quae corporis. + example: Ipsum expedita animi. status: type: string description: Campaign status - example: Tempora qui incidunt tempora. + example: Sapiente alias et error nobis minima. version: type: integer description: Optimistic-concurrency version - example: 7916176946868712323 + example: 4893105039439918924 format: int64 example: - brief_id: Voluptas incidunt eligendi consequatur. - campaign_name: Earum temporibus ipsum necessitatibus ratione possimus eum. - id: Voluptatem dolores tempora qui sit. - platform: Labore eos et repudiandae odit omnis cupiditate. - platform_campaign_id: Illo repellat et cum. - project_id: Voluptates soluta animi sit ut. - status: Repellat eveniet reiciendis consequatur consequatur sint. - version: 2970088391723074573 + brief_id: Tempora rem ab earum debitis rerum perspiciatis. + campaign_name: Voluptas itaque quo soluta maxime temporibus earum. + id: Dolorem impedit qui. + platform: Pariatur quae amet officia. + platform_campaign_id: Quam nostrum. + project_id: Ipsa ut animi fuga. + status: Aperiam et ab. + version: 8291275966671335223 required: - id - project_id @@ -4814,45 +4845,45 @@ components: brief_id: type: string description: Parent brief - example: Et et sed. + example: Aut est et. campaign_name: type: string description: Campaign name - example: Minima adipisci aut quia quisquam. + example: Consequatur nemo molestiae modi ut non atque. id: type: string description: Campaign UUID - example: Molestiae quo non. + example: Vel quia cum quas. platform: type: string description: Channel - example: Vel quaerat iure ipsam. + example: Debitis ea molestiae eum voluptatum. platform_campaign_id: type: string description: ID returned by the ad platform - example: Necessitatibus reprehenderit illum. + example: Illo eveniet. project_id: type: string description: Owning project - example: Reprehenderit natus. + example: Minus sit necessitatibus. status: type: string description: Campaign status - example: Quia facilis sit. + example: Sed commodi voluptatibus. version: type: integer description: Optimistic-concurrency version - example: 7577275663228988931 + example: 5825805897083964981 format: int64 example: - brief_id: Molestiae cupiditate quis modi blanditiis. - campaign_name: Distinctio dignissimos. - id: Nihil qui doloremque nam magnam aliquid impedit. - platform: Tempora quod expedita magni. - platform_campaign_id: Harum ipsa. - project_id: Accusantium expedita alias placeat incidunt sit perspiciatis. - status: Voluptatibus natus tempora commodi et. - version: 6630207652424081561 + brief_id: Perspiciatis optio. + campaign_name: Excepturi cumque ullam esse. + id: Est fugit ratione consectetur. + platform: Quia doloribus omnis et excepturi fugit dolores. + platform_campaign_id: Quia voluptates voluptates nisi nihil aut molestias. + project_id: Sed fuga facilis asperiores enim nisi. + status: Non autem voluptatem ut. + version: 7716950937642575525 required: - id - project_id @@ -4866,12 +4897,12 @@ components: properties: config: description: Per-platform campaign configuration - example: Impedit ullam eaque suscipit harum sint neque. + example: Omnis dolorem est aut quia recusandae. platforms: type: array items: type: string - example: twitter-ads + example: hubspot enum: - google-ads - linkedin-ads @@ -4882,16 +4913,12 @@ components: - hubspot description: Platforms to create campaigns on (binding selection) example: - - meta-ads - google-ads - - reddit-ads minItems: 1 example: - config: Optio consequatur nulla sint qui alias voluptatem. + config: Totam tempora vitae. platforms: - - linkedin-ads - reddit-ads - - google-ads required: - platforms CampaignUpdateInput: @@ -4900,18 +4927,18 @@ components: campaign_name: type: string description: Campaign name - example: Amet hic est. + example: Ullam qui rerum numquam quo. config: description: Campaign configuration snapshot - example: Quae esse mollitia et dolorum. + example: Quaerat molestias. status: type: string description: Campaign status - example: Quaerat occaecati rerum. + example: A quia magnam culpa ipsam totam. example: - campaign_name: Aspernatur quos est magnam voluptates. - config: Dolores dolore id dolore sed. - status: Libero autem quod saepe ullam ipsum. + campaign_name: Sequi aut veniam ratione. + config: Laboriosam cumque mollitia. + status: Perferendis omnis ad voluptas esse. required: - campaign_name - status @@ -4955,13 +4982,13 @@ components: message: type: string description: Human-readable detail - example: Accusantium totam quia. + example: Et enim totam et minima. ok: type: boolean description: Whether the credential authenticated against the provider - example: true + example: false example: - message: Debitis adipisci. + message: Est tempora qui. ok: false required: - ok @@ -4972,18 +4999,18 @@ components: $ref: '#/components/schemas/BriefInput' example: brief: - copy: Blanditiis quidem qui iusto sed. - event_details: Dolor molestias ipsa dolorum est. - event_slug: Accusantium ad. - keywords: Vel fuga recusandae. + copy: Autem veniam. + event_details: Vel autem voluptates. + event_slug: Et est laboriosam. + keywords: Enim unde omnis. platforms: - - Iste autem veniam et enim unde. - - Facere quam. - - Rem quia consequuntur ut. - - Consequatur quos atque voluptates quo sit. - program_type: membership - targeting: Nulla ut laboriosam. - url: Modi asperiores ut libero vel. + - Nam exercitationem consectetur sint. + - Necessitatibus ex ea ullam corrupti. + - Et omnis accusantium. + - Iure modi asperiores ut. + program_type: education + targeting: Quam sed rem quia consequuntur ut. + url: Facere sint totam sapiente vitae numquam ut. required: - brief CreateCampaignsRequestBody: @@ -4993,11 +5020,11 @@ components: $ref: '#/components/schemas/CampaignCreateInput' example: input: - config: Facere et exercitationem. + config: Quia quos ut tempora consequuntur cumque repudiandae. platforms: - microsoft-ads - - twitter-ads - - google-ads + - microsoft-ads + - linkedin-ads required: - input CreateGoogleAdsRequestBody: @@ -5013,10 +5040,10 @@ components: label: TLF Main login_customer_id: "9746983954" credentials: - client_id: Natus provident est. - client_secret: Id dolore. - developer_token: Non error. - refresh_token: Accusamus aperiam eos et architecto voluptas rerum. + client_id: Architecto itaque doloribus voluptatem consequatur quis fugiat. + client_secret: Recusandae qui culpa. + developer_token: Accusamus et atque enim. + refresh_token: Dolorum minus voluptatem. required: - config - credentials @@ -5029,14 +5056,14 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: config: - account_id: Voluptas aperiam. - brand_kit: Itaque fugit rerum cumque. - label: Dolores enim. - portal_id: Assumenda harum eos eveniet ut et laboriosam. - sender_email: Quos expedita voluptas qui eaque. - sender_name: Laudantium nostrum ratione id eius laborum aspernatur. + account_id: Maxime dicta qui aut. + brand_kit: Corrupti voluptas. + label: Dolor porro inventore alias error. + portal_id: Suscipit eos nam ipsa. + sender_email: Velit et impedit facilis quaerat. + sender_name: Dolor ut velit quam omnis et dolor. credentials: - private_app_token: Molestiae suscipit non iusto. + private_app_token: Vitae vel omnis autem accusamus mollitia. required: - config - credentials @@ -5050,10 +5077,10 @@ components: example: config: account_id: "538170226" - label: Dolorum consequatur in est. + label: Temporibus et provident maiores neque. org_id: "208777" credentials: - access_token: Eum est molestiae necessitatibus magni. + access_token: Illo minima eaque earum. required: - config - credentials @@ -5067,12 +5094,12 @@ components: example: config: account_id: act_193556282970417 - app_id: Distinctio sunt aliquid harum quis nam rerum. - label: Excepturi blanditiis officiis quia quisquam. - page_id: Distinctio voluptas eius error autem est. + app_id: Qui rerum est sed sed. + label: Quis quam dolor occaecati earum iusto rerum. + page_id: Cupiditate nobis. credentials: - access_token: Eius est rerum illo mollitia. - app_secret: Et dolor et consectetur sint error. + access_token: Enim ea. + app_secret: Quidem molestiae deleniti omnis. required: - config - credentials @@ -5085,14 +5112,14 @@ components: $ref: '#/components/schemas/MicrosoftAdsCredentials' example: config: - account_id: Enim non rem error voluptas deserunt. - customer_id: Officiis aperiam quos. - label: Nihil dolores perspiciatis porro veniam distinctio. + account_id: Ut necessitatibus dolor nemo. + customer_id: Nisi numquam nihil id unde. + label: Voluptatem sed illo numquam praesentium tenetur quas. credentials: - client_id: Nisi blanditiis eveniet quasi ea. - client_secret: Ut corporis dolorum consequatur eius perferendis nobis. - developer_token: Et et itaque sunt. - refresh_token: Vel voluptate necessitatibus. + client_id: Officiis aut fugiat optio ut. + client_secret: Et voluptas tenetur nobis facere. + developer_token: Blanditiis mollitia dolores illo nostrum magnam. + refresh_token: Quo corporis recusandae dicta quibusdam. required: - config - credentials @@ -5106,11 +5133,11 @@ components: example: config: account_id: t2_gv9wtbfa - label: Sit tempore. + label: Laboriosam qui id enim. credentials: - client_id: Magnam ut similique ea minima magnam. - client_secret: Ut quo iure. - refresh_token: Sit est dolores est et. + client_id: Magni repudiandae. + client_secret: Nihil corrupti repellat eius. + refresh_token: Qui nobis et delectus quam. required: - config - credentials @@ -5124,13 +5151,13 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Deserunt in hic dolorum facere ipsa et. - label: Repellat veniam. + funding_instrument_id: Dolorem non laudantium sunt minima repudiandae illo. + label: Labore esse. credentials: - access_token: Possimus et. - access_token_secret: Deserunt consequuntur omnis. - consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. - consumer_secret: Ut aperiam. + access_token: Deleniti placeat fuga aut saepe. + access_token_secret: Reiciendis pariatur repellat. + consumer_key: Nulla dolorum deserunt ut sit dolor. + consumer_secret: Eos nihil ipsam ex odio totam. required: - config - credentials @@ -5140,11 +5167,11 @@ components: account_id: type: string description: Provider account identifier - example: Voluptatibus aliquam et. + example: Voluptatem repellat expedita inventore. etag: type: string description: ETag header value (mirrors version) - example: Mollitia dolorem. + example: In doloremque autem maxime hic aliquam ratione. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5152,19 +5179,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Modi consequatur molestias et et deleniti. + example: Odit provident sed quo aperiam. label: type: string description: Optional friendly name - example: Atque hic quam impedit placeat. + example: Delectus harum voluptates sit est corporis. login_customer_id: type: string description: Manager account used for API access - example: Consequatur enim voluptas numquam aut et. + example: Reprehenderit amet hic est odio. project_id: type: string description: Owning project - example: Reiciendis odit eos et quidem. + example: Aspernatur nihil et incidunt dolorem dolor sed. status: type: string description: Connection status @@ -5177,18 +5204,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2538353845791645445 + example: 2066924184302318041 format: int64 example: - account_id: Rem fugit accusantium est. - etag: Dolorem asperiores autem aut aut soluta. - has_credentials: true - id: Eius dolor magnam necessitatibus amet. - label: Rerum tempore tempora. - login_customer_id: Et est et corporis. - project_id: Earum aut qui. - status: active - version: 6983147448769937945 + account_id: Ullam ipsum. + etag: Dolore sed. + has_credentials: false + id: Occaecati rerum reiciendis. + label: Magnam voluptates molestiae libero autem quod. + login_customer_id: Sunt accusantium totam quia. + project_id: Esse mollitia et dolorum accusantium aspernatur quos. + status: error + version: 3252068377050447352 required: - id - project_id @@ -5203,31 +5230,31 @@ components: account_id: type: string description: Provider account identifier - example: Sed ipsam enim esse iure est. + example: Corporis et iste impedit voluptas. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Minima dolorem omnis aspernatur veritatis adipisci. + example: Non recusandae et qui ut exercitationem officia. label: type: string description: Optional friendly name - example: Voluptas ipsam iste. + example: Unde quia ipsa sint optio nobis quae. login_customer_id: type: string description: Manager account used for API access - example: Quis quod aut sunt ex et autem. + example: Accusamus provident omnis. project_id: type: string description: Owning project - example: Repellendus adipisci sit et enim quasi ut. + example: Tempora ea laboriosam. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -5236,17 +5263,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5457180552368415477 + example: 3989869738197030603 format: int64 example: - account_id: Natus aliquam aut quas aliquid. - has_credentials: true - id: Non adipisci omnis veritatis omnis. - label: Placeat et. - login_customer_id: Laboriosam praesentium beatae quis. - project_id: Omnis reprehenderit. - status: active - version: 5939335900418206229 + account_id: Repellendus saepe voluptatem dolores. + has_credentials: false + id: Eos earum fuga. + label: Reiciendis similique laborum tempora qui incidunt. + login_customer_id: Voluptates soluta animi sit ut. + project_id: Est facilis. + status: deleted + version: 3133980880975603750 required: - id - project_id @@ -5260,31 +5287,31 @@ components: account_id: type: string description: Provider account identifier - example: Vero provident voluptas consequatur iusto. + example: Earum temporibus ipsum necessitatibus ratione possimus eum. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Eius harum. + example: Voluptas incidunt eligendi consequatur. label: type: string description: Optional friendly name - example: Nihil excepturi provident saepe aliquam architecto. + example: Illo repellat et cum. login_customer_id: type: string description: Manager account used for API access - example: Ut magnam aut illum commodi placeat sed. + example: Consequatur consequatur. project_id: type: string description: Owning project - example: Qui est nemo ullam. + example: Labore eos et repudiandae odit omnis cupiditate. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -5293,17 +5320,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8077434258112236542 + example: 2647723585259991483 format: int64 example: - account_id: Voluptas quasi esse corporis. + account_id: Quaerat iure ipsam. has_credentials: false - id: Minus pariatur praesentium amet. - label: Sint velit earum laboriosam dignissimos reiciendis et. - login_customer_id: Deserunt reiciendis dolorem totam voluptatem. - project_id: Libero pariatur ut. + id: Et vel molestiae quo. + label: Et sed debitis. + login_customer_id: Aut minima adipisci aut quia quisquam veniam. + project_id: Placeat reprehenderit natus pariatur. status: active - version: 6561992588765026566 + version: 7897706105846459095 required: - id - project_id @@ -5317,31 +5344,31 @@ components: account_id: type: string description: Provider account identifier - example: Laudantium doloremque aut eligendi perferendis aut. + example: Molestiae cupiditate quis modi blanditiis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Amet qui provident. + example: Facilis sit autem. label: type: string description: Optional friendly name - example: Ut ea. + example: Accusantium expedita alias placeat incidunt sit perspiciatis. login_customer_id: type: string description: Manager account used for API access - example: Ea consectetur delectus. + example: Magni sit harum. project_id: type: string description: Owning project - example: Repudiandae molestias est consectetur porro quo pariatur. + example: Nihil qui doloremque nam magnam aliquid impedit. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5350,17 +5377,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 10157424754048271 + example: 7345260181453091454 format: int64 example: - account_id: Aut earum rerum ducimus dicta velit. + account_id: Repellendus adipisci sit et enim quasi ut. has_credentials: true - id: Id officiis architecto. - label: Sit iste ea. - login_customer_id: Molestiae dolorum non perspiciatis a. - project_id: Et libero ea aut omnis. - status: error - version: 8687544223346888800 + id: Et distinctio dignissimos fugiat voluptatibus natus. + label: Dolorem omnis aspernatur veritatis adipisci. + login_customer_id: Amet sed ipsam enim esse. + project_id: Commodi et nihil et. + status: active + version: 2256303273039083512 required: - id - project_id @@ -5395,25 +5422,25 @@ components: client_id: type: string description: OAuth client id - example: Sint autem repudiandae asperiores et. + example: In praesentium cumque. client_secret: type: string description: OAuth client secret - example: Quia consectetur non nulla dolore quibusdam ducimus. + example: Pariatur odio molestias voluptatum. developer_token: type: string description: Google Ads developer token - example: Soluta quod. + example: Nulla perferendis possimus deserunt iure et. refresh_token: type: string description: OAuth refresh token - example: Iste explicabo minima commodi qui quia est. + example: Voluptas necessitatibus cumque non porro qui molestias. description: Google Ads OAuth credential set. Write-only; never returned. example: - client_id: Omnis inventore voluptatum ab. - client_secret: Laboriosam quos omnis deserunt libero consequatur quisquam. - developer_token: Sapiente ex est modi cupiditate possimus ducimus. - refresh_token: At fugiat. + client_id: Qui omnis nesciunt qui consequuntur. + client_secret: Fuga atque. + developer_token: Sequi culpa. + refresh_token: Ea quidem ducimus tempora ea molestias. required: - refresh_token - client_id @@ -5425,15 +5452,15 @@ components: account_id: type: string description: Provider account identifier - example: Sint suscipit. + example: Beatae totam. brand_kit: type: string description: Per-project brand kit selector - example: Quo veritatis nisi velit distinctio animi. + example: Molestiae veniam exercitationem blanditiis ratione non. etag: type: string description: ETag header value (mirrors version) - example: Non neque optio. + example: Voluptate nam iste architecto. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5441,31 +5468,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Dolore voluptatem qui eveniet amet. + example: Eos ex laborum et doloremque. label: type: string description: Optional friendly name - example: Voluptate et. + example: Quo est. portal_id: type: string description: HubSpot portal/account ID - example: Architecto molestiae cum. + example: Velit odio temporibus aut numquam est. project_id: type: string description: Owning project - example: Qui pariatur odio reprehenderit nam. + example: Non laudantium quis ab non sunt. sender_email: type: string description: Default sender address - example: Perspiciatis consequatur beatae sunt officiis sequi qui. + example: Ut vitae dolor soluta beatae. sender_name: type: string description: Default sender name - example: Sapiente perspiciatis dolores dignissimos soluta non vel. + example: Enim velit voluptates officiis tempora possimus rerum. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5474,21 +5501,21 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6078188127403523196 + example: 7472986980795124202 format: int64 example: - account_id: Dolor molestiae quia voluptatem deserunt libero. - brand_kit: Molestiae soluta vel ad et in voluptatem. - etag: Aut impedit a veritatis. + account_id: Quos provident. + brand_kit: Dolorem ea et quidem quibusdam officiis. + etag: Officiis modi quae consequatur voluptatem et. has_credentials: false - id: Provident rerum et voluptas tenetur esse. - label: Quaerat ipsa voluptatem. - portal_id: Consequuntur sed ea sunt debitis. - project_id: Assumenda sed minima nihil. - sender_email: Voluptas qui voluptas veniam sint voluptas. - sender_name: Non illo ab in voluptatem minus est. - status: active - version: 1552956989772584247 + id: Sed dolorum cupiditate quia qui dicta. + label: Totam et voluptates atque consequatur consequuntur voluptates. + portal_id: Culpa veritatis ut adipisci minus. + project_id: Commodi facere vel. + sender_email: Vero eum ea perspiciatis rerum. + sender_name: Incidunt deleniti. + status: inactive + version: 413153877019026133 required: - id - project_id @@ -5503,11 +5530,11 @@ components: account_id: type: string description: Provider account identifier - example: Eius quo. + example: Ut illum laboriosam debitis aut. brand_kit: type: string description: Per-project brand kit selector - example: Dolorem impedit sint consequatur. + example: Quisquam sit ut aliquid consectetur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5515,31 +5542,31 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Iusto in commodi velit in odio. + example: Et eveniet sunt. label: type: string description: Optional friendly name - example: Non architecto. + example: Similique inventore et voluptatum. portal_id: type: string description: HubSpot portal/account ID - example: Et corrupti magnam deleniti nam laboriosam esse. + example: Nobis ipsam blanditiis commodi accusamus maxime. project_id: type: string description: Owning project - example: Aliquam voluptatem sunt et eveniet. + example: Veniam ut et sit. sender_email: type: string description: Default sender address - example: Eaque ut voluptatibus qui qui officia. + example: Quia sed eum ad sunt impedit sint. sender_name: type: string description: Default sender name - example: Alias quis voluptates nihil odio facere magnam. + example: Iusto aspernatur fugit et facere eligendi. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -5548,20 +5575,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7096858184495555885 + example: 3458229418861381091 format: int64 example: - account_id: Officia suscipit qui molestias aliquid dolorum consequatur. - brand_kit: Hic ea et. + account_id: Fuga et id voluptatem et et et. + brand_kit: Velit architecto error consequatur nam. has_credentials: false - id: Nihil labore accusamus illum in delectus magnam. - label: Porro voluptatum nemo adipisci. - portal_id: Enim aut. - project_id: Velit sed laboriosam placeat nesciunt. - sender_email: Dolores sed. - sender_name: Optio enim repellendus commodi quia quod sit. - status: inactive - version: 3587423604677944667 + id: Harum nisi illo quia. + label: Aliquam vel cum alias iusto. + portal_id: Doloribus ex dolor quia et dolores. + project_id: Aut in voluptate quam delectus optio saepe. + sender_email: Distinctio ea. + sender_name: Ab iste earum consequatur laboriosam maxime nemo. + status: error + version: 6330333226367628566 required: - id - project_id @@ -5575,43 +5602,43 @@ components: account_id: type: string description: Provider account identifier - example: Eligendi corporis tenetur delectus excepturi et. + example: Reiciendis voluptas. brand_kit: type: string description: Per-project brand kit selector - example: Ut est est mollitia. + example: Eligendi facere. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Aperiam impedit omnis explicabo. + example: Ipsum est a. label: type: string description: Optional friendly name - example: Enim temporibus facere. + example: Et corporis error eligendi voluptatem repellat consectetur. portal_id: type: string description: HubSpot portal/account ID - example: Id libero sunt. + example: Nostrum quod rerum dolorum. project_id: type: string description: Owning project - example: Et et commodi autem. + example: Quia voluptatem veritatis molestiae similique. sender_email: type: string description: Default sender address - example: Suscipit consequatur iure dolor sit quis ut. + example: Doloribus et ex enim rem modi omnis. sender_name: type: string description: Default sender name - example: Natus enim non. + example: Atque quo sit iure quos. status: type: string description: Connection status - example: inactive + example: active enum: - active - inactive @@ -5620,20 +5647,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2722095064844656519 + example: 1162295855624220314 format: int64 example: - account_id: Doloribus similique et. - brand_kit: Voluptas earum provident qui. + account_id: Vitae sapiente dolor unde harum dolorem iusto. + brand_kit: Quis inventore iste nemo rerum corporis repellat. has_credentials: true - id: Corporis omnis. - label: Delectus nisi minima quas voluptatem consequuntur. - portal_id: Aliquam dolorem voluptas autem enim aut ut. - project_id: Ea in sunt odit aspernatur. - sender_email: Eum ut rem illum. - sender_name: Autem ratione est exercitationem sapiente a animi. - status: error - version: 6167429858997341484 + id: Quo eveniet fuga quaerat. + label: Deserunt eligendi rerum architecto necessitatibus alias. + portal_id: Qui repellendus sit incidunt in et. + project_id: Et modi eveniet magni repellendus et. + sender_email: Et nesciunt et culpa similique quasi ratione. + sender_name: Laboriosam dolorem ut dolorem odio aut reprehenderit. + status: active + version: 7214923908250326040 required: - id - project_id @@ -5647,43 +5674,43 @@ components: account_id: type: string description: Provider account identifier - example: Quam aliquid reiciendis maiores similique ab. + example: Et eveniet eaque non architecto aut. brand_kit: type: string description: Per-project brand kit selector - example: Iure consectetur libero. + example: Nihil odio facere magnam quasi dolorem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Facere dolorum rem laborum dolor provident. + example: Excepturi iusto in. label: type: string description: Optional friendly name - example: Vitae voluptas fuga aut minima inventore tenetur. + example: Rem aliquam voluptatem. portal_id: type: string description: HubSpot portal/account ID - example: Accusamus optio consequatur excepturi rerum. + example: Enim distinctio et corrupti magnam deleniti nam. project_id: type: string description: Owning project - example: Odio aut suscipit. + example: Velit in. sender_email: type: string description: Default sender address - example: In officiis dolores delectus architecto. + example: Esse temporibus eaque ut voluptatibus. sender_name: type: string description: Default sender name - example: Velit eligendi omnis est vel est et. + example: Qui officia tempora alias quis. status: type: string description: Connection status - example: deleted + example: error enum: - active - inactive @@ -5692,20 +5719,20 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7137337173165660443 + example: 4048071747606254476 format: int64 example: - account_id: Ratione architecto corporis totam et. - brand_kit: Tempora reprehenderit eveniet. - has_credentials: true - id: Accusamus aut deleniti libero veritatis cum. - label: Quidem perferendis. - portal_id: Tempora magnam ea repellat qui. - project_id: Deleniti dolorem voluptas harum soluta repudiandae quisquam. - sender_email: Eveniet dolor necessitatibus est mollitia. - sender_name: Officiis dolorem necessitatibus blanditiis rerum. - status: active - version: 6334382601164890326 + account_id: Voluptatum nemo adipisci. + brand_kit: Optio enim repellendus commodi quia quod sit. + has_credentials: false + id: Sint consequatur quisquam nihil. + label: Laboriosam placeat nesciunt tempore. + portal_id: Molestias aliquid dolorum consequatur est qui qui. + project_id: Accusamus illum in delectus magnam corporis velit. + sender_email: Enim aut. + sender_name: Dolores sed. + status: deleted + version: 1989293428795722898 required: - id - project_id @@ -5719,34 +5746,34 @@ components: account_id: type: string description: HubSpot list/audience ID - example: Totam et voluptates atque consequatur consequuntur voluptates. + example: Unde perspiciatis. brand_kit: type: string description: Per-project brand kit selector - example: Adipisci minus et vero. + example: Assumenda quam possimus aut ipsa. label: type: string description: Optional friendly name - example: Commodi facere vel. + example: Sed qui dolor illo facere ut voluptatem. portal_id: type: string description: HubSpot portal/account ID - example: Quos provident. + example: Rerum maiores in alias est laboriosam saepe. sender_email: type: string description: Default sender address - example: Et fugiat reprehenderit officiis modi quae consequatur. + example: Perferendis placeat earum occaecati et. sender_name: type: string description: Default sender name - example: Et culpa culpa veritatis. + example: Eaque magni omnis dolorem. example: - account_id: Ea et quidem quibusdam officiis dolor. - brand_kit: Aut mollitia pariatur perferendis placeat dolores. - label: Ea perspiciatis rerum occaecati incidunt deleniti sunt. - portal_id: Nisi sunt. - sender_email: Sint dolor eaque culpa. - sender_name: Eius omnis id itaque. + account_id: Et natus possimus cupiditate. + brand_kit: Quod amet itaque aut. + label: Quae et perspiciatis numquam. + portal_id: Molestiae quia neque atque delectus. + sender_email: Repudiandae eum. + sender_name: Ut itaque voluptatem unde adipisci aut. required: - account_id HubspotCredentials: @@ -5755,10 +5782,10 @@ components: private_app_token: type: string description: HubSpot private app token - example: Molestiae veniam exercitationem blanditiis ratione non. + example: Aut rem molestiae assumenda ea. description: HubSpot private app token. Write-only; never returned. example: - private_app_token: Sed dolorum cupiditate quia qui dicta. + private_app_token: Nam repellat. required: - private_app_token InternalServerError: @@ -5784,16 +5811,17 @@ components: job_id: type: string description: Poll GET /projects/{projectId}/jobs/{jobId} - example: Consequatur ut. + example: Consequuntur esse culpa. platforms: type: array items: type: string - example: Commodi qui mollitia et eum veniam. + example: Ut ullam aliquam dolore iure consequatur. description: Platforms this job will create on example: - - Eaque voluptatem omnis architecto cupiditate. - - Sint culpa sed minima. + - Iste nemo. + - Sunt deleniti. + - Natus quia labore non ut dolores et. status: type: string description: Initial status (always 'queued' on create) @@ -5801,11 +5829,11 @@ components: enum: - queued example: - job_id: Quos enim. + job_id: Voluptatem ipsa. platforms: - - Molestiae ad voluptatum ducimus accusantium et. - - Quaerat et eius culpa magni illum consequatur. - - Soluta dolore vitae. + - Ipsam tempora est. + - Sequi ea ut vero consequatur possimus. + - Assumenda sit delectus veniam. status: queued required: - job_id @@ -5817,33 +5845,37 @@ components: error: type: string description: Terminal error, if any - example: Sequi aut veniam ratione. + example: Temporibus illum impedit ullam eaque. job_id: type: string description: Job UUID - example: Quia magnam culpa ipsam totam nulla. + example: Sunt quis odio enim nam id voluptatem. result: type: array items: $ref: '#/components/schemas/PlatformResult' description: Per-platform results, written once when the job reaches a terminal state example: - - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. - error: Magni autem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. ok: false - platform: Ut totam ut. - - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. - error: Magni autem. + platform: Ullam enim voluptatem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. ok: false - platform: Ut totam ut. - - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. - error: Magni autem. + platform: Ullam enim voluptatem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. ok: false - platform: Ut totam ut. + platform: Ullam enim voluptatem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. + ok: false + platform: Ullam enim voluptatem. status: type: string description: Job status - example: running + example: queued enum: - queued - running @@ -5851,17 +5883,21 @@ components: - partial - failed example: - error: Mollitia quidem quo et enim. - job_id: Perferendis omnis ad voluptas esse. + error: Itaque optio consequatur. + job_id: Harum sint neque quia. result: - - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. - error: Magni autem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. + ok: false + platform: Ullam enim voluptatem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. ok: false - platform: Ut totam ut. - - campaign_id: Nemo perspiciatis et qui aliquam doloremque itaque. - error: Magni autem. + platform: Ullam enim voluptatem. + - campaign_id: Aliquam facilis iste sed voluptatum laboriosam. + error: Vero voluptatum a quos a sed exercitationem. ok: false - platform: Ut totam ut. + platform: Ullam enim voluptatem. status: failed required: - job_id @@ -5872,11 +5908,11 @@ components: account_id: type: string description: Provider account identifier - example: Nobis qui sunt laboriosam ipsa. + example: Laboriosam quos omnis deserunt libero consequatur quisquam. etag: type: string description: ETag header value (mirrors version) - example: Aut inventore consequatur. + example: Modi cupiditate. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -5884,23 +5920,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Rerum rem. + example: Soluta quod. label: type: string description: Optional friendly name - example: In vel. + example: Omnis inventore voluptatum ab. org_id: type: string description: LinkedIn organization URN id - example: Autem eaque eaque dicta ut magni. + example: Ducimus qui modi consequatur. project_id: type: string description: Owning project - example: Vitae qui explicabo tempora accusantium aut. + example: At fugiat. status: type: string description: Connection status - example: deleted + example: inactive enum: - active - inactive @@ -5909,18 +5945,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3265309804259735983 + example: 7336458220235154606 format: int64 example: - account_id: Alias quod minima blanditiis. - etag: Iure dolores dolores dolorem sit nihil. + account_id: Aliquam et asperiores quae voluptatem velit. + etag: Enim voluptas numquam. has_credentials: true - id: Error deleniti vitae molestiae qui nobis. - label: Quia enim non asperiores velit. - org_id: Sit est atque qui quaerat qui vitae. - project_id: Aut temporibus dolorem cumque quis. - status: inactive - version: 4548596825330631938 + id: Et et deleniti sint reiciendis. + label: Hic quam impedit placeat consequatur. + org_id: Et iusto eius dolor magnam necessitatibus. + project_id: Eos et quidem est. + status: error + version: 5408757854107547795 required: - id - project_id @@ -5935,31 +5971,31 @@ components: account_id: type: string description: Provider account identifier - example: Et laboriosam veritatis saepe numquam. + example: Adipisci omnis veritatis omnis praesentium omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quas delectus a maxime consequatur iste eum. + example: Est laborum. label: type: string description: Optional friendly name - example: Et at iusto optio. + example: Quod aut sunt ex et autem delectus. org_id: type: string description: LinkedIn organization URN id - example: Qui quisquam quae. + example: Aut natus aliquam. project_id: type: string description: Owning project - example: Vel impedit et unde et rerum. + example: Libero necessitatibus. status: type: string description: Connection status - example: error + example: deleted enum: - active - inactive @@ -5968,17 +6004,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1129434020019069718 + example: 6869928491943758950 format: int64 example: - account_id: Ea nostrum corrupti ipsum minima consequuntur. + account_id: Tempore qui est. has_credentials: true - id: Magni temporibus et molestias. - label: Iste ullam sunt rem non doloribus omnis. - org_id: Hic et illo aut natus et accusamus. - project_id: Molestias et officiis asperiores quibusdam accusamus. + id: Quas aliquid. + label: Praesentium beatae quis ut eius. + org_id: Excepturi provident saepe aliquam architecto. + project_id: Saepe non tempore. status: active - version: 8161899588231294433 + version: 8098284705619161180 required: - id - project_id @@ -5992,31 +6028,31 @@ components: account_id: type: string description: Provider account identifier - example: Eos quidem debitis iusto molestias itaque consequatur. + example: Minus pariatur praesentium amet. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Qui et dolorem. + example: Vero provident voluptas consequatur iusto. label: type: string description: Optional friendly name - example: Expedita error cumque. + example: Ut magnam aut illum commodi placeat sed. org_id: type: string description: LinkedIn organization URN id - example: Fugit et soluta. + example: Qui sint velit earum laboriosam dignissimos reiciendis. project_id: type: string description: Owning project - example: Laboriosam repellat harum expedita aut quidem beatae. + example: Pariatur quas. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6025,17 +6061,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7037294126068689767 + example: 1671194498896693162 format: int64 example: - account_id: Iure ut. - has_credentials: true - id: Et qui officiis repudiandae qui iste accusantium. - label: Consequatur provident ea sint. - org_id: Eum quibusdam et minus id deleniti placeat. - project_id: Voluptatem iste nemo numquam unde perspiciatis. - status: active - version: 3173101195127892589 + account_id: Provident autem repudiandae molestias est consectetur porro. + has_credentials: false + id: Quisquam voluptas quasi esse corporis molestiae. + label: Dolorem totam voluptatem recusandae amet. + org_id: Ea ut. + project_id: Suscipit fugiat deserunt. + status: inactive + version: 7812167479041835646 required: - id - project_id @@ -6049,31 +6085,31 @@ components: account_id: type: string description: Provider account identifier - example: Autem quia velit aliquid quae. + example: Et libero ea aut omnis. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Quia et non id sunt adipisci consectetur. + example: Doloremque aut eligendi perferendis aut et. label: type: string description: Optional friendly name - example: Soluta nostrum cumque explicabo pariatur voluptatum molestias. + example: Id officiis architecto. org_id: type: string description: LinkedIn organization URN id - example: Consequatur vero possimus. + example: Corrupti aut earum rerum ducimus dicta. project_id: type: string description: Owning project - example: Modi quo et inventore eum autem quia. + example: Eum molestiae ea consectetur delectus. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -6082,17 +6118,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 700201239225519995 + example: 6409712151005637179 format: int64 example: - account_id: Sequi dolor eos fugiat rem. + account_id: Et rerum repudiandae et at iusto. has_credentials: false - id: Maiores voluptas. - label: Qui facilis possimus. - org_id: Pariatur et et deserunt facere ea incidunt. - project_id: Corporis quam quos dolor id debitis eos. + id: Quo omnis et et molestiae dolorum. + label: Consequatur iste eum amet vel impedit et. + org_id: Veritatis saepe numquam rem sapiente. + project_id: Perspiciatis a aut quas delectus a. status: inactive - version: 1986183550074348775 + version: 8814877888903559420 required: - id - project_id @@ -6110,14 +6146,14 @@ components: label: type: string description: Optional friendly name - example: Officia dolores et reprehenderit. + example: Est ipsam sint autem repudiandae asperiores et. org_id: type: string description: LinkedIn organization URN id example: "208777" example: account_id: "538170226" - label: Ex dolor. + label: Quia consectetur non nulla dolore quibusdam ducimus. org_id: "208777" required: - account_id @@ -6128,10 +6164,10 @@ components: access_token: type: string description: OAuth access token - example: Voluptate est reprehenderit consectetur accusamus eaque inventore. + example: Accusantium debitis adipisci qui iste explicabo. description: LinkedIn Ads credential. Write-only; never returned. example: - access_token: Aut explicabo. + access_token: Commodi qui. required: - access_token MetaAdsConnection: @@ -6140,15 +6176,15 @@ components: account_id: type: string description: Provider account identifier - example: Libero officia et quia. + example: Ut magni beatae error deleniti. app_id: type: string description: Meta app ID - example: Necessitatibus eos rerum. + example: Enim non asperiores velit aut. etag: type: string description: ETag header value (mirrors version) - example: Qui maxime eos deserunt. + example: Culpa aut temporibus dolorem. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6156,19 +6192,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Est consequatur rerum neque velit nulla modi. + example: Tenetur nobis qui. label: type: string description: Optional friendly name - example: Nihil at. + example: Inventore consequatur velit autem eaque eaque. page_id: type: string description: Facebook page ID - example: Expedita sed velit distinctio. + example: Quis accusantium. project_id: type: string description: Owning project - example: Optio quia similique vero est impedit quo. + example: Laboriosam ipsa voluptas et vel dolorum. status: type: string description: Connection status @@ -6181,19 +6217,19 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4061552416134608654 + example: 7112569565459851125 format: int64 example: - account_id: Vero aut repellendus reiciendis. - app_id: Ea ad ducimus consequatur aut. - etag: Atque et. - has_credentials: true - id: Veniam amet et quisquam voluptatem fuga. - label: Optio rerum vel molestiae id. - page_id: Quia iure aut tenetur. - project_id: Qui quas aut provident suscipit. - status: inactive - version: 8332327938373479794 + account_id: Sit nihil enim sit. + app_id: Ipsam eligendi est dolore. + etag: Qui vitae iste. + has_credentials: false + id: Quod minima. + label: Dolores dolores. + page_id: Non ipsam optio in ratione accusamus quasi. + project_id: Ipsum et et laudantium. + status: deleted + version: 6379674624138849400 required: - id - project_id @@ -6208,11 +6244,11 @@ components: account_id: type: string description: Provider account identifier - example: Non impedit incidunt. + example: Ullam sunt rem non doloribus. app_id: type: string description: Meta app ID - example: Alias laudantium sit et. + example: Consequuntur quia et saepe aperiam. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6220,23 +6256,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Molestiae modi. + example: Esse qui quisquam. label: type: string description: Optional friendly name - example: Temporibus ullam sint aliquam ea. + example: Officiis asperiores quibusdam accusamus possimus. page_id: type: string description: Facebook page ID - example: Rerum corrupti. + example: Corrupti ipsum. project_id: type: string description: Owning project - example: Libero consectetur non. + example: Est magni temporibus et molestias voluptatem molestias. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -6245,18 +6281,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 1431900350448492398 + example: 3056771457873327009 format: int64 example: - account_id: Amet et vel ipsa ad doloremque qui. - app_id: Eum voluptatem debitis aliquid accusamus eligendi itaque. + account_id: Aut quidem beatae officiis expedita error. + app_id: Corporis nulla magni. has_credentials: false - id: Sed eius reiciendis rerum voluptatem suscipit rerum. - label: Voluptas voluptatem eum consequuntur. - page_id: Est quidem in. - project_id: Et ex aut cupiditate qui placeat omnis. - status: inactive - version: 2895836647375905460 + id: Et illo aut natus. + label: Dolorem labore laboriosam repellat harum. + page_id: Debitis iusto molestias itaque. + project_id: Accusamus ipsa qui. + status: error + version: 5243837876383249590 required: - id - project_id @@ -6270,11 +6306,11 @@ components: account_id: type: string description: Provider account identifier - example: Nam rerum omnis praesentium omnis amet quia. + example: Consequatur provident ea sint. app_id: type: string description: Meta app ID - example: At explicabo reiciendis. + example: Minus id deleniti. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6282,23 +6318,23 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Est temporibus explicabo doloremque possimus. + example: Fugit et soluta. label: type: string description: Optional friendly name - example: Autem repellat et. + example: Voluptatem iste nemo numquam unde perspiciatis. page_id: type: string description: Facebook page ID - example: Officia rerum eligendi ex. + example: Facere ut repudiandae eum quibusdam. project_id: type: string description: Owning project - example: Cupiditate ab omnis nesciunt consequatur commodi. + example: Et qui officiis repudiandae qui iste accusantium. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -6307,18 +6343,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 5777051591540907893 + example: 1953847576666852892 format: int64 example: - account_id: Voluptates voluptatem similique aut. - app_id: Natus expedita est sed. - has_credentials: true - id: At ratione unde dicta. - label: Voluptas perferendis et perferendis. - page_id: Voluptatem sit excepturi eaque. - project_id: Doloribus aspernatur quod ipsum pariatur explicabo nesciunt. + account_id: Eum autem quia quis soluta nostrum cumque. + app_id: Saepe amet voluptatem veniam. + has_credentials: false + id: Dolorem quia. + label: Adipisci consectetur ut modi quo et. + page_id: Rem autem quia velit aliquid. + project_id: Non id. status: error - version: 4610591738843411818 + version: 7788869661064623160 required: - id - project_id @@ -6332,35 +6368,35 @@ components: account_id: type: string description: Provider account identifier - example: Repudiandae hic nostrum qui sed est architecto. + example: Eos fugiat rem minima ab ea animi. app_id: type: string description: Meta app ID - example: Eveniet magnam dolor sint. + example: Voluptatem libero consectetur. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Ducimus qui quas neque eum voluptatem. + example: Vero possimus rem maiores voluptas voluptate. label: type: string description: Optional friendly name - example: Consectetur consequatur autem eveniet magnam dolor. + example: Eos qui facilis possimus consequatur sequi. page_id: type: string description: Facebook page ID - example: Id doloremque ad dolores tempore ut est. + example: Facere ea incidunt et molestiae. project_id: type: string description: Owning project - example: Velit corporis nemo. + example: Quam quos dolor id debitis. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -6369,18 +6405,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3642485435905489461 + example: 6530264541662515284 format: int64 example: - account_id: Doloremque pariatur qui magni facere. - app_id: Ut voluptas est est accusamus. - has_credentials: false - id: Ipsa nam ipsa magnam praesentium eos cum. - label: Illum natus doloremque facere quis et beatae. - page_id: Sit animi dolor ex saepe ipsa. - project_id: Sed est recusandae enim quidem. - status: active - version: 1460268576636670658 + account_id: Minus alias laudantium. + app_id: Rerum numquam et ex aut cupiditate qui. + has_credentials: true + id: Ducimus temporibus ullam sint aliquam ea voluptatibus. + label: Temporibus accusamus rerum. + page_id: Eius reiciendis rerum voluptatem. + project_id: Impedit incidunt sint. + status: inactive + version: 93554437328757363 required: - id - project_id @@ -6398,20 +6434,20 @@ components: app_id: type: string description: Meta app ID - example: Adipisci ut. + example: Explicabo totam officia dolores. label: type: string description: Optional friendly name - example: Excepturi natus est est saepe doloribus unde. + example: Est et corporis maxime voluptate. page_id: type: string description: Facebook page ID - example: Aut perspiciatis. + example: Reprehenderit consectetur accusamus eaque inventore et. example: account_id: act_193556282970417 - app_id: Dolores earum. - label: Sit totam ut et. - page_id: Quibusdam ea nam aut. + app_id: Accusantium aut reiciendis in. + label: Reprehenderit aut ex dolor sint. + page_id: Rem nihil vitae qui explicabo. required: - account_id MetaAdsCredentials: @@ -6420,15 +6456,15 @@ components: access_token: type: string description: Meta access token - example: Optio non. + example: Mollitia earum aut qui sit rerum. app_secret: type: string description: Meta app secret - example: Optio in ratione accusamus quasi. + example: Tempora voluptatem rem fugit accusantium est necessitatibus. description: Meta Ads credential. Write-only; never returned. example: - access_token: Ipsam eligendi est dolore. - app_secret: Consequatur aut vero. + access_token: Officia dolorem. + app_secret: Asperiores autem aut aut soluta quae. required: - access_token - app_secret @@ -6438,15 +6474,15 @@ components: account_id: type: string description: Provider account identifier - example: Ut itaque voluptatem unde adipisci aut. + example: In voluptate debitis earum voluptates repellat. customer_id: type: string description: Microsoft Advertising customer ID - example: Non laudantium quis ab non sunt. + example: Dolore expedita. etag: type: string description: ETag header value (mirrors version) - example: Aut praesentium eos ex laborum et doloremque. + example: Dolorem tempore qui. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6454,15 +6490,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Et natus possimus cupiditate. + example: Necessitatibus quia facere vitae aperiam velit corrupti. label: type: string description: Optional friendly name - example: Repudiandae eum. + example: Deserunt minima quis impedit. project_id: type: string description: Owning project - example: Molestiae quia neque atque delectus. + example: Pariatur totam. status: type: string description: Connection status @@ -6475,18 +6511,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 9192676630235860462 + example: 3340961523623056274 format: int64 example: - account_id: Voluptatem velit odio temporibus aut. - customer_id: Enim velit voluptates officiis tempora possimus rerum. - etag: Vitae dolor soluta beatae. + account_id: Molestias reprehenderit. + customer_id: Ea pariatur. + etag: Dolorem similique sapiente. has_credentials: true - id: Quo est. - label: Quas quia quam voluptate nam iste. - project_id: Beatae totam. - status: error - version: 1007882038292754957 + id: Sit omnis. + label: Accusantium est. + project_id: Porro saepe eius earum quo porro. + status: active + version: 5013574793121618962 required: - id - project_id @@ -6501,11 +6537,11 @@ components: account_id: type: string description: Provider account identifier - example: Quisquam sit ut aliquid consectetur. + example: Non rerum. customer_id: type: string description: Microsoft Advertising customer ID - example: Quia assumenda aut. + example: Tenetur magnam quaerat laborum voluptatibus accusamus itaque. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6513,19 +6549,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Nobis ipsam blanditiis commodi accusamus maxime. + example: Culpa est ex. label: type: string description: Optional friendly name - example: Iusto aspernatur fugit et facere eligendi. + example: Eius eos sit quam fugiat. project_id: type: string description: Owning project - example: Quia sed eum ad sunt impedit sint. + example: Aliquid porro deserunt nostrum sed sint voluptas. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -6534,17 +6570,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8275500991568401541 + example: 396103720096053742 format: int64 example: - account_id: Id voluptatem et et et eveniet. - customer_id: Ex dolor quia et dolores. + account_id: Cumque adipisci. + customer_id: Error incidunt consequuntur voluptas ullam optio. has_credentials: true - id: Voluptate quam delectus optio. - label: Molestiae fuga. - project_id: Ducimus aliquam vel cum alias. + id: Aut et rem eos quia. + label: Laboriosam placeat. + project_id: Modi accusantium et repudiandae facere dolorum. status: error - version: 2847235492838917454 + version: 316921975293270952 required: - id - project_id @@ -6558,31 +6594,31 @@ components: account_id: type: string description: Provider account identifier - example: Ipsum est a. + example: Reprehenderit nemo voluptatibus. customer_id: type: string description: Microsoft Advertising customer ID - example: Molestiae similique optio et corporis. + example: Tempore aut voluptas ipsa quis animi. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Distinctio ea. + example: Eaque eos veniam quidem maiores adipisci. label: type: string description: Optional friendly name - example: Velit architecto error consequatur nam. + example: Molestias ullam aut odit repellat nihil at. project_id: type: string description: Owning project - example: Ab iste earum consequatur laboriosam maxime nemo. + example: Impedit a. status: type: string description: Connection status - example: active + example: error enum: - active - inactive @@ -6591,17 +6627,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 6583480909021941947 + example: 1334308724833154060 format: int64 example: - account_id: Ex enim rem. - customer_id: Quo sit iure quos aut. - has_credentials: false - id: Eligendi voluptatem repellat consectetur alias reiciendis voluptas. - label: Dolorum enim doloribus. - project_id: Cumque est quis nostrum quod. - status: active - version: 2799898264679301316 + account_id: Ipsum et illum. + customer_id: Enim est sapiente. + has_credentials: true + id: Sunt reprehenderit aliquam perspiciatis libero. + label: Et qui quos corrupti quam unde. + project_id: Ratione pariatur. + status: inactive + version: 4456369783861517132 required: - id - project_id @@ -6615,11 +6651,11 @@ components: account_id: type: string description: Provider account identifier - example: Repellendus et neque deserunt eligendi rerum architecto. + example: Quis ut in voluptatem nesciunt. customer_id: type: string description: Microsoft Advertising customer ID - example: Sapiente dolor unde harum dolorem iusto quia. + example: Unde adipisci rerum eius vitae perferendis. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6627,15 +6663,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Facere debitis quo. + example: Minus aut ut non. label: type: string description: Optional friendly name - example: Modi eveniet. + example: Blanditiis est et saepe. project_id: type: string description: Owning project - example: Fuga quaerat sed. + example: Repellendus voluptatem. status: type: string description: Connection status @@ -6648,17 +6684,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 402075575675880099 + example: 4034090178991751772 format: int64 example: - account_id: Ratione ut laboriosam dolorem ut dolorem odio. - customer_id: Inventore iste nemo rerum corporis repellat nemo. + account_id: Eum nemo architecto est. + customer_id: Consequatur provident veniam omnis quia. has_credentials: true - id: Eos doloremque qui repellendus. - label: Ea et nesciunt et culpa similique. - project_id: Incidunt in. + id: Quidem eum animi. + label: Est error maiores excepturi exercitationem quo porro. + project_id: Explicabo et quo et velit qui doloremque. status: deleted - version: 2480470963761289215 + version: 5942764375177239504 required: - id - project_id @@ -6672,19 +6708,19 @@ components: account_id: type: string description: Microsoft Advertising account ID - example: Rerum maiores in alias est laboriosam saepe. + example: Laudantium eligendi ut et. customer_id: type: string description: Microsoft Advertising customer ID - example: Perferendis placeat earum occaecati et. + example: Maiores nam sequi iste iusto reiciendis ipsa. label: type: string description: Optional friendly name - example: Unde perspiciatis. + example: Est dolor velit et voluptatem mollitia placeat. example: - account_id: Assumenda quam possimus aut ipsa. - customer_id: Quae et perspiciatis numquam. - label: Eaque magni omnis dolorem. + account_id: Temporibus in qui provident corrupti ut similique. + customer_id: Voluptas doloremque nobis consectetur voluptas voluptas. + label: Saepe beatae. required: - account_id MicrosoftAdsCredentials: @@ -6693,25 +6729,25 @@ components: client_id: type: string description: OAuth client id - example: Accusantium est. + example: Beatae facilis dolor quod nihil quia. client_secret: type: string description: OAuth client secret - example: Molestias reprehenderit. + example: Sed voluptas fuga officia nulla. developer_token: type: string description: Microsoft Advertising developer token - example: Dolorem similique sapiente. + example: Non consequuntur qui qui impedit assumenda voluptas. refresh_token: type: string description: OAuth refresh token - example: Pariatur esse. + example: Recusandae consequatur nulla. description: Microsoft Advertising OAuth credential set. Write-only; never returned. example: - client_id: Ea pariatur. - client_secret: Aut rem molestiae assumenda ea. - developer_token: Sed qui dolor illo facere ut voluptatem. - refresh_token: Nam repellat. + client_id: Consequuntur provident nostrum vel ut. + client_secret: Et nemo dicta illum omnis. + developer_token: Nemo cum delectus laudantium. + refresh_token: Dolor et aliquam deleniti. required: - client_id - client_secret @@ -6740,24 +6776,24 @@ components: campaign_id: type: string description: Upstream platform campaign id. Present when ok; also set on the specific failure where the upstream campaign was created but recording it failed, so the orphaned id isn't lost. - example: Laudantium dolor ipsam recusandae maxime. + example: Provident illo non quisquam iure. error: type: string description: Failure reason (present when not ok) - example: Repellendus assumenda voluptatem aut debitis. + example: Est ut aliquid. ok: type: boolean description: Whether the campaign was created (or reused) successfully - example: false + example: true platform: type: string description: Platform this result is for - example: In commodi et asperiores et. + example: Est et magni. example: - campaign_id: Et consequatur et et itaque qui repudiandae. - error: Atque ullam qui rerum numquam quo omnis. - ok: true - platform: Unde velit eos eius accusantium odit rerum. + campaign_id: Exercitationem accusamus pariatur saepe ab qui. + error: Ab laboriosam sunt quis omnis. + ok: false + platform: Repellendus eveniet veritatis impedit aut iste earum. required: - platform - ok @@ -6801,11 +6837,11 @@ components: account_id: type: string description: Provider account identifier - example: Ut quas officiis mollitia ducimus sunt repellendus. + example: Sit soluta quia qui. etag: type: string description: ETag header value (mirrors version) - example: Aliquam est autem vel eos minima. + example: Expedita sed velit distinctio. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6813,15 +6849,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Odit illo ut ut. + example: Optio quia similique vero est impedit quo. label: type: string description: Optional friendly name - example: Debitis atque laboriosam unde facilis. + example: Libero officia et quia. project_id: type: string description: Owning project - example: Nam modi nostrum assumenda alias sed. + example: Nihil at. status: type: string description: Connection status @@ -6834,17 +6870,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 2463177480955435124 + example: 1438953144952054594 format: int64 example: - account_id: Facilis dolor consectetur sed. - etag: Et itaque. + account_id: Optio rerum vel molestiae id. + etag: Reiciendis excepturi. has_credentials: false - id: Quas est deserunt maiores consequatur eum. - label: Occaecati hic ut magnam facilis. - project_id: Voluptatum pariatur non ratione quo ullam. - status: inactive - version: 3072744263422347458 + id: Necessitatibus eos rerum. + label: Qui quas aut provident suscipit. + project_id: Veniam amet et quisquam voluptatem fuga. + status: active + version: 8349066598252210000 required: - id - project_id @@ -6859,27 +6895,27 @@ components: account_id: type: string description: Provider account identifier - example: Est quia ducimus inventore. + example: Repellendus velit soluta est quidem in dolorem. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: true + example: false id: type: string description: Service-generated connection UUID (not used in paths) - example: Nisi consequatur non quam suscipit ea ea. + example: Omnis vitae. label: type: string description: Optional friendly name - example: Autem aut maiores ut sint. + example: Amet et vel ipsa ad doloremque qui. project_id: type: string description: Owning project - example: Quia sed harum. + example: Voluptatem eum consequuntur. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -6888,16 +6924,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4610200042662121887 + example: 7523183128313694126 format: int64 example: - account_id: Impedit perspiciatis ipsam sunt distinctio consequuntur. + account_id: Autem repellat et. has_credentials: true - id: Et mollitia exercitationem cumque. - label: Eaque omnis nihil itaque. - project_id: Similique sequi occaecati. - status: error - version: 2750059486165092858 + id: Accusamus eligendi itaque est est. + label: Nesciunt consequatur commodi. + project_id: Explicabo doloremque possimus soluta cupiditate ab. + status: active + version: 7930594330395664596 required: - id - project_id @@ -6911,7 +6947,7 @@ components: account_id: type: string description: Provider account identifier - example: Deserunt provident voluptates cumque reiciendis error minus. + example: At ratione unde dicta. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6919,15 +6955,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Recusandae amet. + example: Praesentium omnis amet quia quia ea amet. label: type: string description: Optional friendly name - example: Expedita nihil molestiae soluta consequuntur sapiente. + example: At explicabo reiciendis. project_id: type: string description: Owning project - example: Magni ut amet. + example: Officia rerum eligendi ex. status: type: string description: Connection status @@ -6940,16 +6976,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8154718885862958757 + example: 6548567568963242840 format: int64 example: - account_id: Rerum nesciunt veritatis consequatur porro. - has_credentials: false - id: Qui voluptas culpa. - label: Delectus non aut ipsum. - project_id: Iste nihil itaque et. - status: deleted - version: 1595767401527646160 + account_id: Aut esse sint earum magnam. + has_credentials: true + id: Ipsum pariatur explicabo. + label: Et perferendis aut voluptates voluptatem. + project_id: Qui voluptas. + status: inactive + version: 7316195578965090635 required: - id - project_id @@ -6963,7 +6999,7 @@ components: account_id: type: string description: Provider account identifier - example: Nemo aut et qui. + example: Corporis nemo et consectetur consequatur. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -6971,19 +7007,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Ratione provident laborum. + example: Fuga natus. label: type: string description: Optional friendly name - example: Et quisquam dolores. + example: Eum voluptatem eveniet. project_id: type: string description: Owning project - example: Sed voluptatem repudiandae soluta. + example: Est sed et ducimus qui quas. status: type: string description: Connection status - example: deleted + example: active enum: - active - inactive @@ -6992,16 +7028,16 @@ components: version: type: integer description: Optimistic-concurrency version - example: 8907067316289641877 + example: 8379899225513618277 format: int64 example: - account_id: Aliquid porro deserunt nostrum sed sint voluptas. - has_credentials: true - id: Officiis et error nemo iste harum. - label: Culpa est ex. - project_id: Commodi occaecati. - status: error - version: 2407825525433943238 + account_id: Tempore ut. + has_credentials: false + id: Consectetur repudiandae hic nostrum. + label: Doloremque ad. + project_id: Sed est architecto sit est est labore. + status: active + version: 477213815092233328 required: - id - project_id @@ -7019,10 +7055,10 @@ components: label: type: string description: Optional friendly name - example: Ipsam aperiam et totam in. + example: Dolores earum. example: account_id: t2_gv9wtbfa - label: Numquam voluptatem maiores ipsam dicta cum odit. + label: Est consequatur rerum neque velit nulla modi. required: - account_id RedditAdsCredentials: @@ -7031,20 +7067,20 @@ components: client_id: type: string description: OAuth client id - example: Cumque laborum ipsum accusantium voluptatem libero. + example: Consequatur aut vero. client_secret: type: string description: OAuth client secret - example: Eligendi non. + example: Excepturi natus est est saepe doloribus unde. refresh_token: type: string description: OAuth refresh token - example: Necessitatibus non eum ipsum eveniet quam. + example: Aut perspiciatis. description: Reddit Ads OAuth credential. Write-only; never returned. example: - client_id: Aut amet aut voluptatum magnam. - client_secret: Accusamus eos neque velit. - refresh_token: In iure molestiae quisquam. + client_id: Adipisci ut. + client_secret: Sit totam ut et. + refresh_token: Quibusdam ea nam aut. required: - client_id - client_secret @@ -7073,10 +7109,10 @@ components: $ref: '#/components/schemas/GoogleAdsCredentials' example: credentials: - client_id: Natus provident est. - client_secret: Id dolore. - developer_token: Non error. - refresh_token: Accusamus aperiam eos et architecto voluptas rerum. + client_id: Architecto itaque doloribus voluptatem consequatur quis fugiat. + client_secret: Recusandae qui culpa. + developer_token: Accusamus et atque enim. + refresh_token: Dolorum minus voluptatem. required: - credentials SetCredentialHubspotRequestBody: @@ -7086,7 +7122,7 @@ components: $ref: '#/components/schemas/HubspotCredentials' example: credentials: - private_app_token: Molestiae suscipit non iusto. + private_app_token: Vitae vel omnis autem accusamus mollitia. required: - credentials SetCredentialLinkedinAdsRequestBody: @@ -7096,7 +7132,7 @@ components: $ref: '#/components/schemas/LinkedinAdsCredentials' example: credentials: - access_token: Eum est molestiae necessitatibus magni. + access_token: Illo minima eaque earum. required: - credentials SetCredentialMetaAdsRequestBody: @@ -7106,8 +7142,8 @@ components: $ref: '#/components/schemas/MetaAdsCredentials' example: credentials: - access_token: Eius est rerum illo mollitia. - app_secret: Et dolor et consectetur sint error. + access_token: Enim ea. + app_secret: Quidem molestiae deleniti omnis. required: - credentials SetCredentialRedditAdsRequestBody: @@ -7117,9 +7153,9 @@ components: $ref: '#/components/schemas/RedditAdsCredentials' example: credentials: - client_id: Magnam ut similique ea minima magnam. - client_secret: Ut quo iure. - refresh_token: Sit est dolores est et. + client_id: Magni repudiandae. + client_secret: Nihil corrupti repellat eius. + refresh_token: Qui nobis et delectus quam. required: - credentials SetCredentialTwitterAdsRequestBody: @@ -7129,10 +7165,10 @@ components: $ref: '#/components/schemas/TwitterAdsCredentials' example: credentials: - access_token: Possimus et. - access_token_secret: Deserunt consequuntur omnis. - consumer_key: Dignissimos voluptas magni consequatur dignissimos itaque. - consumer_secret: Ut aperiam. + access_token: Deleniti placeat fuga aut saepe. + access_token_secret: Reiciendis pariatur repellat. + consumer_key: Nulla dolorum deserunt ut sit dolor. + consumer_secret: Eos nihil ipsam ex odio totam. required: - credentials TwitterAdsConnection: @@ -7141,15 +7177,15 @@ components: account_id: type: string description: Provider account identifier - example: Temporibus in qui provident corrupti ut similique. + example: Ut quas officiis mollitia ducimus sunt repellendus. etag: type: string description: ETag header value (mirrors version) - example: Consectetur voluptas voluptas voluptatem. + example: Aliquam est autem vel eos minima. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Quia facere vitae aperiam. + example: Quas est deserunt maiores consequatur eum. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7157,15 +7193,15 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Laudantium eligendi ut et. + example: Odit illo ut ut. label: type: string description: Optional friendly name - example: Saepe beatae. + example: Debitis atque laboriosam unde facilis. project_id: type: string description: Owning project - example: Maiores nam sequi iste iusto reiciendis ipsa. + example: Nam modi nostrum assumenda alias sed. status: type: string description: Connection status @@ -7178,18 +7214,18 @@ components: version: type: integer description: Optimistic-concurrency version - example: 4247878238148524808 + example: 2463177480955435124 format: int64 example: - account_id: Aut et ut dolorem tempore. - etag: Commodi sit omnis. - funding_instrument_id: Porro saepe eius earum quo porro. + account_id: Quisquam recusandae nesciunt et. + etag: Ut ea sequi quos qui quo et. + funding_instrument_id: Perferendis et. has_credentials: true - id: Corrupti dicta pariatur totam quas deserunt. - label: In voluptate debitis earum voluptates repellat. - project_id: Quis impedit. - status: error - version: 1517802020058879691 + id: Voluptatum pariatur non ratione quo ullam. + label: Facilis dolor consectetur sed. + project_id: Occaecati hic ut magnam facilis. + status: deleted + version: 8315950268383046552 required: - id - project_id @@ -7204,31 +7240,31 @@ components: account_id: type: string description: Provider account identifier - example: Est aut et rem eos quia et. + example: Illum natus doloremque facere quis et beatae. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Facere dolorum ab laboriosam placeat atque cumque. + example: Magni facere saepe dignissimos eos facere. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Quam fugiat adipisci non rerum et. + example: Dolor sint consectetur ipsa nam ipsa magnam. label: type: string description: Optional friendly name - example: Quaerat laborum voluptatibus accusamus. + example: Sed est recusandae enim quidem. project_id: type: string description: Owning project - example: Et eum tenetur. + example: Eos cum. status: type: string description: Connection status - example: active + example: inactive enum: - active - inactive @@ -7237,17 +7273,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 942544011211036746 + example: 1050609458141446118 format: int64 example: - account_id: Eaque eos veniam quidem maiores adipisci. - funding_instrument_id: Molestias ullam aut odit repellat nihil at. - has_credentials: true - id: Alias nihil. - label: Voluptas ullam optio. - project_id: Temporibus error incidunt. - status: deleted - version: 5983859909197428373 + account_id: Quia sed harum. + funding_instrument_id: Ut sint laborum est quia ducimus inventore. + has_credentials: false + id: Animi dolor ex saepe ipsa ipsam. + label: Nisi consequatur non quam suscipit ea ea. + project_id: Voluptas est est accusamus. + status: inactive + version: 7559450314363992253 required: - id - project_id @@ -7261,31 +7297,31 @@ components: account_id: type: string description: Provider account identifier - example: Aliquam perspiciatis libero est ratione pariatur. + example: Eaque omnis nihil itaque. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Corrupti quam unde nemo ipsum et illum. + example: Sunt distinctio consequuntur enim in. has_credentials: type: boolean description: Whether an encrypted credential is stored - example: false + example: true id: type: string description: Service-generated connection UUID (not used in paths) - example: Reprehenderit nemo voluptatibus. + example: Delectus soluta repudiandae et. label: type: string description: Optional friendly name - example: Ipsa quis animi aliquam sunt. + example: Sequi occaecati. project_id: type: string description: Owning project - example: Perferendis corrupti mollitia tempore aut. + example: Exercitationem cumque libero. status: type: string description: Connection status - example: inactive + example: deleted enum: - active - inactive @@ -7294,17 +7330,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 3919079788188515327 + example: 7986908834898485319 format: int64 example: - account_id: Repellendus voluptatem. - funding_instrument_id: Saepe quo quis ut in voluptatem. - has_credentials: true - id: Rerum est. - label: Minus aut ut non. - project_id: Enim est sapiente. - status: error - version: 6704106453019920248 + account_id: Voluptates cumque. + funding_instrument_id: Enim corrupti. + has_credentials: false + id: Est recusandae amet beatae. + label: Sapiente quam deserunt. + project_id: Ut amet consequatur expedita nihil molestiae soluta. + status: inactive + version: 3218820863122651463 required: - id - project_id @@ -7318,11 +7354,11 @@ components: account_id: type: string description: Provider account identifier - example: Qui doloremque magni est error maiores. + example: Rerum nesciunt veritatis consequatur porro. funding_instrument_id: type: string description: Funding instrument for the ad account - example: Est eum nemo architecto est aut. + example: Ratione provident laborum. has_credentials: type: boolean description: Whether an encrypted credential is stored @@ -7330,19 +7366,19 @@ components: id: type: string description: Service-generated connection UUID (not used in paths) - example: Nesciunt magnam omnis est unde. + example: Qui voluptas culpa. label: type: string description: Optional friendly name - example: Eum animi sed explicabo et quo et. + example: Delectus non aut ipsum. project_id: type: string description: Owning project - example: Rerum eius vitae perferendis quod. + example: Iste nihil itaque et. status: type: string description: Connection status - example: active + example: deleted enum: - active - inactive @@ -7351,17 +7387,17 @@ components: version: type: integer description: Optimistic-concurrency version - example: 7817365326411446744 + example: 1595767401527646160 format: int64 example: - account_id: Ut et sit quae similique inventore. - funding_instrument_id: Illum laboriosam debitis aut vitae est est. + account_id: Aut sed consequatur officiis et error. + funding_instrument_id: Commodi occaecati. has_credentials: false - id: Ab culpa consequatur. - label: Excepturi et eveniet sunt ut. - project_id: Veniam omnis. + id: Sed voluptatem repudiandae soluta. + label: Nemo aut et qui. + project_id: Et quisquam dolores. status: active - version: 328362383505116272 + version: 8795877030736776782 required: - id - project_id @@ -7379,15 +7415,15 @@ components: funding_instrument_id: type: string description: Funding instrument for the ad account - example: Dolor et aliquam deleniti. + example: In iure molestiae quisquam. label: type: string description: Optional friendly name - example: Et nemo dicta illum omnis. + example: Accusamus eos neque velit. example: account_id: 8r7gb - funding_instrument_id: Est dolor velit et voluptatem mollitia placeat. - label: Nemo cum delectus laudantium. + funding_instrument_id: Numquam voluptatem maiores ipsam dicta cum odit. + label: Ipsam aperiam et totam in. required: - account_id TwitterAdsCredentials: @@ -7396,25 +7432,25 @@ components: access_token: type: string description: OAuth 1.0a access token - example: Perferendis et. + example: Iure aut tenetur ipsum ea ad ducimus. access_token_secret: type: string description: OAuth 1.0a access token secret - example: Beatae facilis dolor quod nihil quia. + example: Aut temporibus. consumer_key: type: string description: OAuth 1.0a consumer key - example: A debitis ut ea. + example: Aut tenetur. consumer_secret: type: string description: OAuth 1.0a consumer secret - example: Quos qui quo et. + example: Et et. description: X/Twitter Ads OAuth 1.0a credential set. Write-only; never returned. example: - access_token: Non consequuntur qui qui impedit assumenda voluptas. - access_token_secret: Consequuntur provident nostrum vel ut. - consumer_key: Sed voluptas fuga officia nulla. - consumer_secret: Recusandae consequatur nulla. + access_token: Necessitatibus non eum ipsum eveniet quam. + access_token_secret: Aut amet aut voluptatum magnam. + consumer_key: Laborum ipsum accusantium voluptatem libero. + consumer_secret: Eligendi non. required: - consumer_key - consumer_secret @@ -7427,9 +7463,9 @@ components: $ref: '#/components/schemas/CampaignUpdateInput' example: campaign: - campaign_name: Ad voluptatem. - config: Et expedita itaque quos. - status: Tempore impedit. + campaign_name: Eos doloribus autem corrupti sed voluptatum laborum. + config: Perferendis qui maiores aut reiciendis. + status: Suscipit quas sunt eos nulla. required: - campaign UpdateGoogleAdsRequestBody: @@ -7451,12 +7487,12 @@ components: $ref: '#/components/schemas/HubspotConnectionConfig' example: config: - account_id: Voluptas aperiam. - brand_kit: Itaque fugit rerum cumque. - label: Dolores enim. - portal_id: Assumenda harum eos eveniet ut et laboriosam. - sender_email: Quos expedita voluptas qui eaque. - sender_name: Laudantium nostrum ratione id eius laborum aspernatur. + account_id: Maxime dicta qui aut. + brand_kit: Corrupti voluptas. + label: Dolor porro inventore alias error. + portal_id: Suscipit eos nam ipsa. + sender_email: Velit et impedit facilis quaerat. + sender_name: Dolor ut velit quam omnis et dolor. required: - config UpdateLinkedinAdsRequestBody: @@ -7467,7 +7503,7 @@ components: example: config: account_id: "538170226" - label: Dolorum consequatur in est. + label: Temporibus et provident maiores neque. org_id: "208777" required: - config @@ -7479,9 +7515,9 @@ components: example: config: account_id: act_193556282970417 - app_id: Distinctio sunt aliquid harum quis nam rerum. - label: Excepturi blanditiis officiis quia quisquam. - page_id: Distinctio voluptas eius error autem est. + app_id: Qui rerum est sed sed. + label: Quis quam dolor occaecati earum iusto rerum. + page_id: Cupiditate nobis. required: - config UpdateMicrosoftAdsRequestBody: @@ -7491,9 +7527,9 @@ components: $ref: '#/components/schemas/MicrosoftAdsConnectionConfig' example: config: - account_id: Enim non rem error voluptas deserunt. - customer_id: Officiis aperiam quos. - label: Nihil dolores perspiciatis porro veniam distinctio. + account_id: Ut necessitatibus dolor nemo. + customer_id: Nisi numquam nihil id unde. + label: Voluptatem sed illo numquam praesentium tenetur quas. required: - config UpdateRedditAdsRequestBody: @@ -7504,7 +7540,7 @@ components: example: config: account_id: t2_gv9wtbfa - label: Sit tempore. + label: Laboriosam qui id enim. required: - config UpdateTwitterAdsRequestBody: @@ -7515,8 +7551,8 @@ components: example: config: account_id: 8r7gb - funding_instrument_id: Deserunt in hic dolorum facere ipsa et. - label: Repellat veniam. + funding_instrument_id: Dolorem non laudantium sunt minima repudiandae illo. + label: Labore esse. required: - config securitySchemes: diff --git a/gen/lfx_v2_campaign_service_briefs/service.go b/gen/lfx_v2_campaign_service_briefs/service.go index 128f2591..e00c45fe 100644 --- a/gen/lfx_v2_campaign_service_briefs/service.go +++ b/gen/lfx_v2_campaign_service_briefs/service.go @@ -80,11 +80,12 @@ type Brief struct { ProjectID string // Funnel context ProgramType string - // Event/course slug + // Event/course slug (unique within the project) EventSlug string // Event/course page URL URL *string - // Suggested default platforms + // Suggested default platforms (a planning hint; binding selection is on the + // campaign) Platforms []string // Extracted event/course details EventDetails any diff --git a/internal/container/container_test.go b/internal/container/container_test.go index 17179db2..e18ee759 100644 --- a/internal/container/container_test.go +++ b/internal/container/container_test.go @@ -83,7 +83,7 @@ type stubCampaignRepo struct{} func (stubCampaignRepo) GetCampaign(context.Context, string, string, string) (*model.Campaign, error) { return nil, domain.ErrNotFound } -func (stubCampaignRepo) GetCampaignByPlatform(context.Context, string, model.Provider) (*model.Campaign, error) { +func (stubCampaignRepo) GetCampaignByPlatform(context.Context, string, string, model.Provider) (*model.Campaign, error) { return nil, domain.ErrNotFound } func (stubCampaignRepo) ClaimCampaignDispatch(context.Context, string, string, model.Provider, string) (bool, *model.Campaign, error) { diff --git a/internal/domain/brief_port.go b/internal/domain/brief_port.go index 8d0132f3..ef28500e 100644 --- a/internal/domain/brief_port.go +++ b/internal/domain/brief_port.go @@ -42,8 +42,9 @@ type CampaignReader interface { GetCampaign(ctx context.Context, projectID, briefID, id string) (*model.Campaign, error) // GetCampaignByPlatform returns the campaign for a (brief, platform) pair, or // ErrNotFound. Used to make dispatch idempotent: a brief already dispatched to - // a platform must not create a second upstream (paid) campaign on retry. - GetCampaignByPlatform(ctx context.Context, briefID string, platform model.Provider) (*model.Campaign, error) + // a platform must not create a second upstream (paid) campaign on retry. Scoped + // by projectID for tenant isolation, matching GetCampaign/ClaimCampaignDispatch. + GetCampaignByPlatform(ctx context.Context, projectID, briefID string, platform model.Provider) (*model.Campaign, error) // ClaimCampaignDispatch atomically claims the right to dispatch (brief, // platform) by inserting a placeholder campaign row (status 'pending') via // INSERT ... ON CONFLICT (brief_id, platform) DO NOTHING. Exactly one worker diff --git a/internal/infrastructure/postgres/campaign_repo.go b/internal/infrastructure/postgres/campaign_repo.go index 66ccca27..cf483847 100644 --- a/internal/infrastructure/postgres/campaign_repo.go +++ b/internal/infrastructure/postgres/campaign_repo.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "log/slog" "time" "github.com/jackc/pgx/v5" @@ -47,7 +48,7 @@ func (r *CampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, bri } claimed := tag.RowsAffected() == 1 - row, gerr := r.GetCampaignByPlatform(ctx, briefID, platform) + row, gerr := r.GetCampaignByPlatform(ctx, projectID, briefID, platform) if gerr != nil { // The row must exist now (we or someone else just wrote it); a read failure // here is a genuine error. If WE just inserted the pending row, roll it back @@ -61,6 +62,15 @@ func (r *CampaignRepo) ClaimCampaignDispatch(ctx context.Context, projectID, bri rbCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), claimRollbackTimeout) if derr := r.DeleteDispatchClaim(rbCtx, briefID, platform); derr != nil { cancel() + // Double failure: both the post-insert read AND the rollback delete + // failed, so a 'pending' placeholder is orphaned and will block every + // future claim for this (brief, platform) — no sweeper reaps pending + // campaigns rows. This is a rare double-fault, but its blast radius is + // total for the pair, so log at ERROR with enough context to alert and + // reconcile manually (delete the stuck row) rather than swallowing it. + slog.ErrorContext(ctx, "orphaned pending campaign claim: read-after-claim AND rollback both failed; manual cleanup required", + "project_id", projectID, "brief_id", briefID, "platform", string(platform), "job_id", jobID, + "read_err", gerr.Error(), "rollback_err", derr.Error()) return false, nil, fmt.Errorf("read campaign after claim: %w (and failed to roll back pending claim: %v)", gerr, derr) } cancel() @@ -99,10 +109,14 @@ func (r *CampaignRepo) GetCampaign(ctx context.Context, projectID, briefID, id s } // GetCampaignByPlatform returns the campaign for a (brief, platform) pair. The -// (brief_id, platform) pair is unique, so at most one row matches. -func (r *CampaignRepo) GetCampaignByPlatform(ctx context.Context, briefID string, platform model.Provider) (*model.Campaign, error) { - q := `SELECT ` + campaignCols + ` FROM campaigns WHERE brief_id=$1 AND platform=$2` - c, err := scanCampaign(r.db.QueryRow(ctx, q, briefID, string(platform))) +// (brief_id, platform) pair is unique, so at most one row matches. It is scoped by +// project_id for tenant isolation (defense-in-depth), matching GetCampaign and +// ClaimCampaignDispatch — brief_id is a globally-unique UUID, so this guards a +// future direct caller from reading across tenants with an attacker-influenced +// briefID. +func (r *CampaignRepo) GetCampaignByPlatform(ctx context.Context, projectID, briefID string, platform model.Provider) (*model.Campaign, error) { + q := `SELECT ` + campaignCols + ` FROM campaigns WHERE brief_id=$1 AND platform=$2 AND project_id=$3` + c, err := scanCampaign(r.db.QueryRow(ctx, q, briefID, string(platform), projectID)) if err != nil { if errors.Is(err, pgx.ErrNoRows) { return nil, domain.ErrNotFound diff --git a/internal/service/brief_test.go b/internal/service/brief_test.go index 542a32fe..dd362a7c 100644 --- a/internal/service/brief_test.go +++ b/internal/service/brief_test.go @@ -410,7 +410,7 @@ func (r *campaignEditRepo) GetCampaign(context.Context, string, string, string) cp := *r.cur return &cp, nil } -func (r *campaignEditRepo) GetCampaignByPlatform(context.Context, string, model.Provider) (*model.Campaign, error) { +func (r *campaignEditRepo) GetCampaignByPlatform(context.Context, string, string, model.Provider) (*model.Campaign, error) { return nil, domain.ErrNotFound } func (r *campaignEditRepo) ClaimCampaignDispatch(context.Context, string, string, model.Provider, string) (bool, *model.Campaign, error) { diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index 1977348d..f914b4bb 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -465,7 +465,7 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief // Fast path: if this pair already has a completed campaign (upstream id set), // reuse it — idempotent, and valid even if no dispatcher is registered for the // platform anymore. - if existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ID, p); lerr == nil && existing.PlatformCampaignID != "" { + if existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ProjectID, brief.ID, p); lerr == nil && existing.PlatformCampaignID != "" { res.OK = true res.CampaignID = existing.PlatformCampaignID return res diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 6fc439a5..40e9d564 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -111,7 +111,7 @@ func (r *fakeCampaignRepo) GetCampaign(context.Context, string, string, string) return nil, errors.New("unused") } -func (r *fakeCampaignRepo) GetCampaignByPlatform(_ context.Context, briefID string, platform model.Provider) (*model.Campaign, error) { +func (r *fakeCampaignRepo) GetCampaignByPlatform(_ context.Context, _ string, briefID string, platform model.Provider) (*model.Campaign, error) { r.mu.Lock() defer r.mu.Unlock() if r.byPlatformErr != nil { @@ -408,6 +408,63 @@ func TestOrchestrator_AlreadyClaimedPendingSkips(t *testing.T) { } } +// TestClaimCampaignDispatch_ConcurrentSingleWinner exercises the ACTUAL race the +// single-flight claim guards against: N goroutines calling ClaimCampaignDispatch +// for the SAME (brief, platform) at the same time. Exactly one must win +// (claimed=true) and every loser must cleanly observe claimed=false with no error +// and the SAME pending row — the ON CONFLICT (brief_id, platform) DO NOTHING +// arbitration the design leans on. The prior claim tests only pre-seed a claimed +// row and call Start once, so they never run two claimers concurrently. +func TestClaimCampaignDispatch_ConcurrentSingleWinner(t *testing.T) { + // The fake repo models ON CONFLICT DO NOTHING under a mutex: first caller + // inserts + returns claimed=true; every later caller sees the existing row and + // returns claimed=false — the same arbitration Postgres provides. + repo := &fakeCampaignRepo{} + + const n = 32 + var ( + wg sync.WaitGroup + start = make(chan struct{}) + mu sync.Mutex + wins int + errs int + rowIDs = map[*model.Campaign]struct{}{} + ) + for i := 0; i < n; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + <-start // release all goroutines at once to maximize contention + claimed, row, err := repo.ClaimCampaignDispatch( + context.Background(), "cncf", "b1", model.ProviderGoogleAds, "job1") + mu.Lock() + defer mu.Unlock() + if err != nil { + errs++ + return + } + if claimed { + wins++ + } + if row != nil { + rowIDs[row] = struct{}{} + } + }(i) + } + close(start) + wg.Wait() + + if errs != 0 { + t.Errorf("got %d errors; every claimer (winner or loser) must return nil error", errs) + } + if wins != 1 { + t.Errorf("exactly one goroutine must win the claim, got %d winners", wins) + } + if len(rowIDs) != 1 { + t.Errorf("all claimers must observe the SAME pending row, got %d distinct rows", len(rowIDs)) + } +} + // TestOrchestrator_SkipDoesNotFailAlongsideSuccess verifies that when one // platform succeeds and another is skipped (owned by a concurrent dispatch), the // job is not falsely reported failed/partial: with a real success and no real From f0f5ff55e1adb32a0bc068bb1aafaee26fbe2120 Mon Sep 17 00:00:00 2001 From: Misha Rautela Date: Mon, 20 Jul 2026 14:42:11 -0700 Subject: [PATCH 46/46] fix(orchestrator): surface idempotency-lookup DB errors instead of dispatching blind (PR #11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address review (cursor): dispatchPlatform's idempotency fast path treated ANY non-nil error from GetCampaignByPlatform like "no row" and fell through to claim/dispatch — so a transient/real DB failure that hid an existing campaign could trigger a duplicate upstream create, with no log or signal. Distinguish the outcomes: existing-with-upstream-id reuses; ErrNotFound falls through to the claim; any other error is surfaced as a platform failure (logged ERROR) rather than a blind dispatch. Corrected the concept doc (it had documented the old swallow-the-error behavior as intentional). Test added. Resolves the orchestrator.go idempotency-lookup review comment. Signed-off-by: Misha Rautela --- docs/knowledge/code/internal-service.md | 11 ++++++---- docs/knowledge/log.md | 10 +++++++++ internal/service/orchestrator.go | 20 +++++++++++++++-- internal/service/orchestrator_test.go | 29 +++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/docs/knowledge/code/internal-service.md b/docs/knowledge/code/internal-service.md index 6556fbe9..31cae74c 100644 --- a/docs/knowledge/code/internal-service.md +++ b/docs/knowledge/code/internal-service.md @@ -21,10 +21,13 @@ platform sets (a duplicate would create two paid upstream campaigns), then hands off to the `Orchestrator`, which persists a job and dispatches per platform asynchronously (bounded concurrency). Dispatch is idempotent: a brief already carrying a campaign with an upstream id for a platform is reused rather than -re-created, and a transient existing-campaign fast-path lookup error does NOT -fail the dispatch — it falls through to `ClaimCampaignDispatch`, whose atomic -claim safely either claims-and-dispatches or reuses the conflicting row, so a -duplicate is avoided without failing on the transient error. Replacing a brief's +re-created. The idempotency fast-path lookup (`GetCampaignByPlatform`) +distinguishes its outcomes: an existing campaign with an upstream id short-circuits +to reuse; `ErrNotFound` (no row yet) falls through to `ClaimCampaignDispatch`; but a +REAL DB error (anything else) is surfaced as a platform failure (logged at ERROR) +rather than silently treated like "no existing campaign" — proceeding to +claim/dispatch when an existing campaign merely couldn't be loaded could duplicate an +upstream create, so it fails loud instead. Replacing a brief's content resets it to `draft` (re-approval required). Optimistic concurrency is enforced via version/If-Match (`428` when missing, `412` on mismatch). diff --git a/docs/knowledge/log.md b/docs/knowledge/log.md index 920aba16..86b13fb8 100644 --- a/docs/knowledge/log.md +++ b/docs/knowledge/log.md @@ -2,6 +2,16 @@ ## 2026-07-20 +**Update** — Idempotency-lookup errors no longer silently fall through to dispatch +(PR #11 review, cursor Medium). In `dispatchPlatform`, the fast path treated ANY +non-nil error from `GetCampaignByPlatform` like "no row" and fell through to +claim/dispatch — so a transient/real DB failure that hid an existing campaign could +trigger a duplicate upstream create, with no log/signal. Now the outcomes are +distinguished: existing-with-upstream-id → reuse; `ErrNotFound` → fall through to the +claim; any OTHER error → surface as a platform failure (logged ERROR), not a blind +dispatch. Corrected the concept doc, which had documented the old swallow-the-error +behavior as intentional. Test added (`TestOrchestrator_IdempotencyLookupErrorIsFailure`). + **Update** — Addressed dealako's 4 [minor] review items on PR #11 (LFXV2-2626). (1) `GetCampaignByPlatform` was the one campaign_repo method not scoped by project_id — added a `projectID` param + `AND project_id=$3` (matching diff --git a/internal/service/orchestrator.go b/internal/service/orchestrator.go index f914b4bb..e26b4ef5 100644 --- a/internal/service/orchestrator.go +++ b/internal/service/orchestrator.go @@ -464,11 +464,27 @@ func (o *Orchestrator) dispatchPlatform(ctx context.Context, jobID string, brief // Fast path: if this pair already has a completed campaign (upstream id set), // reuse it — idempotent, and valid even if no dispatcher is registered for the - // platform anymore. - if existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ProjectID, brief.ID, p); lerr == nil && existing.PlatformCampaignID != "" { + // platform anymore. A real DB error here (anything other than "no such row") must + // NOT be swallowed as "no existing campaign": proceeding to claim/dispatch when an + // existing campaign simply couldn't be loaded risks a duplicate upstream create. + // Only ErrNotFound is a clean "nothing yet, proceed". + existing, lerr := o.campaigns.GetCampaignByPlatform(ctx, brief.ProjectID, brief.ID, p) + switch { + case lerr == nil && existing.PlatformCampaignID != "": res.OK = true res.CampaignID = existing.PlatformCampaignID return res + case lerr == nil: + // A row exists but has no upstream id yet (a prior pending/failed attempt) — + // fall through to the claim path, which reconciles it. + case errors.Is(lerr, domain.ErrNotFound): + // No campaign for this pair yet — fall through to claim/dispatch. + default: + // A transient/real DB failure — surface it as a platform failure rather than + // dispatching blind (which could duplicate an existing-but-unloaded campaign). + slog.ErrorContext(ctx, "idempotency lookup failed", "platform", p, "job_id", jobID, "error", lerr) + res.Error = "could not check for an existing campaign" + return res } // Resolve the dispatcher BEFORE claiming: a "no dispatcher" outcome must not diff --git a/internal/service/orchestrator_test.go b/internal/service/orchestrator_test.go index 40e9d564..302fdb9d 100644 --- a/internal/service/orchestrator_test.go +++ b/internal/service/orchestrator_test.go @@ -368,6 +368,35 @@ func TestOrchestrator_ClaimErrorIsFailure(t *testing.T) { } } +// TestOrchestrator_IdempotencyLookupErrorIsFailure verifies that a REAL DB error +// from the idempotency lookup (GetCampaignByPlatform) — anything other than +// ErrNotFound — is surfaced as a platform failure and the dispatcher is never +// called. Otherwise a transient read failure would be treated like "no existing +// campaign" and dispatch could duplicate an existing-but-unloaded campaign. +func TestOrchestrator_IdempotencyLookupErrorIsFailure(t *testing.T) { + jobs := newFakeJobRepo() + camps := &fakeCampaignRepo{byPlatformErr: errors.New("db connection reset")} + disp := &countingDispatcher{} + orch := NewOrchestrator(camps, jobs, map[model.Provider]PlatformDispatcher{ + model.ProviderGoogleAds: disp, + }) + brief := &model.CampaignBrief{ID: "b1", ProjectID: "cncf"} + id, _ := orch.Start(context.Background(), brief, brief.Version, []model.Provider{model.ProviderGoogleAds}, nil) + j := waitForTerminal(t, jobs, id) + if j.Status != model.JobFailed { + t.Errorf("status = %s, want failed", j.Status) + } + disp.mu.Lock() + calls := disp.calls + disp.mu.Unlock() + if calls != 0 { + t.Errorf("Dispatch called %d times, want 0 (a lookup error must not fall through to dispatch)", calls) + } + if len(camps.upserted) != 0 { + t.Errorf("upserted %d campaigns, want 0 (no create on a lookup error)", len(camps.upserted)) + } +} + // TestOrchestrator_AlreadyClaimedPendingSkips verifies that when another worker // holds the pending claim (no upstream id yet), this worker does not dispatch and // the skip is NOT recorded as a terminal failure: a single skipped platform is a